Example #1
0
def create_course():
    try:
        print('创建课程'.center(60, '='))
        school_list = School.get_all_obj_list()
        for k, obj in enumerate(school_list):
            print(k, obj['name'], obj['addr'])
        id = int(input('请选择学校: '))
        school_obj = school_list[id]
        #print(school_obj,school_obj ['nid'] )

        name = input('请输入课程名: ').strip()
        price = input('请输入课程价格: ').strip()
        period = input('请输入课程周期: ').strip()

        course_name_list = [(obj['name'], obj['school_nid'])
                            for obj in Course.get_all_obj_list()]
        if name in course_name_list:
            raise Exception('\033[43;1m课程[%s] 已经存在,不可重复创建\033[0m' % (name))
        obj = Course(name, price, period, school_obj['nid'])
        obj.save()
        status = True
        error = ''
        data = '\033[33;1m课程[%s] 价格[%s] 周期[%s]创建成功\033[0m' % (
            obj.name, obj.price, obj.period)
        print(data)
    except Exception as e:
        status = False
        error = str(e)
        print('error: %s' % error)
        data = ''
    return {'status': status, 'error': error, 'data': data}
Example #2
0
 def put(self, course_uuid):
     """
     Upsert the course with the specified ID
     """
     edit_course = Course(**api.payload)
     edit_course.uuid = course_uuid
     edit_course.save()
Example #3
0
def addCourse(request):
    # Retrieve the course data input by the user
    courseId = request.POST['course_id']
    courseName = request.POST['course']
    subject = request.POST['subject']
    prof = (request.POST['firstname'], request.POST['lastname'])

    # check to see if course already exists. If so, redirect to it
    try:
        theCourse = Course.objects.get(courseID=courseId)
        return HttpResponseRedirect('/viewcourse/' + courseId)
    except:
        # Add the new course to the database
        newCourse = Course(courseID=courseId, name=courseName, subject=subject)
        newCourse.save()

        # see if the input prof exists, if not then create it
        try:
            profs = Professor.objects.get(first_name=prof[0],
                                          last_name=prof[1])
            profs.addCourse(newCourse)
            profs.save()
        except:
            newProf = Professor(first_name=prof[0],
                                last_name=prof[1],
                                subject=subject)
            newProf.save()
            newProf.addCourse(newCourse)
            newProf.save()

        return HttpResponseRedirect('/viewcourse/' + courseId)
    def handle(self, *args, **options):
        courses = "1000 JOURNALISM, 5200 GEOMETRY CP, 1030 JOURNALISM II, 5250 GEOMETRY H, 1060 ADVANCED JOURNALISM, 5300 ALGEBRA II CP, 1200 TV PRODUCTION I, 5350 ALGEBRA II/TRIG H, 1230 TV PRODUCTION II, 5400 PRECALCULUS CP, 1260 TV PRODUCTION III, 5450 (H) PRECALCULUS, 1350 BROADCAST & MEDIA STUDIES, 5500 STATISTICS, 1510 COMPUTER APPLICATIONS, 5550 TRIGONOMETRY, 1600 WEB DESIGN & DEV, 5600 CALCULUS, 1660 GRAPHIC DESIG & MOTION, 5650 AP CALCULUS AB, 2100 ENGLISH I CP, 5700 AP CALCULUS BC, 2150 ENGLISH I H, 5800 AP STATISTICS, 2200 ENGLISH II CP, 7110 REV OF JESUS, 2250 ENGLISH II H, 7160 WHO IS JESUS, 2300 ENGLISH III, 7200 HEBREW SCRIPTURES, 2350 AP LANGUAGE, 7250 NEW TESTAMENT, 2400 ENGLISH IV, 7300 CHRISTIAN MORAL PRINCIPLE, 2450 AP LITERATURE, 7350 JUSTICE & PEACE, 3555 FRESHMAN ACTING, 7450 CHRISTIAN LIFESTYLES, 3600 ACTING I, 7475 CHRISTIAN LEADERSHIP, 3650 ACTING II, 7500 WORLD RELIGIONS - WESTERN, 3700 ACTING III, 7525 WORLD RELIGIONS - EASTERN, 3775 FILM ACTING, 8200 BIOLOGY CP, 3820/3840 PLAY PROD/ PLAY WRI, 8250 BIOLOGY H, 3975 PHOTOGRAPHY I, 8280 HUMAN ANATOMY & PHYSIOLOG, 3980 PHOTOGRAPHY II, 8290 AP BIOLOGY, 4000 SPANISH I, 8300 CHEMISTRY CP, 4025 SPANISH I FOR NS, 8325 CHEMISTRY H, 4100 SPANISH II, 8350 AP CHEMISTRY, 4150 SPANISH II HONORS, 8400 PHYSICS CP, 4200 SPANISH III, 8450 AP PHYSICS C: MECHANICS, 4250 SPANISH III HONORS, 8600 SPORTS MEDICINE, 4300 SPANISH IV, 8650 ADV SPORTS MEDICINE, 4350 AP SPANISH LANGUAGE, 9100 WORLD GEOGRAPHY, 4500 FRENCH I, 9210 WORLD HISTORY, 4525 FRENCH II, 9250 AP EUROPEAN HISTORY, 4550 FRENCH III, 9300 U.S. HISTORY CP, 4575 AP FRENCH LANGUAGE, 9350 AP U.S. HISTORY, 4700 LATIN I, 9400 GOVERNMENT CP, 4725 LATIN II, 9450 ECONOMICS CP, 4750 LATIN III, 9550 AP SENIOR SOCIAL STUDIES, 4800 JAPANESE I, 9560 AP GOVT / H ECON, 4825 JAPANESE II, 9625 LAW & SOCIETY, 4850 JAPANESE III, 9650 PSYCHOLOGY OF PREJUDICE, 4875 AP JAPANESE IV, 9675 SOCIOLOGY, 5100 ALGEBRA I CP, 9700 PSYCHOLOGY, 5150 ALGEBRA I H".split(", ")

        Course.objects.all().delete()
        self.stdout.write('Cleared the database.\n')

        for course in courses:
            number, name = course[:4], course[5:]
            new_course = Course()
            new_course.number = int(number)
            new_course.name = name
            new_course.save()

            self.stdout.write('Successfully added %s %s.\n' % (number, name))
Example #5
0
def show_course():
    for obj in Course.get_all_obj_list():
        # print(obj)

        print('\033[33;1m[%s] [%s]校区 [%s]课程 价格[%s] 周期[%s]\033[0m'.center(60,'-') \
     %(obj['school_nid'].get_obj_by_uuid(settings.SCHOOL_DB_DIR)['name'],obj['school_nid'].get_obj_by_uuid(settings.SCHOOL_DB_DIR)['addr'],\
    obj['name'],obj['price'],obj['period']))
Example #6
0
 def get(self, course_uuid):
     """
     Retrieve a course by ID
     """
     course = Course.objects(uuid=course_uuid).first()
     if not course:
         api.abort(404)
     return course
Example #7
0
def create_course():
    try:
        print('创建课程'.center(60, '='))
        school_list = School.get_all_obj_list()
        for k, obj in enumerate(school_list):
            print(k, obj.name, obj.addr)
        sid = input("请选择学校: ").strip()
        if sid.isdigit():
            sid = int(sid)
            if sid >= len(school_list):
                raise Exception("输入的学校不存在")
        else:
            raise Exception("输入的学校不存在")

        school_obj = school_list[sid]
        name = input("请输入课程名称: ").strip()
        price = input("请输入课程费用: ").strip()
        if name == '' or price == '':
            raise Exception("输入不能为空")
        if price.replace('.', '', 1).isdigit():
            pass
        else:
            raise Exception("课程费用应该是数字")
        period = input("请输入课程周期: ").strip()
        if period == '':
            raise Exception("输入不能为空")

        course_name_list = [(obj.name, obj.school_nid.nid)
                            for obj in Course.get_all_obj_list()]
        if (name, school_obj.nid.nid) in course_name_list:
            raise Exception('\033[43;1m课程[%s] 已经存在,不可重复创建\033[0m' % (name))
        obj = Course(name, price, period, school_obj.nid)
        obj.save()
        status = True
        error = ''
        data = '\033[33;1m课程[%s] 价格[%s] 周期[%s]创建成功\033[0m' % (
            obj.name, obj.price, obj.period)
    except Exception as e:
        status = False
        error = str(e)
        data = ''
    return {'status': status, 'error': error, 'data': data}
Example #8
0
 def handle(self, *args, **options):
     df = pd.read_csv(sys.argv[3])
     courses = [
         Course(
             id=df['id'][row],
             name=df['name'][row],
     ) for row in range(0, 9)
     ]
     courses = Course.objects.bulk_create(courses)
     if courses:
         self.stdout.write('Successfully loaded Courses..')
Example #9
0
    def handle(self, *args, **options):

        fake = Faker()
        fake.add_provider(person)
        fake.add_provider(profile)
        fake.add_provider(lorem)
        fake.add_provider(company)

        for _ in range(60):
            profile_data = fake.simple_profile()
            CustomUser.objects.create_user(
                profile_data['username'],
                profile_data['mail'],
                ''.join(
                    random.choice(string.ascii_letters) for _ in range(10)),
                first_name=fake.first_name(),
                last_name=fake.last_name())
        teachers = CustomUser.objects.all()[:10]
        students = CustomUser.objects.all()[10:]
        for i in range(10):
            course = Course(name=fake.bs(),
                            code=''.join(
                                random.choice(string.ascii_letters)
                                for _ in range(2)),
                            responsibleTeacher=teachers[i])
            course.save()

            random_student_ids = random.sample(
                list(students.values_list('id', flat=True)), 20)
            qs = CustomUser.objects.filter(id__in=random_student_ids)

            course.students.add(*qs)
            for student in qs:
                Grade(value=random.randint(10, 100) / 10,
                      course=course,
                      user=student).save()

        self.stdout.write(self.style.SUCCESS('Generated new users'))
Example #10
0
def create_course_to_teacher():
    try:
        teacher_list = Teacher.get_all_obj_list()
        for k, obj in enumerate(teacher_list):
            print(k, obj.name)
        t_sid = input("请选择老师:")
        if t_sid.isdigit():
            t_sid = int(t_sid)
            if t_sid >= len(teacher_list):
                raise Exception("选择的老师不在此任教")
        else:
            raise Exception("选择的老师不在此任教")
        teacher_obj = teacher_list[t_sid]

        course_list = Course.get_all_obj_list()
        for k, obj in enumerate(course_list):
            print(k, obj.name)
        c_sid = input("\n请选择关联课程: ")
        if c_sid.isdigit():
            c_sid = int(c_sid)
            if c_sid >= len(course_list):
                raise Exception("没有该课程")
        else:
            raise Exception("没有该课程")
        course_obj = course_list[c_sid]

        course_to_teacher_list = [
            (obj.course_nid, obj.school_nid, obj.teacher_nid)
            for obj in Course_to_teacher.get_all_obj_list()
        ]
        if (course_obj.nid, course_obj.school_nid,
                teacher_obj.nid) in course_to_teacher_list:
            raise Exception('\033[43;1m课程[%s] 与老师[%s],不可重复关联\033[0m' %
                            (course_obj.name, teacher_obj.name))
        obj = Course_to_teacher(course_obj.nid, course_obj.school_nid,
                                teacher_obj.nid)
        obj.save()
        status = True
        error = ''
        data = '\033[33;1m课程[%s] 与老师[%s]关联成功\033[0m' % (
            (course_obj.name,
             course_obj.school_nid.get_obj_by_nid().name), teacher_obj.name)
    except Exception as e:
        status = False
        error = str(e)
        data = ''
    return {'status': status, 'error': error, 'data': data}
Example #11
0
	def course_search(self, courseCode):
		"""
		Returns all known sections of the specified course. Each section in the
		returned dictionary is unique.
		"""
		namespace = 'course-search'
		cacheTime = 60 # Cache course search results for one minute
		cached = memcache.get(courseCode, namespace)
		if cached:
			return cached

		courses = Course.all()
		courses.filter('courseCode =', courseCode)
		courses = self._make_sections_unique(courses)

		courseDict = self._build_course_dict(courses)
		memcache.set(courseCode, courseDict, namespace=namespace, time=cacheTime)
		return courseDict
	def safely_delete(self, schedule):
		profile = profiles.get_user_profile_from_ds()

		# Simply comparing the two schedules themselves doesn't work
		# so we compare their keys
		if profile.currentSchedule.key() == schedule.key():
			logging.info('Deleted current schedule "' + schedule.name + '"')
			profile.currentSchedule = None
			profile.put()

		# Delete all courses in this schedule
		courses = Course.all().ancestor(schedule)
		for course in courses:
			course.delete()
		# Unshare this schedule from everyone
		records = ShareRecord.all().ancestor(schedule)
		for sharing in records:
			sharing.delete()
		schedule.delete()
Example #13
0
def register_course(request):
#    import pdb
#    pdb.set_trace()
    if request.method == "POST" and request.is_ajax():
        name = request.POST.get('name', False)

        if len(name) < 5:
            return HttpResponse(short_name_message)
        #check database for any courses with this name
        courses = Course.objects.filter(name=name)
        if len(courses) > 0:
            return HttpResponse(name_taken_message)
        else:
            course = Course()
            course.name = name
            current_user = WebUser.objects.filter(userId = request.user.id)[0]
            course.save()
            course.teachers.add(current_user)
            #add lessons
            course.save()
            createCourseLessons(course)
            return HttpResponse(success_message)
Example #14
0
def create_course_to_teacher():
    try:
        print('关联教师与课程'.center(60, '='))
        teacher_list = Teacher.get_all_obj_list()
        for k, obj in enumerate(teacher_list):
            print('%s 老师[%s] 级别[%s]' % (k, obj['name'], obj['level']))
        id = int(input('请选择教师: '))
        teacher_obj = teacher_list[id]
        #print(teacher_obj,teacher_obj['nid'] )

        course_list = Course.get_all_obj_list()
        for k, obj in enumerate(course_list):
            print('%s [%s][%s]校区 [%s]课程 价格[%s] 周期[%s]'.center(60, '-') \
      % (k,obj['school_nid'].get_obj_by_uuid(settings.SCHOOL_DB_DIR )['name'],\
                     obj['school_nid'].get_obj_by_uuid(settings.SCHOOL_DB_DIR)['addr'], \
      obj['name'], obj['price'], obj['period']))
        id = int(input('请选择课程: '))
        course_obj = course_list[id]
        #print(course_obj )
        obj = Course_to_teacher(course_obj['nid'], course_obj['school_nid'],
                                teacher_obj['nid'])

        obj.save()
        status = True
        error = ''
        data = '\033[33;1m[%s][%s]校区 [%s]课程 关联 教师[%s] 关联成功\033[0m' %(obj.school_nid.get_obj_by_uuid(settings.SCHOOL_DB_DIR )['name'],\
                                                                     obj.school_nid.get_obj_by_uuid(settings.SCHOOL_DB_DIR)['addr'],\
                                                                    course_obj['name'],teacher_obj['name'])
        print(data)

    except Exception as e:
        status = False
        error = str(e)
        print('error: %s' % error)
        data = ''
    return {'status': status, 'error': error, 'data': data}
	def update_courses(self, schedule, courseDict):
		# Get all courses in datastore
		# For each course submitted, overwrite a course from the datastore with it.
		# If there are not enough courses in the datastore, create new ones.
		# If there are leftover courses, delete them.
		query = Course.all()
		query.ancestor(schedule)
		fromDatastore = []
		coursesToPut = []
		
		for course in query:
			fromDatastore.append(course)
	
		for courseData in courseDict:
			# Courses should belong to their schedule's entity group
			course = self.safePop(fromDatastore) or Course(parent=schedule)
			course.owner = users.get_current_user()
			course.schedule = schedule

			course.update_from_coursedata(courseData)
			coursesToPut.append(course)

		# The courses left in fromDatastore should be deleted
		return coursesToPut, fromDatastore
Example #16
0
def show_course():
    for obj in Course.get_all_obj_list():
        print('\033[33;1m[%s] [%s]校区 [%s]课程 价格[%s] 周期[%s]\033[0m'.center(60, '-') \
              % (obj.school_nid.get_obj_by_nid().name, obj.school_nid.get_obj_by_nid().addr, \
                 obj.name, obj.price, obj.period))
Example #17
0
 def delete(self, course_uuid):
     Course.objects(uuid=course_uuid).delete()
Example #18
0
def _get_parsed_schedule_param(param_collection) -> ScheduleParam:
    def _str_to_array(str_values):
        values = []
        for i in str_values.split(","):
            if i != '':
                values.append(int(i))
        return array(values)

    ROOMS, TIMESLOTS, COURSES, INSTRUCTORS, COURSE_GROUPS = param_collection
    all_theory_courses = list(filter(lambda x: x[4] == "Theory", COURSES))
    all_theory_course_indices = [c[0] for c in all_theory_courses]

    # Rooms - col 3: allowed_courses
    for i in range(len(ROOMS)):
        allowed_course_idxs = ROOMS[i][3]
        if allowed_course_idxs == "ALL_THEORY":
            allowed_course_idxs = all_theory_course_indices
        elif allowed_course_idxs[:4] == "NOT:":
            not_allowed_courses = [
                int(i) for i in allowed_course_idxs[4:].split(',')
            ]
            allowed_course_idxs = []
            for c in range(len(COURSES)):
                if c not in not_allowed_courses:
                    allowed_course_idxs.append(c)
        else:
            allowed_course_idxs = [
                int(i) for i in allowed_course_idxs.split(',')
            ]
        ROOMS[i][3] = allowed_course_idxs

    # Instructors - col 2, 3
    for i in range(len(INSTRUCTORS)):
        INSTRUCTORS[i][2] = _str_to_array(INSTRUCTORS[i][2])
        INSTRUCTORS[i][3] = _str_to_array(INSTRUCTORS[i][3])

    # CourseGroups - col 2, 3
    for i in range(len(COURSE_GROUPS)):
        COURSE_GROUPS[i][2] = _str_to_array(COURSE_GROUPS[i][2])
        COURSE_GROUPS[i][3] = _str_to_array(COURSE_GROUPS[i][3])
    '''
    NOTE: the following sanity check can be deduced: (if NUM_OF_LECS_BEING_OFFERED > MAX_LECS_THAT_CAN_BE_OFFERED)
    '''

    for i in range(len(TIMESLOTS)):
        if TIMESLOTS[i][3] == '-':
            TIMESLOTS[i][3] = []
        elif len(TIMESLOTS[i][3]) == 1:
            TIMESLOTS[i][3] = [int(TIMESLOTS[i][3])]
        else:
            TIMESLOTS[i][3] = _str_to_array(TIMESLOTS[i][3])

    Rooms = [Room(r[0], r[1], r[2], r[3]) for r in ROOMS]
    Timeslots = [Timeslot(t[0], t[1], t[2], t[3]) for t in TIMESLOTS]
    Courses = [Course(c[0], c[1], c[2], c[3], c[4]) for c in COURSES]
    Instructors = [
        Instructor(i[0], i[1], i[2], i[3], i[4]) for i in INSTRUCTORS
    ]
    CourseGroups = [
        CourseGroup(cg[0], cg[1], cg[2], cg[3]) for cg in COURSE_GROUPS
    ]

    sections = _get_all_sections(Courses)
    daily_slots = _get_all_daily_slots(Timeslots)
    day_codes = _get_all_day_codes(Timeslots)

    return ScheduleParam(Rooms, Timeslots, Courses, Instructors, CourseGroups,
                         sections, daily_slots, day_codes)
Example #19
0
def main(args):
    """ Iterate through assistants and scrap their moodle """
    if len(args) < 1:
        todos = Assistant.objects.all()
    else:
        todos = []
        for a in args[1:]:
            try:
                assistant = Assistant.objects.get(pk=int(a))
                todos.append(assistant)
            except: 
                sys.stderr.write('Could not load assistant: %s' % a)
    
    # Execute todos
    for a in todos:
        if not a.is_updater:
            continue
        
        session = MoodleSession(str(a.moodle_url))
        session.set_verbosity(0)
        try:
            session.login(a.moodle_user, a.moodle_password)
        except LoginError:
            sys.stderr.write("Failed to connect.\n")
            sys.exit(1)
        
        if not session.answered("Overview of my courses"):
            sys.stderr.write("Unexpected page (%d bytes)\n" % len(session.body()))
            sys.exit(-2)
        else:
            course_id = int(a.moodle_course_id)
            try:
                course = Course.objects.get(external_id=course_id)
            except:
                courses = session.list_courses()
                course = None
                for c in courses:
                    if c[0] == course_id:
                        course = Course(external_id=course_id, title=c[1], name=''.join([chr[0] for chr in c[1].split(' ')]))
                        course.save()
                        break
                if course is None:
                    sys.stderr.write("Could not get course: %d " % course_id)
                    continue
                
            groups = session.list_groups(int(a.moodle_course_id))
            
            for key,g in groups.items():
                for user in g['users']:
                    try:
                        student = Student.objects.get(external_id=user[0])
                    except:
                        student = Student(external_id=user[0])
                        
                    if student.first_name != user[1] or \
                        student.avatar != user[2] or \
                        student.group != g['name']:
                            student.first_name = user[1]
                            student.avatar = user[2]
                            student.group = g['name']
                            student.save()
                            
                    if course.students.filter(id=student.id).count() == 0:
                        # Add student to course
                        course.students.add(student)
            # Assign the current assistant to the newly created course:
            a.courses.add(course)
            
            print "Updated course: ", a.moodle_course_id, " for ", a
Example #20
0
def main(args):
    """ Iterate through assistants and scrap their moodle """
    if len(args) < 1:
        todos = Assistant.objects.all()
    else:
        todos = []
        for a in args[1:]:
            try:
                assistant = Assistant.objects.get(pk=int(a))
                todos.append(assistant)
            except:
                sys.stderr.write('Could not load assistant: %s' % a)

    # Execute todos
    for a in todos:
        if not a.is_updater:
            continue

        session = MoodleSession(str(a.moodle_url))
        session.set_verbosity(0)
        try:
            session.login(a.moodle_user, a.moodle_password)
        except LoginError:
            sys.stderr.write("Failed to connect.\n")
            sys.exit(1)

        if not session.answered("Overview of my courses"):
            sys.stderr.write("Unexpected page (%d bytes)\n" %
                             len(session.body()))
            sys.exit(-2)
        else:
            course_id = int(a.moodle_course_id)
            try:
                course = Course.objects.get(external_id=course_id)
            except:
                courses = session.list_courses()
                course = None
                for c in courses:
                    if c[0] == course_id:
                        course = Course(
                            external_id=course_id,
                            title=c[1],
                            name=''.join([chr[0] for chr in c[1].split(' ')]))
                        course.save()
                        break
                if course is None:
                    sys.stderr.write("Could not get course: %d " % course_id)
                    continue

            groups = session.list_groups(int(a.moodle_course_id))

            for key, g in groups.items():
                for user in g['users']:
                    try:
                        student = Student.objects.get(external_id=user[0])
                    except:
                        student = Student(external_id=user[0])

                    if student.first_name != user[1] or \
                        student.avatar != user[2] or \
                        student.group != g['name']:
                        student.first_name = user[1]
                        student.avatar = user[2]
                        student.group = g['name']
                        student.save()

                    if course.students.filter(id=student.id).count() == 0:
                        # Add student to course
                        course.students.add(student)
            # Assign the current assistant to the newly created course:
            a.courses.add(course)

            print "Updated course: ", a.moodle_course_id, " for ", a
Example #21
0
def import_course(filename):
    with open(filename, 'rt', encoding='utf-8') as csvfile:
        reader = csv.reader(csvfile, delimiter=',')
        course_list = list(reader)
    for i in course_list[1:]:
        try:
            c = Course(code=i[0],
                       title=i[1],
                       topic=i[2],
                       type=i[3],
                       opening=i[4],
                       duration=i[5],
                       venue=i[6],
                       fee=i[7],
                       grant=i[8],
                       wsa=i[9],
                       remark=i[10],
                       overview=i[11],
                       outline=i[12],
                       testimonial=i[13],
                       upcoming=i[14],
                       hyperlink=i[15])
            c.save()
            print('Added: {}'.format(i[0]))
        except IntegrityError as e:
            if 'UNIQUE constraint failed: core_course.code' in e.args:
                c = Course.objects.get(code=i[0])
                c.title = i[1]
                c.topic = i[2]
                c.type = i[3]
                c.opening = i[4]
                c.duration = i[5]
                c.venue = i[6]
                c.fee = i[7]
                c.grant = i[8]
                c.wsa = i[9]
                c.remark = i[10]
                c.overview = i[11]
                c.outline = i[12]
                c.testimonial = i[13]
                c.upcoming = i[14]
                c.hyperlink = i[15]
                c.save()
                print('Updated: {}'.format(i[0]))
Example #22
0
def dummy_course():
    """
    Creates a dummy course
    """
    return Course(uuid='805acb1c-739c-4f4a-a529-3027c95f8c60',
                  title='Arithmetic')