Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

added prerequisites and communication intensive attributes

  • Loading branch information...
commit c4b7b03e3d07e5bfb382f6ac37b96242070646b3 1 parent a814d79
David Hedin authored
2  api/tests.py
View
@@ -292,6 +292,8 @@ def to_dict(self, obj):
u"max_credits": obj.max_credits,
u"grade_type": obj.grade_type,
u"description": obj.description,
+ u"prereqs": obj.prereqs,
+ u"is_comm_intense": obj.is_comm_intense,
u"id": obj.id,
}
23 courses/bridge/rpi.py
View
@@ -102,7 +102,12 @@ def sync(self, get_files=None, get_catalog=None):
def create_courses(self, catalog, semester_obj):
"Inserts all the course data, including section information, into the database from the catalog."
+ list = self.add_comm_intense(catalog, semester_obj)
for course in catalog.get_courses():
+ comm = False
+ for course_name in list:
+ if course.name == course_name:
+ comm = True
course_obj, created = Course.objects.get_or_create(
number=course.num,
department=self.get_or_create_department(semester_obj, code=course.dept, name=course.full_dept),
@@ -110,18 +115,33 @@ def create_courses(self, catalog, semester_obj):
name=course.name,
min_credits=course.cred[0],
max_credits=course.cred[1],
- grade_type=course.grade_type
+ grade_type=course.grade_type,
+ is_comm_intense=comm,
)
)
if not created:
#course_obj.name = course.name
course_obj.min_credits, course_obj.max_credits = course.cred
course_obj.grade_type = course.grade_type
+ course_obj.is_comm_intense = comm
course_obj.save()
OfferedFor.objects.get_or_create(course=course_obj, semester=semester_obj)
self.create_sections(course, course_obj, semester_obj)
logger.debug((' + ' if created else ' ') + course.name)
+ def add_comm_intense(self, catalog, semester):
+ from rpi_courses import get_comm_file
+ pdf = get_comm_file(semester)
+ list = []
+ crns = re.findall(r"\d{5}\s[A-Z]{4}", pdf)
+ print "Found " + str(len(crns)) + " communication intensive sections"
+ for i in crns:
+ course = catalog.find_course_by_crn(int(i.split()[0]))
+ if (course != None):
+ print course.name
+ list.append(course.name)
+ return list
+
def create_sections(self, course, course_obj, semester_obj):
"Inserts all section data, including time period information, into the database from the catalog."
for section in course.sections:
@@ -320,6 +340,7 @@ def import_catalog(a=False):
if 'description' in catalog[key].keys() and catalog[key]['description'] != "":
c.description = catalog[key]['description']
c.name = catalog[key]['title']
+ c.prereqs = catalog[key]['prereqs']
c.save()
# uses >1GB of ram - currently unacceptable
#add_cross_listing()
101 courses/migrations/0015_auto__add_field_course_prereqs.py
View
@@ -0,0 +1,101 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Course.prereqs'
+ db.add_column('courses_course', 'prereqs', self.gf('django.db.models.fields.TextField')(default=''), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Course.prereqs'
+ db.delete_column('courses_course', 'prereqs')
+
+
+ models = {
+ 'courses.course': {
+ 'Meta': {'ordering': "['department__code', 'number']", 'unique_together': "(('name', 'department', 'number'),)", 'object_name': 'Course'},
+ 'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'courses'", 'to': "orm['courses.Department']"}),
+ 'description': ('django.db.models.fields.TextField', [], {'default': "''"}),
+ 'grade_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '150', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'max_credits': ('django.db.models.fields.IntegerField', [], {}),
+ 'min_credits': ('django.db.models.fields.IntegerField', [], {}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'number': ('django.db.models.fields.IntegerField', [], {}),
+ 'prereqs': ('django.db.models.fields.TextField', [], {'default': "''"}),
+ 'semesters': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'courses'", 'symmetrical': 'False', 'through': "orm['courses.OfferedFor']", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.department': {
+ 'Meta': {'ordering': "['code']", 'object_name': 'Department'},
+ 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '200', 'blank': 'True'}),
+ 'semesters': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'departments'", 'symmetrical': 'False', 'through': "orm['courses.SemesterDepartment']", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.offeredfor': {
+ 'Meta': {'unique_together': "(('course', 'semester'),)", 'object_name': 'OfferedFor'},
+ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'offered_for'", 'to': "orm['courses.Course']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'offers'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.period': {
+ 'Meta': {'unique_together': "(('start', 'end', 'days_of_week_flag'),)", 'object_name': 'Period'},
+ 'days_of_week_flag': ('django.db.models.fields.IntegerField', [], {}),
+ 'end': ('django.db.models.fields.TimeField', [], {'default': 'None', 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start': ('django.db.models.fields.TimeField', [], {'default': 'None', 'null': 'True'})
+ },
+ 'courses.section': {
+ 'Meta': {'ordering': "['number']", 'object_name': 'Section'},
+ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sections'", 'to': "orm['courses.Course']"}),
+ 'crn': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}),
+ 'crosslisted': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sections'", 'null': 'True', 'to': "orm['courses.SectionCrosslisting']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'notes': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'number': ('django.db.models.fields.CharField', [], {'max_length': '5'}),
+ 'periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'sections'", 'symmetrical': 'False', 'through': "orm['courses.SectionPeriod']", 'to': "orm['courses.Period']"}),
+ 'seats_taken': ('django.db.models.fields.IntegerField', [], {}),
+ 'seats_total': ('django.db.models.fields.IntegerField', [], {}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sections'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.sectioncrosslisting': {
+ 'Meta': {'object_name': 'SectionCrosslisting'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ref': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_crosslistings'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.sectionperiod': {
+ 'Meta': {'unique_together': "(('period', 'section', 'semester'),)", 'object_name': 'SectionPeriod'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'instructor': ('django.db.models.fields.CharField', [], {'max_length': '150', 'blank': 'True'}),
+ 'kind': ('django.db.models.fields.CharField', [], {'max_length': '75'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '150', 'blank': 'True'}),
+ 'period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_times'", 'to': "orm['courses.Period']"}),
+ 'section': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_times'", 'to': "orm['courses.Section']"}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_times'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.semester': {
+ 'Meta': {'ordering': "['-year', '-month']", 'unique_together': "(('year', 'month'),)", 'object_name': 'Semester'},
+ 'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'month': ('django.db.models.fields.IntegerField', [], {}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'ref': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '150'}),
+ 'year': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'courses.semesterdepartment': {
+ 'Meta': {'unique_together': "(('department', 'semester'),)", 'object_name': 'SemesterDepartment'},
+ 'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['courses.Department']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['courses.Semester']"})
+ }
+ }
+
+ complete_apps = ['courses']
102 courses/migrations/0016_auto__add_field_course_is_comm_intense.py
View
@@ -0,0 +1,102 @@
+# encoding: utf-8
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Adding field 'Course.is_comm_intense'
+ db.add_column('courses_course', 'is_comm_intense', self.gf('django.db.models.fields.BooleanField')(default=False), keep_default=False)
+
+
+ def backwards(self, orm):
+
+ # Deleting field 'Course.is_comm_intense'
+ db.delete_column('courses_course', 'is_comm_intense')
+
+
+ models = {
+ 'courses.course': {
+ 'Meta': {'ordering': "['department__code', 'number']", 'unique_together': "(('name', 'department', 'number'),)", 'object_name': 'Course'},
+ 'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'courses'", 'to': "orm['courses.Department']"}),
+ 'description': ('django.db.models.fields.TextField', [], {'default': "''"}),
+ 'grade_type': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '150', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_comm_intense': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'max_credits': ('django.db.models.fields.IntegerField', [], {}),
+ 'min_credits': ('django.db.models.fields.IntegerField', [], {}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ 'number': ('django.db.models.fields.IntegerField', [], {}),
+ 'prereqs': ('django.db.models.fields.TextField', [], {'default': "''"}),
+ 'semesters': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'courses'", 'symmetrical': 'False', 'through': "orm['courses.OfferedFor']", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.department': {
+ 'Meta': {'ordering': "['code']", 'object_name': 'Department'},
+ 'code': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '200', 'blank': 'True'}),
+ 'semesters': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'departments'", 'symmetrical': 'False', 'through': "orm['courses.SemesterDepartment']", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.offeredfor': {
+ 'Meta': {'unique_together': "(('course', 'semester'),)", 'object_name': 'OfferedFor'},
+ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'offered_for'", 'to': "orm['courses.Course']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'offers'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.period': {
+ 'Meta': {'unique_together': "(('start', 'end', 'days_of_week_flag'),)", 'object_name': 'Period'},
+ 'days_of_week_flag': ('django.db.models.fields.IntegerField', [], {}),
+ 'end': ('django.db.models.fields.TimeField', [], {'default': 'None', 'null': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'start': ('django.db.models.fields.TimeField', [], {'default': 'None', 'null': 'True'})
+ },
+ 'courses.section': {
+ 'Meta': {'ordering': "['number']", 'object_name': 'Section'},
+ 'course': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sections'", 'to': "orm['courses.Course']"}),
+ 'crn': ('django.db.models.fields.IntegerField', [], {'unique': 'True'}),
+ 'crosslisted': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sections'", 'null': 'True', 'to': "orm['courses.SectionCrosslisting']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'notes': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'number': ('django.db.models.fields.CharField', [], {'max_length': '5'}),
+ 'periods': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'sections'", 'symmetrical': 'False', 'through': "orm['courses.SectionPeriod']", 'to': "orm['courses.Period']"}),
+ 'seats_taken': ('django.db.models.fields.IntegerField', [], {}),
+ 'seats_total': ('django.db.models.fields.IntegerField', [], {}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'sections'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.sectioncrosslisting': {
+ 'Meta': {'object_name': 'SectionCrosslisting'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ref': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '200'}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_crosslistings'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.sectionperiod': {
+ 'Meta': {'unique_together': "(('period', 'section', 'semester'),)", 'object_name': 'SectionPeriod'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'instructor': ('django.db.models.fields.CharField', [], {'max_length': '150', 'blank': 'True'}),
+ 'kind': ('django.db.models.fields.CharField', [], {'max_length': '75'}),
+ 'location': ('django.db.models.fields.CharField', [], {'max_length': '150', 'blank': 'True'}),
+ 'period': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_times'", 'to': "orm['courses.Period']"}),
+ 'section': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_times'", 'to': "orm['courses.Section']"}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'section_times'", 'to': "orm['courses.Semester']"})
+ },
+ 'courses.semester': {
+ 'Meta': {'ordering': "['-year', '-month']", 'unique_together': "(('year', 'month'),)", 'object_name': 'Semester'},
+ 'date_updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'month': ('django.db.models.fields.IntegerField', [], {}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'ref': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '150'}),
+ 'year': ('django.db.models.fields.IntegerField', [], {})
+ },
+ 'courses.semesterdepartment': {
+ 'Meta': {'unique_together': "(('department', 'semester'),)", 'object_name': 'SemesterDepartment'},
+ 'department': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['courses.Department']"}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'semester': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'+'", 'to': "orm['courses.Semester']"})
+ }
+ }
+
+ complete_apps = ['courses']
6 courses/models.py
View
@@ -209,7 +209,6 @@ class Section(models.Model):
seats_taken = models.IntegerField()
seats_total = models.IntegerField()
-
# TODO: RPI Specific; provide alternative
notes = models.TextField(blank=True)
@@ -304,7 +303,8 @@ class Course(models.Model):
max_credits = models.IntegerField()
grade_type = models.CharField(max_length=150, blank=True, default='')
-
+ prereqs = models.TextField(default="")
+ is_comm_intense = models.BooleanField()
objects = managers.QuerySetManager(managers.CourseQuerySet)
class Meta:
@@ -336,6 +336,8 @@ def toJSON(self, select_related=()):
'min_credits': self.min_credits,
'max_credits': self.max_credits,
'description': self.description,
+ 'prereqs': self.prereqs,
+ 'is_comm_intense': self.is_comm_intense,
}
if has_model(select_related, Department):
values['department'] = self.department.toJSON(select_related)
3  courses/tests/factories.py
View
@@ -63,6 +63,9 @@ class CourseFactory(factory.Factory):
max_credits = 4
grade_type = ''
+ prereqs = ''
+ is_comm_intense = False
+
class OfferedForFactory(factory.Factory):
FACTORY_FOR = models.OfferedFor
4 courses/tests/models.py
View
@@ -228,7 +228,7 @@ def test_no_conflicts_using_cache(self):
class CourseTest(TestCase):
def test_to_json(self):
course = CourseFactory.create(
- pk=1, name='foo', number=5050, min_credits=4, max_credits=5, description='foo',
+ pk=1, name='foo', number=5050, min_credits=4, max_credits=5, description='foo', prereqs='foo', is_comm_intense=True
)
expected = {
'id': 1,
@@ -237,6 +237,8 @@ def test_to_json(self):
'min_credits': 4,
'max_credits': 5,
'description': 'foo',
+ 'prereqs': 'foo',
+ 'is_comm_intense': True
}
self.assertEqual(expected, course.toJSON())
11 lib/catalogparser.py
View
@@ -45,7 +45,8 @@ def get_course_detail(course_page):
'department': title.group(1),
'num': title.group(2),
'title': title.group(3),
- 'description': get_course_description(soup.findAll('hr')[0].nextSibling)
+ 'description': get_course_description(soup.findAll('hr')[0].nextSibling),
+ 'prereqs': get_course_reqs(soup)
}
return course
@@ -59,6 +60,14 @@ def get_course_description(tag):
return ''.join(contents).strip()
+def get_course_reqs(tag):
+ if (tag.findAll('strong')):
+ current = tag.findAll('strong')[0]
+ if getattr(current, "text", current.string) == 'Prerequisites/Corequisites:':
+ return ''.join(current.nextSibling).strip()
+ return 'None'
+
+
def special(tags):
contents = re.findall('>??(.*?)<.*?>', tags)
return "".join(contents)
2  lib/rpi_courses/config.py
View
@@ -38,6 +38,8 @@ def emit(self, record):
# TODO: this may be good to parse (for textbooks)
HTML_URL = "http://sis.rpi.edu/stuclshr.htm"
+COMM_URL = "http://www.rpi.edu/dept/srfs/CI"
+
# it would be best to get this data from a reliable data source:
# like the course catalog: http://catalog.rpi.edu/content.php?catoid=10&navoid=232
# instead of manually entering this data.
2  lib/rpi_courses/models.py
View
@@ -267,7 +267,7 @@ class Course(ReadOnly):
def __init__(self, name, dept, num, credmin, credmax, grade_type, sections):
self._name, self._dept, self._num, self._cred, self._grade_type = \
name.strip(), dept.strip(), safeInt(num, warn_only=True), \
- (int(credmin), int(credmax)), grade_type.strip()
+ (int(credmin), int(credmax)), grade_type.strip(),
self._sections = tuple(sections)
self.__free_sections = None
self.__hash = None
33 lib/rpi_courses/web.py
View
@@ -3,11 +3,13 @@
"""
import urllib2
import datetime
+import tempfile
+import pyPdf
from contextlib import closing
from BeautifulSoup import BeautifulSoup
-from config import ROCS_URL, SIS_URL
+from config import ROCS_URL, SIS_URL, COMM_URL
def get(url, last_modified=None):
@@ -75,3 +77,32 @@ def is_xml(filename):
def list_rocs_xml_files(url=ROCS_URL):
"Gets all the xml files."
return list(filter(is_xml, list_rocs_files(url)))
+
+
+def get_comm_file(date, base_url=COMM_URL):
+ format = '%.4d.pdf'
+ if date.month == 9:
+ url = base_url + "Fall" + str(format % (date.year))
+ else:
+ url = base_url + "Spring" + str(format % (date.year))
+
+ req = urllib2.Request(url)
+ print "Getting communication intensive list from: " + url
+
+ try:
+ f = urllib2.urlopen(req)
+ temp = tempfile.NamedTemporaryFile()
+ temp.write(f.read())
+ temp.seek(0)
+ except urllib2.HTTPError, e:
+ print "HTTP Error:", e.code, url
+ except urllib2.URLError, e:
+ print "URL Error:", e.reason, url
+
+ full_text = ""
+ pdf = pyPdf.PdfFileReader(open(temp.name, 'rb'))
+ for page in pdf.pages:
+ full_text += page.extractText()
+
+ temp.close()
+ return full_text.strip()
1  requirements/deployment.txt
View
@@ -5,5 +5,6 @@ django-extensions==0.6
django-debug-toolbar==0.9.4
icalendar==3.0.1b2
py-bcrypt==0.2
+pyPdf==1.13
python-dateutil==1.5
wsgiref==0.1.2
1  requirements/development.txt
View
@@ -15,6 +15,7 @@ nose==1.1.2
pep8==0.7.0
psycopg2==2.4.4
py-bcrypt==0.2
+pyPdf==1.13
python-dateutil==1.5
pytz==2011n
sqlparse==0.1.3
1  yacs/settings/base.py
View
@@ -238,6 +238,7 @@ def transfer(self, dictionary):
'south',
'django_extensions',
'debug_toolbar',
+ 'pyPdf',
# local apps
'courses',
'scheduler',
6 yacs/settings/development.py
View
@@ -20,9 +20,9 @@ def debug_install_apps(s):
s.DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
- 'NAME': '',
- 'USER': '',
- 'PASSWORD': 'yacs2012',
+ 'NAME': 'mydata',
+ 'USER': 'postgreuser',
+ 'PASSWORD': 'postgre',
'HOST': 'localhost',
'PORT': '',
'OPTIONS': {
10 yacs/templates/courses/_course.html
View
@@ -41,6 +41,16 @@
{{ course.description }}
</div>
{% endif %}
+ {% if course.is_comm_intense %}
+ <div style="color:blue; font-style:italic;" class="comm intense description">
+ {{ "Communication Intensive" }}
+ </div>
+ {% endif %}
+ {% if course.prereqs != "None" %}
+ <div style="font-weight:bold;" class="prerequisites description">
+ {{ course.prereqs }}
+ </div>
+ {% endif %}
<div class="kinds">
<ul>
{% for kind in course.kinds %}
Please sign in to comment.
Something went wrong with that request. Please try again.