def create_agency_pdf(self, request, form): if form.submitted(request): self.pdf_file = request.app.pdf_class.from_agencies( agencies=[self], title=self.title, toc=False, exclude=request.app.org.hidden_people_fields, page_break_on_level=1) request.success(_("PDF created")) # FIXME: clear cache for redirect so that pdf link is updated return redirect(request.link(self)) layout = AgencyLayout(self, request) layout.breadcrumbs.append(Link(_("Create PDF"), '#')) return { 'layout': layout, 'title': _("Create PDF"), 'helptext': _("Create a PDF of this agency and all its suborganizations. " "This may take a while."), 'form': form }
def report_person_change(self, request, form): if form.submitted(request): session = request.session with session.no_autoflush: ticket = TicketCollection(session).open_ticket( handler_code='PER', handler_id=uuid4().hex, handler_data={ 'id': str(self.id), 'submitter_email': form.email.data, 'submitter_message': form.message.data }) TicketMessage.create(ticket, request, 'opened') ticket.create_snapshot(request) send_ticket_mail(request=request, template='mail_ticket_opened.pt', subject=_("Your ticket has been opened"), receivers=(form.email.data, ), ticket=ticket) request.success(_("Thank you for your submission!")) return redirect(request.link(ticket, 'status')) layout = ExtendedPersonLayout(self, request) layout.breadcrumbs.append(Link(_("Report change"), '#')) return { 'layout': layout, 'title': _("Report change"), 'lead': self.title, 'form': form }
def create_root_pdf(self, request, form): if form.submitted(request): request.app.root_pdf = request.app.pdf_class.from_agencies( agencies=self.roots, title=request.app.org.name, toc=True, exclude=request.app.org.hidden_people_fields, page_break_on_level=2) request.success(_("PDF created")) return redirect(request.link(self)) layout = AgencyCollectionLayout(self, request) layout.breadcrumbs.append(Link(_("Create PDF"), '#')) return { 'layout': layout, 'title': _("Create PDF"), 'helptext': _("Create a PDF of this agency and all its suborganizations. " "This may take a while."), 'form': form }
def add_root_agency(self, request, form): if form.submitted(request): agency = self.add_root(**form.get_useful_data()) request.success(_("Added a new agency")) return redirect(request.link(agency)) layout = AgencyCollectionLayout(self, request) layout.breadcrumbs.append(Link(_("New"), '#')) return {'layout': layout, 'title': _("New agency"), 'form': form}
def add_membership(self, request, form): if form.submitted(request): self.add_person(**form.get_useful_data()) request.success(_("Added a new membership")) return redirect(request.link(self)) layout = AgencyLayout(self, request) layout.breadcrumbs.append(Link(_("New membership"), '#')) return {'layout': layout, 'title': _("New membership"), 'form': form}
class MutationForm(Form): """ Form to report a mutation of an organization. """ email = EmailField( label=_("E-Mail"), description="*****@*****.**", validators=[validators.InputRequired(), validators.Email()]) message = TextAreaField(label=_("Message"), render_kw={'rows': 12}, validators=[validators.InputRequired()])
def add_person(self, request, form): if form.submitted(request): person = self.add(**form.get_useful_data()) request.success(_("Added a new person")) return redirect(request.link(person)) layout = ExtendedPersonCollectionLayout(self, request) layout.breadcrumbs.append(Link(_("New"), '#')) layout.include_editor() return {'layout': layout, 'title': _("New person"), 'form': form}
def edit_membership(self, request, form): if form.submitted(request): form.populate_obj(self) request.success(_("Your changes were saved")) return redirect(request.link(self)) else: form.process(obj=self) layout = MembershipLayout(self, request) layout.breadcrumbs.append(Link(_("Edit"), '#')) return {'layout': layout, 'title': self.title, 'form': form}
def edit_agency(self, request, form): if form.submitted(request): form.update_model(self) request.success(_("Your changes were saved")) return redirect(request.link(self)) if not form.errors: form.apply_model(self) layout = AgencyLayout(self, request) layout.breadcrumbs.append(Link(_("Edit"), '#')) return {'layout': layout, 'title': self.title, 'form': form}
def get_global_tools(request): for item in get_global_tools_base(request): if getattr(item, 'title', None) == 'Management': item.links.append( Link(text=_("Hidden contents"), url=request.class_link(Organisation, name='view-hidden'), attrs={"class": "hidden-contents"})) yield item
def view_people(self, request): request.include('common') request.include('chosen') request.include('people-select') if not request.is_logged_in: self.exclude_hidden = True letters = [ Link( text=letter.upper(), url=request.link( self.for_filter( letter=letter if (letter != self.letter) else None)), active=(letter == self.letter), ) for letter in self.used_letters ] Option = namedtuple('Option', ['title', 'value', 'selected']) agencies = [ Option( title=agency, value=request.link(self.for_filter(agency=agency)), selected=(agency == self.agency), ) for agency in self.used_agencies ] agencies.insert( 0, Option( title='', value=request.link(self.for_filter(agency=None)), selected=(self.agency is None), )) people = self.batch class AtoZPeople(AtoZ): def get_title(self, item): return item.title def get_items(self): return people def get_items_by_letter(self): items_by_letter = OrderedDict() for letter, items in groupby(self.get_items(), self.sortkey): items_by_letter[unidecode(letter)] = tuple(items) return items_by_letter people = AtoZPeople(request).get_items_by_letter() return { 'title': _("People"), 'layout': ExtendedPersonCollectionLayout(self, request), 'letters': letters, 'agencies': agencies, 'people': people.items() }
def on_request(self): self.request.include('common') self.request.include('chosen') self.parent_id.choices = self.request.session.query( ExtendedAgency.id.cast(String), ExtendedAgency.title ).order_by(func.unaccent(ExtendedAgency.title)).all() self.parent_id.choices.insert( 0, ('root', self.request.translate(_("- Root -"))) )
def view_agencies(self, request): pdf_link = None if request.app.root_pdf_exists: pdf_link = request.link(self, name='pdf') return { 'title': _("Agencies"), 'agencies': self.roots, 'pdf_link': pdf_link, 'layout': AgencyCollectionLayout(self, request) }
def view_hidden_agencies(self, request): session = request.session agencies = ExtendedAgencyCollection(session).query() agencies = agencies.filter( ExtendedAgency.meta['is_hidden_from_public'] == True ) agencies = agencies.order_by(None).order_by(ExtendedAgency.title) agencies = agencies.all() memberships = AgencyMembershipCollection(session).query( order_by='order_within_agency' ) memberships = memberships.filter( AgencyMembership.meta['is_hidden_from_public'] == True ) memberships = memberships.order_by(None).order_by(AgencyMembership.title) memberships = memberships.all() people = ExtendedPersonCollection(session).query() people = people.filter( ExtendedPerson.meta['is_hidden_from_public'] == True ) people = people.order_by(None).order_by( ExtendedPerson.last_name, ExtendedPerson.first_name ) people = people.all() layout = DefaultLayout(self, request) layout.breadcrumbs.append(Link(_("Hidden contents"), '#')) return { 'title': _("Hidden contents"), 'agencies': agencies, 'memberships': memberships, 'people': people, 'layout': layout }
class MoveAgencyForm(Form): """ Form to move an agency. """ parent_id = ChosenSelectField( label=_("Destination"), choices=[], validators=[ validators.InputRequired() ] ) def on_request(self): self.request.include('common') self.request.include('chosen') self.parent_id.choices = self.request.session.query( ExtendedAgency.id.cast(String), ExtendedAgency.title ).order_by(func.unaccent(ExtendedAgency.title)).all() self.parent_id.choices.insert( 0, ('root', self.request.translate(_("- Root -"))) ) def update_model(self, model): session = self.request.session agencies = ExtendedAgencyCollection(session) parent_id = None parent = None if self.parent_id.data.isdigit(): parent_id = int(self.parent_id.data) parent = agencies.by_id(parent_id) model.name = agencies.get_unique_child_name(model.title, parent) model.parent_id = parent_id def apply_model(self, model): def remove(item): self.parent_id.choices.pop( self.parent_id.choices.index((str(item.id), item.title)) ) def remove_with_children(item): remove(item) for child in item.children: remove_with_children(child) if model.parent: remove(model.parent) else: self.parent_id.choices.pop(0) remove_with_children(model)
def move_agency(self, request, form): if form.submitted(request): form.update_model(self) request.success(_("Agency moved")) return redirect(request.link(self)) if not form.errors: form.apply_model(self) layout = AgencyLayout(self, request) layout.breadcrumbs.append(Link(_("Move"), '#')) return { 'layout': layout, 'title': self.title, 'helptext': _("Moves the whole agency and all its people and suborganizations " "to the given destination."), 'form': form }
class ExtendedAgencyForm(Form): """ Form to edit agencies. """ title = StringField( label=_("Title"), validators=[ validators.InputRequired() ], ) portrait = TextAreaField( label=_("Portrait"), render_kw={'rows': 10} ) organigram = UploadField( label=_("Organigram"), validators=[ WhitelistedMimeType({ 'image/jpeg', 'image/png', }), FileSizeLimit(1 * 1024 * 1024) ] ) export_fields = MultiCheckboxField( label=_("Fields to include for each membership"), choices=[ ('membership.title', _("Membership: Title")), ('membership.since', _("Membership: Since")), ('membership.addition', _("Membership: Addition")), ('person.title', _("Person: Title")), ('person.function', _("Person: Function")), ('person.last_name', _("Person: Last Name")), ('person.first_name', _("Person: First Name")), ('person.born', _("Person: Born")), ('person.academic_title', _("Person: Academic Title")), ('person.profession', _("Person: Profession")), ('person.address', _("Person: Address")), ('person.political_party', _("Person: Political Party")), ('person.parliamentary_group', _("Person: Parliamentary Group")), ('person.phone', _("Person: Phone")), ('person.phone_direct', _("Person: Direct Phone")), ], default=['membership.title', 'person.title'], fieldset=_("PDF Export"), render_kw={'class_': 'sortable-multi-checkbox'} ) def on_request(self): self.request.include('sortable-multi-checkbox') def get_useful_data(self): exclude = {'csrf_token', 'organigram'} result = super(ExtendedAgencyForm, self).get_useful_data(exclude) if self.organigram.data: result['organigram_file'] = self.organigram.raw_data[-1].file return result def update_model(self, model): model.title = self.title.data model.portrait = self.portrait.data model.export_fields = self.export_fields.data if self.organigram.action == 'delete': del model.organigram if self.organigram.action == 'replace': if self.organigram.data: model.organigram_file = self.organigram.raw_data[-1].file if hasattr(self, 'is_hidden_from_public'): model.is_hidden_from_public = self.is_hidden_from_public.data def reorder_export_fields(self): titles = dict(self.export_fields.choices) self.export_fields.choices = [ (choice, titles[choice]) for choice in self.export_fields.data ] + [ choice for choice in self.export_fields.choices if choice[0] not in self.export_fields.data ] def apply_model(self, model): self.title.data = model.title self.portrait.data = model.portrait self.export_fields.data = model.export_fields if model.organigram_file: fs = FieldStorage() fs.file = BytesIO(model.organigram_file.read()) fs.type = model.organigram_file.content_type fs.filename = model.organigram_file.filename self.organigram.data = self.organigram.process_fieldstorage(fs) if hasattr(self, 'is_hidden_from_public'): self.is_hidden_from_public.data = model.is_hidden_from_public self.reorder_export_fields()
class AgencySettingsForm(Form): pdf_layout = RadioField( label=_("PDF Layout"), fieldset=_("Layout"), default='default', choices=[ ('default', _("Default")), ('ar', "Kanton Appenzell Ausserrhoden"), ('zg', "Kanton Zug"), ], ) root_pdf_page_break = RadioField( label=_('For root PDF, page after every:'), fieldset=_("Layout"), choices=[ ('1', _("1 Heading")), ('2', _("1.1 Heading")), ('3', _("1.1.1 Heading")), ], ) orga_pdf_page_break = RadioField( label=_("For organisation PDF's, page after every:"), fieldset=_("Layout"), choices=[ ('1', _("1 Heading")), ('2', _("1.1 Heading")), ('3', _("1.1.1 Heading")), ], ) report_changes = BooleanField( label=_("Users may report corrections"), fieldset=_("Data"), default=True, ) def process_obj(self, obj): super().process_obj(obj) self.pdf_layout.data = obj.meta.get('pdf_layout', 'default') self.root_pdf_page_break.data = str( obj.meta.get('page_break_on_level_root_pdf', 1)) self.orga_pdf_page_break.data = str( obj.meta.get('page_break_on_level_orga_pdf', 1)) self.report_changes.data = obj.meta.get('report_changes', True) def populate_obj(self, obj, *args, **kwargs): super().populate_obj(obj, *args, **kwargs) obj.meta['pdf_layout'] = self.pdf_layout.data obj.meta['report_changes'] = self.report_changes.data obj.meta['page_break_on_level_root_pdf'] = \ int(self.root_pdf_page_break.data) obj.meta['page_break_on_level_orga_pdf'] = \ int(self.orga_pdf_page_break.data)
def handle_pdf_layout_settings(self, request, form): return handle_generic_settings(self, request, form, _("Agencies"))
) def process_obj(self, obj): super().process_obj(obj) self.pdf_layout.data = obj.meta.get('pdf_layout', 'default') self.root_pdf_page_break.data = str( obj.meta.get('page_break_on_level_root_pdf', 1)) self.orga_pdf_page_break.data = str( obj.meta.get('page_break_on_level_orga_pdf', 1)) self.report_changes.data = obj.meta.get('report_changes', True) def populate_obj(self, obj, *args, **kwargs): super().populate_obj(obj, *args, **kwargs) obj.meta['pdf_layout'] = self.pdf_layout.data obj.meta['report_changes'] = self.report_changes.data obj.meta['page_break_on_level_root_pdf'] = \ int(self.root_pdf_page_break.data) obj.meta['page_break_on_level_orga_pdf'] = \ int(self.orga_pdf_page_break.data) @AgencyApp.form(model=Organisation, name='agency-settings', template='form.pt', permission=Secret, form=AgencySettingsForm, setting=_("Agencies"), icon='fa-university') def handle_pdf_layout_settings(self, request, form): return handle_generic_settings(self, request, form, _("Agencies"))
def get_top_navigation(request): yield Link(text=_("People"), url=request.class_link(ExtendedPersonCollection)) yield Link(text=_("Agencies"), url=request.class_link(ExtendedAgencyCollection))