Example #1
0
 def select_table(self, table_class='table', **kwargs):
     field = self.work_event
     kwargs.setdefault('type', 'radio')
     field_id = kwargs.pop('id', field.id)
     html = ['<table %s>' % html_params(id=field_id, class_=table_class)]
     html.append("""<tr>
                      <th>Name</th>
                      <th>Extra Info</th>
                      <th>Selected</th>
                    </tr>""")
     for value, label, checked in field.iter_choices():
         event_info = Event.get_by_id(value)
         html.append("<tr>\n")
         choice_id = '%s-%s' % (field_id, value)
         options = dict(kwargs, name=field.name, value=value, id=choice_id)
         if checked:
             options['checked'] = 'checked'
         html.append('<td><label for="%s">%s</label></td>\n' % (field_id, label))
         html.append('<td>' + ', '.join(event_info.extra) + '</td>\n')
         html.append('<td><input %s /></td>\n' % html_params(**options))
         html.append('</tr>')
     html.append('</table>')
     return ''.join(html)
Example #2
0
    def validate(self):
        initial_validation = super(WorkSubmitForm, self).validate()
        if not initial_validation:
            return False

        # check syntax
        try:
            extra_list = json.loads(self.extra.data)
            if type(extra_list) is dict:
                # check content
                event = Event.get_by_id(self.work_event.data)
                item_list = event.extra
                for item in item_list:
                    if item not in extra_list:
                        self.extra.errors.append('Missing one or more fields.')
                        return False
                return True
            else:
                self.extra.errors.append('Bad syntax.')
                return False
        except:
            self.extra.errors.append('Bad syntax.')
            return False
Example #3
0
def work_upload():
    """
    Work upload/update page for team user. On GET method, it renders work upload template. On POST method, it update/create corresponding work instance and stores the PDF file.

    When storing the file, it combines the current UNIX format time with original filename filtered with :funciton:`secure_filename` to form the filename used for local storage.

    .. note::
       Don't forget to create directory static/work_upload manually!

    Team user required.
    """
    form = WorkSubmitForm()
    current_team = current_user.team
    # append all open events to event select field's choice list
    event_list = Event.query.filter(
        and_(Event.start_time <= dt.datetime.now(), Event.end_time >= dt.datetime.now())
    ).all()
    choice_list = []
    for each_event in event_list:
        choice_list.append((each_event.id, each_event.name))
    form.work_event.choices = choice_list

    # if no event is currently open, flash an error
    if len(choice_list) == 0:
        flash("No event is currently open.", "warning")
        return redirect(url_for("team.work_panel"))

    if form.validate_on_submit():
        filename = secure_filename(str(calendar.timegm(time.gmtime())) + form.work_file.data.filename)
        upload_dir = os.path.join(os.path.dirname(os.path.realpath(__file__)), "../static/work_upload/")
        form.work_file.data.save(upload_dir + filename)
        if current_team.work:
            modified_work = current_team.work
            extra_info = json.loads(form.extra.data)
            modified_work.update(
                title=form.work_title.data,
                file_path=url_for("static", filename="work_upload/" + filename),
                created_at=dt.datetime.now(),
                extra=extra_info,
            )
            if not modified_work.event_id == form.work_event.data:
                flash(
                    "To change event, you must delete your current work and propose a new one. Other changes have been successfully saved.",
                    "warning",
                )
            else:
                flash("Work updated. You're all set.", "success")
        else:
            extra_info = json.loads(form.extra.data)
            Work.create(
                title=form.work_title.data,
                file_path=url_for("static", filename="work_upload/" + filename),
                team=current_team,
                team_id=current_team.id,
                event=Event.get_by_id(form.work_event.data),
                event_id=form.work_event.data,
                extra=extra_info,
            )
            flash("Work uploaded. You're all set.", "success")
        return redirect(url_for("team.work_panel"))
    else:
        flash_errors(form)
    if current_team.work and request.method == "GET":
        form.work_title.data = current_team.work.title
        form.work_event.data = current_team.work.event_id
        form.extra.data = json.dumps(current_team.work.extra)
    return render_template("team/work_upload.html", upload_form=form)