def __call__(self, form, field): if field.data is None: return field_dt = as_utc(field.data) earliest_dt = self.get_earliest(form, field) latest_dt = self.get_latest(form, field) if field_dt != field.object_data: if earliest_dt and field_dt < earliest_dt: if self.earliest_now: msg = _("'{}' can't be in the past ({})").format( field.label, field.timezone) else: dt = format_datetime(earliest_dt, timezone=field.timezone) msg = _("'{}' can't be before {} ({})").format( field.label, dt, field.timezone) raise ValidationError(msg) if latest_dt and field_dt > latest_dt: if self.latest_now: msg = _("'{}' can't be in the future ({})").format( field.label, field.timezone) else: dt = format_datetime(latest_dt, timezone=field.timezone) msg = _("'{}' can't be after {} ({})").format( field.label, dt, field.timezone) raise ValidationError(msg)
def render(cls, event): start_dt, end_dt = get_access_dates(get_last_request(event)) if start_dt.date() == end_dt.date(): return format_datetime(start_dt, format='d MMM YYY', locale='en_GB') else: return '{} - {}'.format(format_datetime(start_dt, format='d MMM YYY', locale='en_GB'), format_datetime(end_dt, format='d MMM YYY', locale='en_GB'))
def formatDateTime(dateTime, showWeek=False, format=None, locale=None, server_tz=False): week = "EEEE" if showWeek else "" if not format: return format_datetime(dateTime, week+'d/M/yyyy H:mm', locale=locale, server_tz=server_tz) else: return format_datetime(dateTime, format, locale=locale, server_tz=server_tz)
class IRegFormRegistrantBasicFossil(IFossil): def getId(self): """ Registrarant id """ getId.name = "registrant_id" def getFullName(self): """ Registrarant fullname """ getFullName.name = "full_name" getFullName.produce = lambda x: x.getFullName(title=True, firstNameFirst=True) def getAdjustedRegistrationDate(self): """ If the user payed """ getAdjustedRegistrationDate.name = "registration_date" getAdjustedRegistrationDate.produce = lambda x: format_datetime( x.getAdjustedRegistrationDate(), format="short") def getPayed(self): """ If the user payed """ getPayed.name = "paid" getPayed.produce = lambda x: x.getPayed() if x.getConference().getModPay( ).isActivated() else None def getTotal(self): """ Total amount payed """ getTotal.name = "amount_paid" getTotal.produce = lambda x: x.getTotal() if x.getConference().getModPay( ).isActivated() else None def isCheckedIn(self): """ Registrarant fullname """ isCheckedIn.name = "checked_in" def getAdjustedCheckInDate(self): """ If the user payed """ getAdjustedCheckInDate.name = "checkin_date" getAdjustedCheckInDate.produce = lambda x: format_datetime( x.getAdjustedCheckInDate(), format="short") if x.isCheckedIn( ) else None
def formatDateTime(dateTime, showWeek=False, format=None, locale=None): week = "EEEE" if showWeek else "" if not format: return format_datetime(dateTime, week+'d/M/yyyy H:mm', locale=locale).encode('utf-8') else: return format_datetime(dateTime, format, locale=locale).encode('utf-8')
def render(cls, event): start_dt, end_dt = get_access_dates(get_last_request(event)) if start_dt.date() == end_dt.date(): return to_unicode(format_datetime(start_dt, format='d MMM YYY', locale='en_GB')) else: return "{} - {}".format(to_unicode(format_datetime(start_dt, format='d MMM YYY', locale='en_GB')), to_unicode(format_datetime(end_dt, format='d MMM YYY', locale='en_GB')))
def generate_spreadsheet_from_abstracts(abstracts, static_item_ids, dynamic_items): """Generates a spreadsheet data from a given abstract list. :param abstracts: The list of abstracts to include in the file :param static_item_ids: The abstract properties to be used as columns :param dynamic_items: Contribution fields as extra columns """ field_names = ['Id', 'Title'] static_item_mapping = OrderedDict([ ('state', ('State', lambda x: x.state.title)), ('submitter', ('Submitter', lambda x: x.submitter.full_name)), ('authors', ('Primary authors', lambda x: [a.full_name for a in x.primary_authors])), ('accepted_track', ('Accepted track', lambda x: x.accepted_track.short_title if x.accepted_track else None)), ('submitted_for_tracks', ('Submitted for tracks', lambda x: [t.short_title for t in x.submitted_for_tracks])), ('reviewed_for_tracks', ('Reviewed for tracks', lambda x: [t.short_title for t in x.reviewed_for_tracks])), ('accepted_contrib_type', ('Accepted type', lambda x: x.accepted_contrib_type.name if x.accepted_contrib_type else None)), ('submitted_contrib_type', ('Submitted type', lambda x: x.submitted_contrib_type.name if x.submitted_contrib_type else None)), ('score', ('Score', lambda x: round(x.score, 1) if x.score is not None else None)), ('submitted_dt', ('Submission date', lambda x: to_unicode(format_datetime(x.submitted_dt)))), ('modified_dt', ('Modification date', lambda x: (to_unicode(format_datetime(x.modified_dt)) if x.modified_dt else ''))) ]) field_names.extend( unique_col(item.title, item.id) for item in dynamic_items) field_names.extend(title for name, (title, fn) in static_item_mapping.iteritems() if name in static_item_ids) rows = [] for abstract in abstracts: data = abstract.data_by_field abstract_dict = {'Id': abstract.friendly_id, 'Title': abstract.title} for item in dynamic_items: key = unique_col(item.title, item.id) abstract_dict[key] = data[ item.id].friendly_data if item.id in data else '' for name, (title, fn) in static_item_mapping.iteritems(): if name not in static_item_ids: continue value = fn(abstract) abstract_dict[title] = value rows.append(abstract_dict) return field_names, rows
def generate_csv_from_registrations(registrations, regform_items, special_items): """Generates a CSV file from a given registration list. :param registrations: The list of registrations to include in the file :param regform_items: The registration form items to be used as columns :param special_items: Registration form information as extra columns """ field_names = ['ID', 'Name'] special_item_mapping = OrderedDict([ ('reg_date', ('Registration date', lambda x: format_datetime(x.submitted_dt))), ('state', ('Registration state', lambda x: x.state.title)), ('price', ('Price', lambda x: x.render_price())), ('checked_in', ('Checked in', lambda x: 'Yes' if x.checked_in else 'No')), ('checked_in_date', ('Check-in date', lambda x: format_datetime(x.checked_in_dt) if x.checked_in else '')) ]) for item in regform_items: field_names.append('{}_{}'.format(item.title.encode('utf-8'), item.id)) if item.input_type == 'accommodation': field_names.append('{}_{}_{}'.format(item.title.encode('utf-8'), 'Arrival', item.id)) field_names.append('{}_{}_{}'.format(item.title.encode('utf-8'), 'Departure', item.id)) field_names.extend(title for name, (title, fn) in special_item_mapping.iteritems() if name in special_items) buf = BytesIO() writer = csv.DictWriter(buf, fieldnames=field_names) writer.writeheader() for registration in registrations: data = registration.data_by_field registration_dict = { 'ID': registration.friendly_id, 'Name': "{} {}".format(registration.first_name, registration.last_name).encode('utf-8') } for item in regform_items: key = '{}_{}'.format(item.title.encode('utf-8'), item.id) if item.input_type == 'accommodation': registration_dict[key] = _prepare_data(data[item.id].friendly_data.get('choice') if item.id in data else '') key = '{}_{}_{}'.format(item.title.encode('utf-8'), 'Arrival', item.id) arrival_date = data[item.id].friendly_data.get('arrival_date') if item.id in data else None registration_dict[key] = _prepare_data(format_date(arrival_date) if arrival_date else '') key = '{}_{}_{}'.format(item.title.encode('utf-8'), 'Departure', item.id) departure_date = data[item.id].friendly_data.get('departure_date') if item.id in data else None registration_dict[key] = _prepare_data(format_date(departure_date) if departure_date else '') else: registration_dict[key] = _prepare_data(data[item.id].friendly_data if item.id in data else '') for name, (title, fn) in special_item_mapping.iteritems(): if name not in special_items: continue value = fn(registration) if isinstance(value, unicode): value = value.encode('utf-8') registration_dict[title] = value writer.writerow(registration_dict) buf.seek(0) return buf
def generate_spreadsheet_from_registrations(registrations, regform_items, special_items): """Generates a spreadsheet data from a given registration list. :param registrations: The list of registrations to include in the file :param regform_items: The registration form items to be used as columns :param special_items: Registration form information as extra columns """ field_names = ['ID', 'Name'] special_item_mapping = OrderedDict([ ('reg_date', ('Registration date', lambda x: to_unicode(format_datetime(x.submitted_dt)))), ('state', ('Registration state', lambda x: x.state.title)), ('price', ('Price', lambda x: x.render_price())), ('checked_in', ('Checked in', lambda x: x.checked_in)), ('checked_in_date', ('Check-in date', lambda x: (to_unicode(format_datetime(x.checked_in_dt)) if x.checked_in else ''))) ]) for item in regform_items: field_names.append('{}_{}'.format(item.title, item.id)) if item.input_type == 'accommodation': field_names.append('{}_{}_{}'.format(item.title, 'Arrival', item.id)) field_names.append('{}_{}_{}'.format(item.title, 'Departure', item.id)) field_names.extend(title for name, (title, fn) in special_item_mapping.iteritems() if name in special_items) rows = [] for registration in registrations: data = registration.data_by_field registration_dict = { 'ID': registration.friendly_id, 'Name': "{} {}".format(registration.first_name, registration.last_name) } for item in regform_items: key = '{}_{}'.format(item.title, item.id) if item.input_type == 'accommodation': registration_dict[key] = _prepare_data(data[item.id].friendly_data.get('choice') if item.id in data else '') key = '{}_{}_{}'.format(item.title, 'Arrival', item.id) arrival_date = data[item.id].friendly_data.get('arrival_date') if item.id in data else None registration_dict[key] = _prepare_data(format_date(arrival_date) if arrival_date else '') key = '{}_{}_{}'.format(item.title, 'Departure', item.id) departure_date = data[item.id].friendly_data.get('departure_date') if item.id in data else None registration_dict[key] = _prepare_data(format_date(departure_date) if departure_date else '') else: registration_dict[key] = _prepare_data(data[item.id].friendly_data if item.id in data else '') for name, (title, fn) in special_item_mapping.iteritems(): if name not in special_items: continue value = fn(registration) registration_dict[title] = value rows.append(registration_dict) return field_names, rows
def process(self, start_month, end_month): start_dt, end_dt = get_month_dates(start_month, end_month) result, months = calculate_monthly_stats(start_dt, end_dt) # number of days within the boundary dates (inclusive) num_days = ((end_dt - start_dt).days + 1) return jsonify( data=result, num_days=num_days, months=[{ 'name': format_datetime(m, "MMMM YYYY", locale=session.lang), 'id': format_datetime(m, "YYYY-M"), 'num_days': ((m + relativedelta(months=1, days=-1)) - m).days + 1 } for m in months] )
def generate_spreadsheet_from_registrations(registrations, regform_items, special_items): """Generates a spreadsheet data from a given registration list. :param registrations: The list of registrations to include in the file :param regform_items: The registration form items to be used as columns :param special_items: Registration form information as extra columns """ field_names = ['ID', 'Name'] special_item_mapping = OrderedDict([ ('reg_date', ('Registration date', lambda x: to_unicode(format_datetime(x.submitted_dt)))), ('state', ('Registration state', lambda x: x.state.title)), ('price', ('Price', lambda x: x.render_price())), ('checked_in', ('Checked in', lambda x: x.checked_in)), ('checked_in_date', ('Check-in date', lambda x: (to_unicode(format_datetime(x.checked_in_dt)) if x.checked_in else ''))) ]) for item in regform_items: field_names.append(unique_col(item.title, item.id)) if item.input_type == 'accommodation': field_names.append(unique_col('{} ({})'.format(item.title, 'Arrival'), item.id)) field_names.append(unique_col('{} ({})'.format(item.title, 'Departure'), item.id)) field_names.extend(title for name, (title, fn) in special_item_mapping.iteritems() if name in special_items) rows = [] for registration in registrations: data = registration.data_by_field registration_dict = { 'ID': registration.friendly_id, 'Name': "{} {}".format(registration.first_name, registration.last_name) } for item in regform_items: key = unique_col(item.title, item.id) if item.input_type == 'accommodation': registration_dict[key] = data[item.id].friendly_data.get('choice') if item.id in data else '' key = unique_col('{} ({})'.format(item.title, 'Arrival'), item.id) arrival_date = data[item.id].friendly_data.get('arrival_date') if item.id in data else None registration_dict[key] = format_date(arrival_date) if arrival_date else '' key = unique_col('{} ({})'.format(item.title, 'Departure'), item.id) departure_date = data[item.id].friendly_data.get('departure_date') if item.id in data else None registration_dict[key] = format_date(departure_date) if departure_date else '' else: registration_dict[key] = data[item.id].friendly_data if item.id in data else '' for name, (title, fn) in special_item_mapping.iteritems(): if name not in special_items: continue value = fn(registration) registration_dict[title] = value rows.append(registration_dict) return field_names, rows
def validate_end_dt(self, field): if not self.check_timetable_boundaries: return if self.update_timetable.data: # if we move timetable entries according to the start date # change, check that there's enough time at the end. start_dt_offset = self.start_dt.data - self.start_dt.object_data end_buffer = field.data - max(self.toplevel_timetable_entries, key=attrgetter('end_dt')).end_dt delta = max(timedelta(), start_dt_offset - end_buffer) if delta: delta_str = format_human_timedelta(delta, 'minutes', True) raise ValidationError( _("The event is too short to fit all timetable entries. " "It must be at least {} longer.").format(delta_str)) else: # if we do not update timetable entries, only check that # the event does not end before its last timetable entry; # a similar check for the start time is done above in that # field's validation method. max_end_dt = max(self.toplevel_timetable_entries, key=attrgetter('end_dt')).end_dt if field.data < max_end_dt: raise ValidationError( _("The event cannot end before its last timetable entry, which is at {}." ).format( to_unicode( format_datetime(max_end_dt, timezone=self.event.tzinfo))))
def getVars(self): vars = WTemplated.getVars( self ) vars['user'] = self._avatar vars['currentUser'] = self._rh._getUser() vars["tokens"] = Catalog.getIdx('user_oauth_request_token').get(self._avatar.getId(), []) vars["formatTimestamp"] = lambda ts: format_datetime(utctimestamp2date(ts), format='d/M/yyyy H:mm') return vars
def generate_csv_from_survey(survey, submission_ids): """Generates a CSV file from a given survey. :param survey: `Survey` for which the user wants to export submissions :param submission_ids: The list of submissions to include in the file """ field_names = {"submitter", "submission_date"} field_names |= {"{}_{}".format(question.title, question.id) for question in survey.questions} buf = BytesIO() submissions = _filter_submissions(survey, submission_ids) writer = csv.DictWriter(buf, fieldnames=field_names) writer.writeheader() for submission in submissions: submission_dict = { "submitter": submission.user.full_name.encode("utf-8") if submission.user else None, "submission_date": format_datetime(submission.submitted_dt), } for answer in submission.answers: key = "{}_{}".format(answer.question.title, answer.question.id) submission_dict[key] = _prepare_data(answer.answer_data) writer.writerow(submission_dict) buf.seek(0) return buf
def generate_spreadsheet_from_contributions(contributions): """Return a tuple consisting of spreadsheet columns and respective contribution values""" headers = ['Id', 'Title', 'Description', 'Date', 'Duration', 'Type', 'Session', 'Track', 'Presenters', 'Materials'] rows = [] for c in sorted(contributions, key=attrgetter('friendly_id')): contrib_data = {'Id': c.friendly_id, 'Title': c.title, 'Description': c.description, 'Duration': format_human_timedelta(c.duration), 'Date': format_datetime(c.timetable_entry.start_dt) if c.timetable_entry else None, 'Type': c.type.name if c.type else None, 'Session': c.session.title if c.session else None, 'Track': c.track.title if c.track else None, 'Materials': None, 'Presenters': ', '.join(speaker.person.full_name for speaker in c.speakers)} attachments = [] attached_items = get_attached_items(c) for attachment in attached_items.get('files', []): attachments.append(attachment.absolute_download_url) for folder in attached_items.get('folders', []): for attachment in folder.attachments: attachments.append(attachment.absolute_download_url) if attachments: contrib_data['Materials'] = ', '.join(attachments) rows.append(contrib_data) return headers, rows
def export_checkin(self, aw): self._registrant.setCheckedIn(self._check_in) checkin_date = format_datetime(self._registrant.getAdjustedCheckInDate(), format="short") return { "checkin_in": self._check_in, "checkin_date": checkin_date if self._check_in else None }
def generate_csv_from_survey(survey, submission_ids): """Generates a CSV file from a given survey. :param survey: `Survey` for which the user wants to export submissions :param submission_ids: The list of submissions to include in the file """ field_names = {'submitter', 'submission_date'} field_names |= { '{}_{}'.format(question.title, question.id) for question in survey.questions } buf = BytesIO() submissions = _filter_submissions(survey, submission_ids) writer = csv.DictWriter(buf, fieldnames=field_names) writer.writeheader() for submission in submissions: submission_dict = { 'submitter': submission.user.full_name.encode('utf-8') if submission.user else None, 'submission_date': format_datetime(submission.submitted_dt), } for answer in submission.answers: key = '{}_{}'.format(answer.question.title, answer.question.id) submission_dict[key] = _prepare_data(answer.answer_data) writer.writerow(submission_dict) buf.seek(0) return buf
def _prepare(self, check = True): # Date checks... if check: from MaKaC.conference import ConferenceHolder if not ConferenceHolder().hasKey(self.conf.getId()): self.getLogger().warning("Conference %s no longer exists! " "Deleting alarm." % self.conf.getId()) self.conf.removeAlarm(self) self.suicide() elif self.conf.getStartDate() <= self._getCurrentDateTime(): self.getLogger().warning("Conference %s already started. " "Deleting alarm." % self.conf.getId()) self.conf.removeAlarm(self) self.suicide() return False # Email startDateTime = format_datetime(self.conf.getAdjustedStartDate(), format="short") self.setUpSubject() try: locationText = self.conf.getLocation().getName() if self.conf.getLocation().getAddress() != "": locationText += ", %s" % self.conf.getLocation().getAddress() if self.conf.getRoom().getName() != "": locationText += " (%s)" % self.conf.getRoom().getName() except: locationText = "" if locationText != "": locationText = " %s: %s" % ( _("Location"), locationText) if self.getToAllParticipants() : if self.conf.getType() == "conference": for r in self.conf.getRegistrantsList(): self.addToUser(r) else: for p in self.conf.getParticipation().getParticipantList() : self.addToUser(p) from MaKaC.webinterface import urlHandlers if Config.getInstance().getShortEventURL() != "": url = "%s%s" % (Config.getInstance().getShortEventURL(),self.conf.getId()) else: url = urlHandlers.UHConferenceDisplay.getURL(self.conf) self.setText("""Hello, Please note that the event "%s" will start on %s (%s). %s You can access the full event here: %s Best Regards """ % (self.conf.getTitle(),\ startDateTime,\ self.conf.getTimezone(),\ locationText,\ url,\ )) self._setMailText() return True
def _process(self): reminder = self.reminder form = ReminderForm(obj=self._get_defaults(), event=self.event) if form.validate_on_submit(): if reminder.is_sent: flash( _("This reminder has already been sent and cannot be modified anymore." ), 'error') return redirect(url_for('.edit', reminder)) form.populate_obj(reminder, existing_only=True) if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder modified by %s: %s', session.user, reminder) flash( _("The reminder at {} has been modified.").format( to_unicode(format_datetime(reminder.scheduled_dt))), 'success') return jsonify_data(flash=False) return jsonify_template('events/reminders/edit_reminder.html', event=self.event, reminder=reminder, form=form)
def getVars(self): wvars = WTemplated.getVars(self) wvars['user'] = self._avatar wvars['currentUser'] = self._rh._getUser() wvars["tokens"] = Catalog.getIdx('user_oauth_access_token').get(self._avatar.getId(), []) wvars["formatTimestamp"] = lambda ts: format_datetime(ts, format='d/M/yyyy H:mm') return wvars
def _process(self): form = ContributionStartDateForm(obj=FormDefaults(start_dt=self.contrib.start_dt), contrib=self.contrib) if form.validate_on_submit(): with track_time_changes(): update_timetable_entry(self.contrib.timetable_entry, {'start_dt': form.start_dt.data}) return jsonify_data(new_value=format_datetime(self.contrib.start_dt, 'short')) return jsonify_form(form, back_button=False, disabled_until_change=True)
def generate_spreadsheet_from_survey(survey, submission_ids): """Generates spreadsheet data from a given survey. :param survey: `Survey` for which the user wants to export submissions :param submission_ids: The list of submissions to include in the file """ field_names = ['Submitter', 'Submission Date'] sorted_questions = sorted(survey.questions, key=attrgetter('parent.position', 'position')) field_names += [ unique_col(_format_title(question), question.id) for question in sorted_questions ] submissions = _filter_submissions(survey, submission_ids) rows = [] for submission in submissions: submission_dict = { 'Submitter': submission.user.full_name if submission.user else None, 'Submission Date': to_unicode(format_datetime(submission.submitted_dt)), } for key in field_names: submission_dict.setdefault(key, '') for answer in submission.answers: key = unique_col(_format_title(answer.question), answer.question.id) submission_dict[key] = answer.answer_data rows.append(submission_dict) return field_names, rows
def getVars(self): wvars = WTemplated.getVars(self) ath = AccessTokenHolder() wvars["formatTimestamp"] = lambda ts: format_datetime( ts, format='d/M/yyyy H:mm') wvars['tokens'] = sorted(ath.getList(), key=lambda t: t.getUser().getId()) return wvars
def setUpSubject(self): start_dt = format_datetime(self.conf.getAdjustedStartDate(), format='short', keep_tz=True) self.setSubject( _("Event reminder: {} ({} {})").format(self.conf.getTitle(), start_dt, self.conf.getTimezone()))
def export_registrant(self, aw): registration_date = format_datetime(self._registrant.getAdjustedRegistrationDate(), format="short") checkin_date = format_datetime(self._registrant.getAdjustedCheckInDate(), format="short") self._registrant.getPayed() result = { "registrant_id": self._registrant.getId(), "full_name": self._registrant.getFullName(title=True, firstNameFirst=True), "checked_in": self._registrant.isCheckedIn(), "checkin_date": checkin_date if self._registrant.isCheckedIn() else None, "registration_date": registration_date, "payed": self._registrant.getPayed() if self._conf.getModPay().isActivated() else None, "pay_amount": self._registrant.getTotal() if self._conf.getModPay().isActivated() else None } regForm = self._conf.getRegistrationForm() personalData = regForm.getPersonalData().getRegistrantValues(self._registrant) result.update(personalData) return result
def render(cls, event): start_dt, end_dt = event.start_dt_local, event.end_dt_local interval = _('{} to {}').format(format_date(start_dt, format='long'), format_date(end_dt, format='long')) if start_dt.date() == end_dt.date(): interval = format_datetime(start_dt) elif start_dt.date().replace(day=1) == end_dt.date().replace(day=1): interval = '{} - {} {}'.format(start_dt.day, end_dt.day, format_date(start_dt, format='MMMM yyyy')) return interval
def api_checkin(self, aw): self._registrant.setCheckedIn(self._check_in) checkin_date = format_datetime(self._registrant.getAdjustedCheckInDate(), format="short") return { "checked_in": self._check_in, "checkin_date": checkin_date if self._check_in else None }
def render(cls, **kwargs): arg = kwargs.pop(cls.render_kwarg) if kwargs: raise TypeError(f'render() got unexpected kwargs: {kwargs}') if not arg.start_dt: return '' formatted = format_datetime(arg.start_dt, cls.date_format, locale='en_GB', timezone=arg.event.tzinfo) return cls.transform(formatted) if cls.transform else formatted
def getVars(self): wvars = WTemplated.getVars(self) wvars['user'] = self._avatar wvars['currentUser'] = self._rh._getUser() wvars["tokens"] = Catalog.getIdx('user_oauth_access_token').get( self._avatar.getId(), []) wvars["formatTimestamp"] = lambda ts: format_datetime( ts, format='d/M/yyyy H:mm') return wvars
def __init__(self, *args, **kwargs): self.event = kwargs.pop('event') super().__init__(*args, **kwargs) contrib_choices = [(contrib.id, '{} (#{}, {})'.format(contrib.title, contrib.friendly_id, format_datetime(contrib.start_dt, timezone=self.event.tzinfo))) for contrib in sorted(self.event.contributions, key=lambda c: (c.title, c.start_dt or as_utc(datetime(1970, 1, 1)))) if contrib.start_dt is not None] blocks = (SessionBlock.query .filter(SessionBlock.session.has((Session.event == self.event) & ~Session.is_deleted)) .all()) block_choices = [(block.id, '{} ({})'.format(block.full_title, format_datetime(block.start_dt, timezone=self.event.tzinfo))) for block in sorted(blocks, key=attrgetter('full_title', 'start_dt'))] self.contribution.choices = [('', _('Please select a contribution'))] + contrib_choices self.block.choices = [('', _('Please select a session block'))] + block_choices
def update_timetable_entry(entry, data): entry.populate_from_dict(data) object_type, object_title = _get_object_info(entry) db.session.flush() signals.event.timetable_entry_updated.send(entry) logger.info('Timetable entry %s updated by %s', entry, session.user) entry.event_new.log(EventLogRealm.management, EventLogKind.change, 'Timetable', "Entry for {} '{}' modified".format(object_type, object_title), session.user, data={'Time': format_datetime(entry.start_dt)})
def _process(self): if self.reminder.is_sent: flash(_('Sent reminders cannot be deleted.'), 'error') else: db.session.delete(self.reminder) logger.info('Reminder deleted by {}: {}'.format(session.user, self.reminder)) flash(_("The reminder at {} has been deleted.").format(format_datetime(self.reminder.scheduled_dt)), 'success') return redirect(url_for('.list', self.event))
def _process(self): if self.reminder.is_sent: flash(_('Sent reminders cannot be deleted.'), 'error') else: db.session.delete(self.reminder) logger.info('Reminder deleted by %s: %s', session.user, self.reminder) flash(_("The reminder at {} has been deleted.") .format(to_unicode(format_datetime(self.reminder.scheduled_dt))), 'success') return redirect(url_for('.list', self.event_new))
def generate_spreadsheet_from_abstracts(abstracts, static_item_ids, dynamic_items): """Generates a spreadsheet data from a given abstract list. :param abstracts: The list of abstracts to include in the file :param static_item_ids: The abstract properties to be used as columns :param dynamic_items: Contribution fields as extra columns """ field_names = ['Id', 'Title'] static_item_mapping = OrderedDict([ ('state', ('State', lambda x: x.state.title)), ('submitter', ('Submitter', lambda x: x.submitter.full_name)), ('authors', ('Primary authors', lambda x: [a.full_name for a in x.primary_authors])), ('accepted_track', ('Accepted track', lambda x: x.accepted_track.short_title if x.accepted_track else None)), ('submitted_for_tracks', ('Submitted for tracks', lambda x: [t.short_title for t in x.submitted_for_tracks])), ('reviewed_for_tracks', ('Reviewed for tracks', lambda x: [t.short_title for t in x.reviewed_for_tracks])), ('accepted_contrib_type', ('Accepted type', lambda x: x.accepted_contrib_type.name if x.accepted_contrib_type else None)), ('submitted_contrib_type', ('Submitted type', lambda x: x.submitted_contrib_type.name if x.submitted_contrib_type else None)), ('score', ('Score', lambda x: round(x.score, 1))), ('submitted_dt', ('Submission date', lambda x: to_unicode(format_datetime(x.submitted_dt)))), ('modified_dt', ('Modification date', lambda x: (to_unicode(format_datetime(x.modified_dt)) if x.modified_dt else ''))) ]) field_names.extend(unique_col(item.title, item.id) for item in dynamic_items) field_names.extend(title for name, (title, fn) in static_item_mapping.iteritems() if name in static_item_ids) rows = [] for abstract in abstracts: data = abstract.data_by_field abstract_dict = { 'Id': abstract.friendly_id, 'Title': abstract.title } for item in dynamic_items: key = unique_col(item.title, item.id) abstract_dict[key] = data[item.id].friendly_data if item.id in data else '' for name, (title, fn) in static_item_mapping.iteritems(): if name not in static_item_ids: continue value = fn(abstract) abstract_dict[title] = value rows.append(abstract_dict) return field_names, rows
def _sendEventRequest(self, key, eventType, avatar, conference): try: logger = self.getLogger() plugin = PluginsHolder().getPluginType('calendaring').getPlugin('outlook') if not isUserPluginEnabled(avatar.getId()): logger.info("Outlook plugin disabled for user: {}".format(avatar.getId())) return {'status_code': 200} if eventType in ['added', 'updated']: logger.debug("Performing '{}' for: {}".format(eventType, avatar.getId())) url = urlHandlers.UHConferenceDisplay.getURL(conference) location = strip_control_chars(conference.getRoom().getName()) if conference.getRoom() else '' description = strip_control_chars(conference.getDescription()) self.payload = {'userEmail': avatar.getEmail(), 'uniqueID': plugin.getOption('prefix').getValue() + key, 'subject': strip_control_chars(conference.getTitle()), 'location': location, 'body': '<a href="{}">{}</a><br><br>{}'.format(url, url, description), 'status': plugin.getOption('status').getValue(), 'startDate': format_datetime(conference.getStartDate(), format=plugin.getOption('datetimeFormat').getValue(), timezone=pytz.utc), 'endDate': format_datetime(conference.getEndDate(), format=plugin.getOption('datetimeFormat').getValue(), timezone=pytz.utc), 'isThereReminder': plugin.getOption('reminder').getValue(), 'reminderTimeInMinutes': plugin.getOption('reminder_minutes').getValue()} operation = plugin.getOption('addToCalendarOperationName').getValue() if eventType == 'added' else plugin.getOption('updateCalendarOperationName').getValue() elif eventType == 'removed': logger.debug("Removing calendar entry for: {}".format(avatar.getId())) self.payload = {'userEmail': avatar.getEmail(), 'uniqueID': plugin.getOption('prefix').getValue() + key} operation = plugin.getOption('removeFromCalendarOperationName').getValue() else: return None headers = {'content-type': 'application/x-www-form-urlencoded'} return requests.post(urlpath.tslash(plugin.getOption('url').getValue()) + operation, auth=(plugin.getOption('login').getValue(), plugin.getOption('password').getValue()), data=self.payload, headers=headers, timeout=plugin.getOption('timeout').getValue()) except requests.exceptions.Timeout: logger.exception('Timeout') except requests.exceptions.RequestException: logger.exception('RequestException: Connection problem') except Exception, e: logger.exception('Outlook EventException: {}'.format(e))
def render(cls, event): start_dt, end_dt = event.start_dt_local, event.end_dt_local interval = _("{} to {}").format(to_unicode(format_date(start_dt, format='long')), to_unicode(format_date(end_dt, format='long'))) if start_dt.date() == end_dt.date(): interval = to_unicode(format_datetime(start_dt)) elif start_dt.date().replace(day=1) == end_dt.date().replace(day=1): interval = "{} - {} {}".format(start_dt.day, end_dt.day, to_unicode(format_date(start_dt, format='MMMM yyyy'))) return interval
def update_timetable_entry(entry, data): changes = entry.populate_from_dict(data) object_type, object_title = _get_object_info(entry) db.session.flush() if changes: signals.event.timetable_entry_updated.send(entry, changes=changes) logger.info('Timetable entry %s updated by %s', entry, session.user) entry.event.log(EventLogRealm.management, EventLogKind.change, 'Timetable', "Entry for {} '{}' modified".format(object_type, object_title), session.user, data={'Time': format_datetime(entry.start_dt)})
def delete_timetable_entry(entry, log=True): object_type, object_title = _get_object_info(entry) signals.event.timetable_entry_deleted.send(entry) entry.object = None db.session.flush() if log: logger.info('Timetable entry %s deleted by %s', entry, session.user) entry.event_new.log(EventLogRealm.management, EventLogKind.negative, 'Timetable', "Entry for {} '{}' deleted".format(object_type, object_title), session.user, data={'Time': format_datetime(entry.start_dt)})
def _prepare_excel_data(data, tz=None): if isinstance(data, (list, tuple)): data = ', '.join(data) elif isinstance(data, set): data = ', '.join(sorted(data, key=unicode.lower)) elif is_lazy_string(data) or isinstance(data, Markup): data = unicode(data) elif isinstance(data, datetime): data = format_datetime(data, timezone=tz).decode('utf-8') return data
def _process(self): if self.reminder.is_sent: flash(_("Sent reminders cannot be deleted."), "error") else: db.session.delete(self.reminder) logger.info("Reminder deleted by {}: {}".format(session.user, self.reminder)) flash( _("The reminder at {} has been deleted.").format(format_datetime(self.reminder.scheduled_dt)), "success" ) return redirect(url_for(".list", self.event))
def _prepare_excel_data(data, tz=None): if isinstance(data, (list, tuple)): data = '; '.join(data) elif isinstance(data, set): data = '; '.join(sorted(data, key=unicode.lower)) elif is_lazy_string(data) or isinstance(data, Markup): data = unicode(data) elif isinstance(data, datetime): data = format_datetime(data, timezone=tz).decode('utf-8') return data
def _convert_data(event, value): if isinstance(value, timedelta): value = format_human_timedelta(value) elif isinstance(value, datetime): value = format_datetime(value, locale="en_GB", timezone=event.timezone) elif value.__class__.__name__ == "ContributionType": value = value._name elif value.__class__.__name__ == "AbstractFieldContent": value = '{}: "{}"'.format(convert_to_unicode(value.field._caption), convert_to_unicode(value.value)) return convert_to_unicode(value).strip()
def delete_timetable_entry(entry, log=True): object_type, object_title = _get_object_info(entry) signals.event.timetable_entry_deleted.send(entry) entry.object = None db.session.flush() if log: logger.info('Timetable entry %s deleted by %s', entry, session.user) entry.event.log(EventLogRealm.management, EventLogKind.negative, 'Timetable', "Entry for {} '{}' deleted".format(object_type, object_title), session.user, data={'Time': format_datetime(entry.start_dt)})
def _process(self): query = _session_block_query(self.event) result = [{'id': session_block.id, 'friendly_id': session_block.session.friendly_id, 'title': session_block.full_title, 'full_title': '#{}: {} ({})'.format( session_block.session.friendly_id, session_block.full_title, to_unicode(format_datetime(session_block.timetable_entry.start_dt)))} for session_block in query] return jsonify(result)
def _convert_data(event, value): if isinstance(value, timedelta): value = format_human_timedelta(value) elif isinstance(value, datetime): value = format_datetime(value, locale='en_GB', timezone=event.timezone) elif value.__class__.__name__ == 'ContributionType': value = value._name elif value.__class__.__name__ == 'AbstractFieldContent': value = '{}: "{}"'.format(convert_to_unicode(value.field._caption), convert_to_unicode(value.value)) return convert_to_unicode(value).strip()
def _getAnswer(self): if not self._registrant_ids: raise NoReportError(_("No registrants were selected to check-in")) dates_changed = {} for registrant_id in self._registrant_ids: registrant = self._conf.getRegistrantById(registrant_id) if not registrant.isCheckedIn(): registrant.setCheckedIn(True) checkInDate = registrant.getAdjustedCheckInDate() dates_changed[registrant_id] = format_datetime(checkInDate) return {"dates": dates_changed}
def api_checkin(self, aw): if self._object: self._object.setCheckedIn(self._check_in) checkin_date = format_datetime(self._object.getAdjustedCheckInDate(), format="short") if self._check_in else None return { "checked_in": self._check_in, "checkin_date": checkin_date if self._check_in else None } else: return {"status": "no session has been found"}
def _sendEventRequest(self, key, eventType, avatar, conference): try: logger = self.getLogger() plugin = PluginsHolder().getPluginType('calendaring').getPlugin('outlook') if not isUserPluginEnabled(avatar.getId()): logger.info("outlook plugin disabled for user: %s" % avatar.getId()) return 200 if eventType in ['added', 'updated']: logger.debug("performing '%s' for: %s" % (eventType, avatar.getId())) url = urlHandlers.UHConferenceDisplay.getURL(conference) payload = {'userEmail': avatar.getEmail(), 'uniqueID': plugin.getOption('prefix').getValue() + key, 'subject': conference.getTitle(), 'location': conference.getRoom().getName() if conference.getRoom() else '', 'body': '<a href="%s">%s</a>' % (url, url) + '<br><br>' + conference.getDescription(), 'status': plugin.getOption('status').getValue(), 'startDate': format_datetime(conference.getStartDate(), format=plugin.getOption('datetimeFormat').getValue()), 'endDate': format_datetime(conference.getEndDate(), format=plugin.getOption('datetimeFormat').getValue()), 'isThereReminder': plugin.getOption('reminder').getValue(), 'reminderTimeInMinutes': plugin.getOption('reminder_minutes').getValue(), } operation = plugin.getOption('addToCalendarOperationName').getValue() if eventType == 'added' else plugin.getOption('updateCalendarOperationName').getValue() elif eventType == 'removed': logger.debug("removing calendar entry for: %s" % avatar.getId()) payload = {'userEmail': avatar.getEmail(), 'uniqueID': plugin.getOption('prefix').getValue() + key, } operation = plugin.getOption('removeFromCalendarOperationName').getValue() else: return None headers = {'content-type': 'application/x-www-form-urlencoded'} r = requests.post(urlpath.tslash(plugin.getOption('url').getValue()) + operation, auth=(plugin.getOption('login').getValue(), plugin.getOption('password').getValue()), data=payload, headers=headers, timeout=plugin.getOption('timeout').getValue()) return r.status_code except requests.exceptions.Timeout: logger.exception('Timeout') except requests.exceptions.RequestException: logger.exception('RequestException: Connection problem') except Exception, e: logger.exception('Outlook EventException: %s' % e)
def create_timetable_entry(event, data, parent=None, extend_parent=False): entry = TimetableEntry(event_new=event, parent=parent) entry.populate_from_dict(data) object_type, object_title = _get_object_info(entry) db.session.flush() signals.event.timetable_entry_created.send(entry) logger.info('Timetable entry %s created by %s', entry, session.user) entry.event_new.log(EventLogRealm.management, EventLogKind.positive, 'Timetable', "Entry for {} '{}' created".format(object_type, object_title), session.user, data={'Time': format_datetime(entry.start_dt)}) if extend_parent: entry.extend_parent() return entry
def getLaunchInfo(cls, booking, displayTz=None): launchInfo = {"launchText": _("Join Now!"), "launchLink": ""} if booking.canBeStarted(): launchInfo["launchLink"] = booking.getURL() launchInfo["launchTooltip"] = _("Click here to join the EVO meeting!") else: if booking.getStartDate() > nowutc(): launchInfo["launchTooltip"] = _( "This meeting starts at %s so you cannot join it yet" ) % format_datetime(booking.getStartDate()) else: launchInfo["launchTooltip"] = _("This meeting has already took place") return launchInfo
def getVars(self): vars = wcomponents.WTemplated.getVars(self) vars["isWithdrawn"] = isinstance(self._contrib.getCurrentStatus(), conference.ContribStatusWithdrawn) vars["Contribution"] = vars["target"] = self._contrib vars["urlICSFile"] = urlHandlers.UHContribToiCal.getURL(self._contrib) vars["showAttachedFiles"] = self._contrib.getConference().getAbstractMgr().showAttachedFilesContribList() and isinstance(self._contrib, conference.AcceptedContribution) and self._contrib.getAbstract() and len(self._contrib.getAbstract().getAttachments()) > 0 vars["abstractAttachments"] = fossilize(self._contrib.getAbstract().getAttachments().values(), ILocalFileAbstractMaterialFossil) if isinstance(self._contrib, conference.AcceptedContribution) and self._contrib.getAbstract() else [] vars.update(self._getIcalExportParams(self._aw.getUser(), '/export/event/%s/contribution/%s.ics' % (self._contrib.getConference().getId(), self._contrib.getId()))) vars["getAuthorURL"] = lambda auth: self._getAuthorURL(auth) vars["formatDate"] = lambda date: format_date(date, "d MMM yyyy") tz = timezone(DisplayTZ(self._aw, self._contrib.getConference()).getDisplayTZ()) vars["formatTime"] = lambda time: format_time(time, format="short", timezone=tz) vars["formatDateTime"] = lambda dt: format_datetime(dt, format='d/M/yyyy H:mm', timezone=tz) vars["accessWrapper"] = self._aw statusReviewing = self._getStatusReviewing() vars["showSubmit"] = statusReviewing not in ["Accept", "Reject", "Submitted"] vars["showMaterial"] = statusReviewing is not None vars["showHistory"] = statusReviewing is not None vars["reviewingActive"] = self._contrib.getConference() and \ self._contrib.getConference().getConfPaperReview().hasReviewing() and \ not isinstance(self._contrib.getCurrentStatus(), conference.ContribStatusWithdrawn) and \ (self._contrib.canUserSubmit(self._aw.getUser()) or self._contrib.canModify(self._aw)) if statusReviewing == "Submitted": vars["statusText"] = _("Awaiting review") vars["statusClass"] = "contributionReviewingStatusPending" elif statusReviewing == "Accept": vars["statusText"] = _("ACCEPTED") vars["statusClass"] = "contributionReviewingStatusAccepted" elif statusReviewing == "Reject": vars["statusText"] = _("REJECTED") vars["statusClass"] = "contributionReviewingStatusRejected" elif statusReviewing == "To be corrected": vars["statusText"] = _("To be corrected") vars["statusClass"] = "contributionReviewingStatusCorrected" elif statusReviewing is not None: vars["statusText"] = statusReviewing vars["statusClass"] = "contributionReviewingStatusCorrected" else: vars["statusText"] = _("Paper not yet submitted") vars["statusClass"] = "contributionReviewingStatusNotSubmitted" vars["prefixUpload"] = "Re-" if statusReviewing not in ["Accept", "Reject", None] else "" vars["getResourceName"] = lambda resource: self._getResourceName(resource) vars["reportNumberSystems"] = Config.getInstance().getReportNumberSystems() return vars
def _process(self): form = ReminderForm(event=self.event, schedule_type='relative') if form.validate_on_submit(): reminder = EventReminder(creator=session.user, event=self.event) form.populate_obj(reminder, existing_only=True) db.session.add(reminder) db.session.flush() if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder created by {}: {}'.format(session.user, reminder)) flash(_("A reminder at {} has been created.").format(format_datetime(reminder.scheduled_dt)), 'success') return redirect(url_for('.list', self.event)) return WPReminders.render_template('edit_reminder.html', self.event, event=self.event, reminder=None, form=form, widget_attrs=form.default_widget_attrs)
def _process(self): form = ReminderForm(event=self.event, schedule_type='relative') if form.validate_on_submit(): reminder = EventReminder(creator=session.user, event=self.event) form.populate_obj(reminder, existing_only=True) db.session.add(reminder) db.session.flush() if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder created by %s: %s', session.user, reminder) flash(_("A reminder at {} has been created.") .format(to_unicode(format_datetime(reminder.scheduled_dt))), 'success') return jsonify_data(flash=False) return jsonify_template('events/reminders/edit_reminder.html', event=self.event, reminder=None, form=form, widget_attrs=form.default_widget_attrs)
def _process(self): reminder = self.reminder form = ReminderForm(obj=self._get_defaults(), event=self.event) if form.validate_on_submit(): if reminder.is_sent: flash(_("This reminder has already been sent and cannot be modified anymore."), 'error') return redirect(url_for('.edit', reminder)) form.populate_obj(reminder, existing_only=True) if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder modified by %s: %s', session.user, reminder) flash(_("The reminder at {} has been modified.") .format(to_unicode(format_datetime(reminder.scheduled_dt))), 'success') return jsonify_data(flash=False) return jsonify_template('events/reminders/edit_reminder.html', event=self.event, reminder=reminder, form=form)
def _process(self): reminder = self.reminder form = ReminderForm(obj=self._get_defaults(), event=self.event) if form.validate_on_submit(): if reminder.is_sent: flash(_("This reminder has already been sent and cannot be modified anymore."), 'error') return redirect(url_for('.edit', reminder)) form.populate_obj(reminder, existing_only=True) if form.schedule_type.data == 'now': _send_reminder(reminder) else: logger.info('Reminder modified by {}: {}'.format(session.user, reminder)) flash(_("The reminder at {} has been modified.").format(format_datetime(reminder.scheduled_dt)), 'success') return redirect(url_for('.list', self.event)) widget_attrs = ({field.short_name: {'disabled': True} for field in form} if reminder.is_sent else form.default_widget_attrs) return WPReminders.render_template('edit_reminder.html', self.event, event=self.event, reminder=reminder, form=form, widget_attrs=widget_attrs)