Пример #1
0
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
    }
Пример #2
0
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
    }
Пример #3
0
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
    }
Пример #4
0
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}
Пример #5
0
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}
Пример #6
0
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()])
Пример #7
0
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}
Пример #8
0
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}
Пример #9
0
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}
Пример #10
0
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
Пример #11
0
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()
    }
Пример #12
0
    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 -")))
        )
Пример #13
0
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)
    }
Пример #14
0
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
    }
Пример #15
0
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)
Пример #16
0
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
    }
Пример #17
0
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()
Пример #18
0
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)
Пример #19
0
def handle_pdf_layout_settings(self, request, form):
    return handle_generic_settings(self, request, form, _("Agencies"))
Пример #20
0
    )

    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"))
Пример #21
0
def get_top_navigation(request):
    yield Link(text=_("People"),
               url=request.class_link(ExtendedPersonCollection))
    yield Link(text=_("Agencies"),
               url=request.class_link(ExtendedAgencyCollection))