예제 #1
0
파일: taevals.py 프로젝트: ucsb-cs/taevals
    def get(self, key, ta='', responses=None, success=None, errors=None):
        invite = EvalInvite.get_by_key_name(key)
        if not invite:
            return self.redirect('/')

        settings = Settings.get_by_key_name('settings')
        invite.expired = datetime.datetime.now() > settings.expire_date
        success = success or []
        errors = errors or []

        remaining = invite.remaining_evals()
        if not remaining and not invite.tas:
            if settings.send_completed_email:
                body = const.COMPLETED_EMAIL_TEMPLATE.format(invite.name)
                try:
                    to_email = '{} <{}>'.format(invite.name, invite.email)
                    mail.send_mail(settings.admin_email, to_email,
                                   const.COMPLETED_EMAIL_SUBJECT, body)
                except apiproxy_errors.OverQuotaError as message:
                    logging.error(message)
            completed = Completed(name=invite.name, email=invite.email)
            completed.put()
            invite.delete()
            questions = None
        else:
            if not responses:
                responses = [''] * len(const.QUESTIONS)
            questions = zip(const.QUESTIONS, responses)

        values = {'invite': invite, 'success': success, 'errors': errors,
                  'sel_ta': ta, 'questions': questions, 'remaining': remaining}
        template = jinja_environment.get_template('eval.html')
        self.response.out.write(template.render(values))
예제 #2
0
파일: taevals.py 프로젝트: ucsb-cs/taevals
    def email_result(self):
        key_name = self.request.get('key')
        obj = Eval.get_by_key_name(key_name)
        if not obj:
            return self.get(errors=['Invalid key: {!r}'.format(key_name)])

        if obj.sent_results:
            return self.get(errors=['Results already emailed.'])

        safe_ta_name = obj.ta.replace(' ', '_')
        ta_result_name = '{}-{}.txt'.format(obj.course, safe_ta_name)
        ta_result = Eval.generate_summary([obj])

        course_list = [x for x in Eval.all().filter('course =', obj.course)]
        course_result = Eval.generate_summary(course_list, True)
        all_result = Eval.generate_summary([x for x in Eval.all()], True)

        settings = Settings.get_by_key_name('settings')
        email_to = '{} <{}>'.format(obj.ta, obj.ta_email)
        email_cc = '{} <{}>'.format(obj.instructor, obj.instructor_email)
        body = const.RESULT_EMAIL_TEMPLATE.format(obj.ta)
        attachments = [(ta_result_name, ta_result),
                       ('{}.txt'.format(obj.course), course_result),
                       ('all.txt', all_result)]

        try:
            mail.send_mail(sender=settings.admin_email, to=email_to,
                           cc=email_cc, subject=const.RESULT_EMAIL_SUBJECT,
                           body=body, attachments=attachments)
            obj.sent_results = True
            obj.put()
            self.get(['Sent result to {} and {}'.format(obj.ta,
                                                        obj.instructor)])
        except Exception, e:
            self.get(errors=[str(e)])
예제 #3
0
파일: taevals.py 프로젝트: ucsb-cs/taevals
 def update_expire_date(self):
     expire_date = self.request.get('expire_date')
     try:
         expire_date = datetime.datetime.strptime(expire_date,
                                                  '%Y:%m:%d %H:%M')
     except ValueError:
         expire_date = None
     if not expire_date:
         return self.get(errors=['Invalid expire date'])
     settings = Settings.get_by_key_name('settings')
     settings.expire_date = expire_date
     settings.put()
     return self.get(['Expire date updated.'])
예제 #4
0
	def get(self, form=None):
		current_settings = Settings.get_by_key_name(config.SETTINGS_KEY)
		if current_settings:
			current_settings = current_settings.to_dict()
			current_settings['allowed_ips'] = ','.join(current_settings['allowed_ips'])
		else:
			current_settings = Settings.reset_auth(config.SETTINGS_KEY);

		if form is None:
			form = SettingsForm(current_settings)

		self.response.out.write(template.render(os.path.join(config.APP_ROOT_DIR, "templates/index.html"),
								{"no_settings" : (current_settings is None), "form" : form, "title" : "Mail Engine for App Engine"}))
예제 #5
0
파일: auth.py 프로젝트: ghinch/Mail-Engine
def check(token, public, remote_addr):
	authorized = False
	
	settings = Settings.get_by_key_name(config.SETTINGS_KEY)

	if settings is not None:
		compare_token = hashlib.sha1(public + settings.auth_key).hexdigest()
		if compare_token == token:
			authorized = True
		
		if settings.allowed_ips and remote_addr not in settings.allowed_ips:
			authorized = False

	return authorized
예제 #6
0
파일: taevals.py 프로젝트: ucsb-cs/taevals
 def post(self):
     settings = Settings.get_by_key_name('settings')
     for invites, output in helpers.invite_iterator():
         name = invites[0].name
         to_email = '{} <{}>'.format(name, invites[0].email)
         body = const.EMAIL_TEMPLATE.format(student=name, body=output)
         try:
             mail.send_mail(settings.admin_email, to_email,
                            const.EMAIL_SUBJECT, body)
             now = datetime.datetime.now()
             for invite in invites:
                 invite.email_sent = now
                 invite.put()
         except apiproxy_errors.OverQuotaError:
             taskqueue.add(url='/admin/email', countdown=60)
             return self.response.set_status(200)
예제 #7
0
	def post(self):
		settings = Settings.get_by_key_name(config.SETTINGS_KEY)

		sender = self.request.get(SENDER, settings.default_sender)
		subject = self.request.get(SUBJECT, settings.default_subject)
		body = self.request.get(BODY, '')

		recipients = self.request.get(RECIPIENTS)
		if recipients:
			recipients = recipients.split(COMMA)
		else:
			recipients = []

		m = Message(recipients=recipients,
					sender=sender,
					subject=subject,
					body=body)
		m.put()
		m.send()
예제 #8
0
파일: taevals.py 프로젝트: ucsb-cs/taevals
    def post(self, key):
        invite = EvalInvite.get_by_key_name(key)
        if not invite:
            return self.redirect('/')

        settings = Settings.get_by_key_name('settings')
        if datetime.datetime.now() > settings.expire_date:
            return self.get(key)

        ta = self.request.get('ta')
        if ta not in invite.tas:
            return self.get(key, errors=('Must select a TA to evaluate',))

        if self.request.get('not_applicable'):
            success = 'Not Applicable: {}'.format(ta)
        else:
            errors = []
            responses = self.get_responses()

            for i in range(len(const.QUESTIONS)):
                if i >= len(responses):
                    responses.append('')
                    continue
                if const.QUESTIONS[i][1] in [0, 1]:
                    if responses[i] not in ['0', '1', '2', '3', '4', '5']:
                        responses[i] = ''
                        errors.append('Must provide an answer for {!r}'.format(
                                const.QUESTIONS[i][0]))
            if errors:
                return self.get(key, ta, responses, errors=errors)

            try:
                db.run_in_transaction(Eval.update, invite.course, ta,
                                      responses)
            except apiproxy_errors.RequestTooLargeError:
                return self.get(key, ta, responses,
                                errors=('Your response is too long',))
            success = 'Evaluated: {}'.format(ta)

        # Remove TA from list of TAs student can evaluate
        invite.tas.remove(ta)
        invite.put()
        self.get(key, success=success)
예제 #9
0
    def post(self):
        settings = Settings.get_by_key_name(config.SETTINGS_KEY)

        sender = self.request.get(SENDER, settings.default_sender)
        subject = self.request.get(SUBJECT, settings.default_subject)
        body = self.request.get(BODY, '')

        recipients = self.request.get(RECIPIENTS)
        if recipients:
            recipients = recipients.split(COMMA)
        else:
            recipients = []

        m = Message(recipients=recipients,
                    sender=sender,
                    subject=subject,
                    body=body)
        m.put()
        m.send()