Exemple #1
0
def publish_event(self, request):
    """ Publish an event. """

    self.publish()

    request.success(_("You have accepted the event ${title}", mapping={
        'title': self.title
    }))

    if self.meta.get('submitter_email'):

        session = request.app.session()
        ticket = TicketCollection(session).by_handler_id(self.id.hex)

        send_html_mail(
            request=request,
            template='mail_event_accepted.pt',
            subject=_("Your event was accepted"),
            receivers=(self.meta.get('submitter_email'), ),
            content={
                'model': self,
                'ticket': ticket
            }
        )

    if 'return-to' in request.GET:
        return morepath.redirect(request.GET['return-to'])

    return morepath.redirect(request.link(self))
def view_upload_election(self, request):
    """ Upload results of an election.

    Redirects to the majorz or proporz upload view.

    """

    if self.type == 'majorz':
        return morepath.redirect(request.link(self, 'upload-majorz'))
    return morepath.redirect(request.link(self, 'upload-proporz'))
Exemple #3
0
def view_latest_event(self, request):
    """ Redirects to the latest occurrence of an event that is, either the
    next future event or the last event in the past if there are no more
    future events.

    """

    now = utcnow()

    for occurrence in self.occurrences:
        if now < occurrence.start:
            return morepath.redirect(request.link(occurrence))

    return morepath.redirect(request.link(occurrence))
Exemple #4
0
def handle_edit_reservation(self, request, form):

    # this view is public, but only for a limited time
    assert_anonymous_access_only_temporary(self, request)

    collection = ResourceCollection(request.app.libres_context)
    resource = collection.by_id(self.resource)

    if form.submitted(request):
        scheduler = resource.get_scheduler(request.app.libres_context)
        try:
            if self.email != form.email.data:
                scheduler.change_email(self.token, form.email.data)

            start, end = form.get_date_range()
            scheduler.change_reservation(
                self.token, self.id, start, end, quota=form.data.get('quota')
            )
        except LibresError as e:
            utils.show_libres_error(e, request)
        else:
            forms = FormCollection(request.app.session())
            submission = forms.submissions.by_id(self.token)
            confirm_link = request.link(self, 'bestaetigung')

            if submission is None:
                return morepath.redirect(confirm_link)
            else:
                return morepath.redirect(
                    get_submission_link(request, submission, confirm_link)
                )

    form.apply_model(self)

    layout = ReservationLayout(resource, request)
    layout.breadcrumbs.append(Link(_("Edit Reservation"), '#'))

    title = _("Change reservation for ${title}", mapping={
        'title': resource.title,
    })

    return {
        'layout': layout,
        'title': title,
        'form': form,
        'allocation': self,
        'button_text': _("Continue")
    }
def handle_password_reset_request(self, request, form):
    """ Handles the GET and POST password reset requests. """
    if form.submitted(request):
        user, token = form.get_token(request)
        if user is not None and token is not None:
            url = "{0}?token={1}".format(request.link(self, name="reset-password"), token)
            send_html_mail(
                request=request,
                template="mail_password_reset.pt",
                subject=_("Password reset"),
                receivers=(user.username,),
                content={"model": None, "url": url},
            )
        else:
            log.info("Failed password reset attempt by {}".format(request.client_addr))

        response = morepath.redirect(request.link(self))
        request.success(
            _(
                (
                    u"A password reset link has been sent to ${email}, provided an "
                    u"account exists for this email address."
                ),
                mapping={"email": form.email.data},
            )
        )
        return response

    layout = DefaultLayout(self, request)
    layout.breadcrumbs = [
        Link(_("Homepage"), layout.homepage_url),
        Link(_("Reset password"), request.link(self, name="request-password")),
    ]

    return {"layout": layout, "title": _(u"Reset password"), "form": form, "form_width": "small"}
def handle_password_reset(self, request, form):
    request.include("common")
    request.include("check_password")

    if form.submitted(request):
        identity = form.get_identity(request)
        if identity is not None:
            response = morepath.redirect(request.link(self))
            morepath.remember_identity(response, request, identity)
            request.success(_("Password changed."))
            return response
        else:
            request.alert(_("Wrong username or password reset link not valid any more."))
            log.info("Failed password reset attempt by {}".format(request.client_addr))

    if "token" in request.params:
        form.token.data = request.params["token"]

    layout = DefaultLayout(self, request)
    layout.breadcrumbs = [
        Link(_("Homepage"), layout.homepage_url),
        Link(_("Reset password"), request.link(self, name="request-password")),
    ]

    return {"layout": layout, "title": _(u"Reset password"), "form": form, "form_width": "small"}
def delete_upload_token(self, request, form):

    """ Delete the upload token item. """

    layout = ManageUploadTokensLayout(self, request)

    if form.submitted(request):
        upload_tokens = UploadTokenCollection(request.session)
        upload_tokens.delete(self)
        request.message(_("Upload token deleted."), 'success')
        return morepath.redirect(layout.manage_model_link)

    return {
        'message': _(
            'Do you really want to delete "${item}"?',
            mapping={'item': self.token}
        ),
        'layout': layout,
        'form': form,
        'title': self.token,
        'subtitle': _("Delete upload token"),
        'button_text': _("Delete upload token"),
        'button_class': 'alert',
        'cancel': layout.manage_model_link
    }
def edit_election(self, request, form):
    """ Edit an existing election. """

    layout = ManageElectionsLayout(self, request)
    archive = ArchivedResultCollection(request.session)

    form.set_domain(request.app.principal)

    if form.submitted(request):
        form.update_model(self)
        archive.update(self, request)
        request.message(_("Election modified."), 'success')
        return redirect(layout.manage_model_link)

    if not form.errors:
        form.apply_model(self)

    return {
        'layout': layout,
        'form': form,
        'title': self.title,
        'shortcode': self.shortcode,
        'subtitle': _("Edit election"),
        'cancel': layout.manage_model_link
    }
def view_trigger_notficiations(self, request, form):

    """ Trigger the notifications of the current election day. """

    layout = ManageLayout(self, request)
    session = request.session

    if form.submitted(request):
        notifications = NotificationCollection(session)
        notifications.trigger_summarized(
            request,
            form.election_models(session),
            form.vote_models(session),
            form.notifications.data
        )
        request.message(_("Notifications triggered."), 'success')
        return redirect(layout.manage_link)

    latest_date = form.latest_date(session)
    latest_date = layout.format_date(latest_date, 'date_long')

    return {
        'layout': layout,
        'form': form,
        'title': _("Trigger notifications"),
        'subtitle': _(
            "Elections and votes on ${date}",
            mapping={'date': latest_date}
        ),
        'cancel': layout.manage_link
    }
Exemple #10
0
def handle_cleanup_allocations(self, request, form):
    """ Removes all unused allocations between the given dates. """

    if form.submitted(request):
        start, end = form.data['start'], form.data['end']

        scheduler = self.get_scheduler(request.app.libres_context)
        count = scheduler.remove_unused_allocations(start, end)

        request.success(
            _("Successfully removed ${count} unused allocations", mapping={
                'count': count
            })
        )

        return morepath.redirect(request.link(self))

    layout = ResourceLayout(self, request)
    layout.breadcrumbs.append(Link(_("Clean up"), '#'))
    layout.editbar_links = None

    return {
        'layout': layout,
        'title': _("Clean up"),
        'form': form
    }
def clear_election_compound(self, request, form):
    """ Clear the results of an election ompound. """

    layout = ManageElectionCompoundsLayout(self, request)
    archive = ArchivedResultCollection(request.session)

    if form.submitted(request):
        archive.clear(self, request)
        request.message(_("Results deleted."), 'success')
        return redirect(layout.manage_model_link)

    return {
        'message': _(
            'Do you really want to clear all party results of "${item}"?',
            mapping={
                'item': self.title
            }
        ),
        'layout': layout,
        'form': form,
        'title': self.title,
        'shortcode': self.shortcode,
        'subtitle': _("Clear results"),
        'button_text': _("Clear results"),
        'button_class': 'alert',
        'cancel': layout.manage_model_link
    }
def handle_new_definition(self, request, form):

    if form.submitted(request):

        model = Bunch(
            title=None, definition=None, type='custom', meta={}, content={}
        )
        form.update_model(model)

        # forms added online are always custom forms
        new_form = self.definitions.add(
            title=model.title,
            definition=model.definition,
            type='custom',
            meta=model.meta,
            content=model.content
        )

        request.success(_("Added a new form"))
        return morepath.redirect(request.link(new_form))

    layout = FormEditorLayout(self, request)
    layout.breadcrumbs = [
        Link(_("Homepage"), layout.homepage_url),
        Link(_("Forms"), request.link(self)),
        Link(_("New Form"), request.link(self, name='neu'))
    ]

    return {
        'layout': layout,
        'title': _("New Form"),
        'form': form,
        'form_width': 'large',
    }
def handle_edit_definition(self, request, form):

    if form.submitted(request):
        self.title = form.title.data

        if self.type == 'custom':
            self.definition = form.definition.data

        form.update_model(self)

        request.success(_("Your changes were saved"))
        return morepath.redirect(request.link(self))
    else:
        form.title.data = self.title
        form.definition.data = self.definition
        form.apply_model(self)

    collection = FormCollection(request.app.session())

    layout = FormEditorLayout(self, request)
    layout.breadcrumbs = [
        Link(_("Homepage"), layout.homepage_url),
        Link(_("Forms"), request.link(collection)),
        Link(self.title, request.link(self)),
        Link(_("Edit"), request.link(self, name='bearbeiten'))
    ]

    return {
        'layout': layout,
        'title': self.title,
        'form': form,
        'form_width': 'large',
    }
Exemple #14
0
def search(self, request):

    layout = DefaultLayout(self, request)
    layout.breadcrumbs.append(Link(_("Search"), "#"))

    try:
        request.app.es_client.ping()
    except TransportError:
        log.warn("Elasticsearch cluster is offline")
        return {"title": _("Search Unavailable"), "layout": layout, "connection": False}

    if "lucky" in request.GET:
        url = self.feeling_lucky()

        if url:
            return morepath.redirect(url)

    return {
        "title": _("Search"),
        "model": self,
        "layout": layout,
        "hide_search_header": True,
        "searchlabel": _("Search through ${count} indexed documents", mapping={"count": self.available_documents}),
        "resultslabel": _("${count} Results", mapping={"count": self.subset_count}),
        "connection": True,
    }
def delete_subscriber(self, request, form):

    """ Delete a single subsriber. """

    layout = ManageSubscribersLayout(self, request)

    if form.submitted(request):
        subscribers = SubscriberCollection(request.session)
        subscribers.unsubscribe(self.address)
        request.message(_("Subscriber deleted."), 'success')
        return redirect(layout.manage_model_link)

    return {
        'message': _(
            'Do you really want to delete "${item}"?',
            mapping={
                'item': self.address
            }
        ),
        'layout': layout,
        'form': form,
        'title': self.address,
        'subtitle': _("Delete subscriber"),
        'button_text': _("Delete subscriber"),
        'button_class': 'alert',
        'cancel': layout.manage_model_link
    }
Exemple #16
0
def view_topic(self, request):

    assert self.trait in {'link', 'page'}

    if not request.is_logged_in and self.trait == 'link':
        return morepath.redirect(self.content['url'])

    layout = PageLayout(self, request)

    if request.is_logged_in:
        layout.editbar_links = self.get_editbar_links(request)
        children = self.children
    else:
        children = request.exclude_invisible(self.children)

    return {
        'layout': layout,
        'title': self.title,
        'name': self.trait_messages[self.trait]['name'],
        'page': self,
        'children': [
            Link(child.title, request.link(child), model=child)
            for child in sorted(children, key=lambda c: c.name)
        ]
    }
def handle_defined_form(self, request, form):
    """ Renders the empty form and takes input, even if it's not valid, stores
    it as a pending submission and redirects the user to the view that handles
    pending submissions.

    """

    collection = FormCollection(request.app.session())

    if request.POST:
        submission = collection.submissions.add(
            self.name, form, state='pending')

        return morepath.redirect(request.link(submission))

    return {
        'layout': FormSubmissionLayout(self, request),
        'title': self.title,
        'form': form,
        'definition': self,
        'form_width': 'small',
        'lead': self.meta.get('lead'),
        'text': self.content.get('text'),
        'people': self.people,
        'contact': self.contact_html
    }
def delete_election_compound(self, request, form):
    """ Delete an existing election compound. """

    layout = ManageElectionCompoundsLayout(self, request)
    archive = ArchivedResultCollection(request.session)

    if form.submitted(request):
        archive.delete(self, request)

        request.message(_("Compound deleted."), 'success')
        return redirect(layout.manage_model_link)

    return {
        'message': _(
            'Do you really want to delete "${item}"?',
            mapping={
                'item': self.title
            }
        ),
        'layout': layout,
        'form': form,
        'title': self.title,
        'shortcode': self.shortcode,
        'subtitle': _("Delete compound"),
        'button_text': _("Delete compound"),
        'button_class': 'alert',
        'cancel': layout.manage_model_link
    }
Exemple #19
0
def handle_new_page(self, request, form, src=None):

    if form.submitted(request):
        pages = PageCollection(request.app.session())
        page = pages.add(
            parent=self.page,
            title=form.title.data,
            type=self.page.type,
            meta={'trait': self.trait}
        )
        form.update_model(page)
        request.app.update_homepage_pages()

        request.success(page.trait_messages[page.trait]['new_page_added'])
        return morepath.redirect(request.link(page))

    if src:
        form.apply_model(src)

    site_title = self.page.trait_messages[self.trait]['new_page_title']

    return {
        'layout': EditorLayout(self, request, site_title),
        'title': site_title,
        'form': form,
        'form_width': 'large'
    }
Exemple #20
0
def reopen_ticket(self, request):
    user = UserCollection(request.app.session()).by_username(
        request.identity.userid)

    try:
        self.reopen_ticket(user)
    except InvalidStateChange:
        request.alert(
            _("The ticket cannot be re-opened because it's not closed.")
        )
    else:
        request.success(_("You have reopened ticket ${number}", mapping={
            'number': self.number
        }))

    email = self.snapshot.get('email') or self.handler.email

    send_html_mail(
        request=request,
        template='mail_ticket_reopened.pt',
        subject=_("Your ticket has been reopened"),
        receivers=(email, ),
        content={
            'model': self
        }
    )

    request.app.update_ticket_count()

    return morepath.redirect(request.link(self))
Exemple #21
0
def close_ticket(self, request):

    try:
        self.close_ticket()
    except InvalidStateChange:
        request.alert(
            _("The ticket cannot be closed because it's not pending")
        )
    else:
        request.success(_("You have closed ticket ${number}", mapping={
            'number': self.number
        }))

    email = self.snapshot.get('email') or self.handler.email

    send_html_mail(
        request=request,
        template='mail_ticket_closed.pt',
        subject=_("Your ticket has been closed"),
        receivers=(email, ),
        content={
            'model': self
        }
    )

    request.app.update_ticket_count()

    return morepath.redirect(
        request.link(TicketCollection(request.app.session())))
Exemple #22
0
def accept_reservation(self, request):
    if not self.data or not self.data.get('accepted'):
        collection = ResourceCollection(request.app.libres_context)
        resource = collection.by_id(self.resource)
        scheduler = resource.get_scheduler(request.app.libres_context)
        reservations = scheduler.reservations_by_token(self.token)

        send_html_mail(
            request=request,
            template='mail_reservation_accepted.pt',
            subject=_("Your reservation was accepted"),
            receivers=(self.email, ),
            content={
                'model': self,
                'resource': resource,
                'reservations': reservations
            }
        )

        for reservation in reservations:
            reservation.data = reservation.data or {}
            reservation.data['accepted'] = True

            # libres does not automatically detect changes yet
            flag_modified(reservation, 'data')

        request.success(_("The reservation was accepted"))
    else:
        request.warning(_("The reservation has already been accepted"))

    return morepath.redirect(request.params['return-to'])
Exemple #23
0
def reject_reservation(self, request):
    collection = ResourceCollection(request.app.libres_context)
    resource = collection.by_id(self.resource)
    scheduler = resource.get_scheduler(request.app.libres_context)
    reservations = scheduler.reservations_by_token(self.token.hex)
    forms = FormCollection(request.app.session())
    submission = forms.submissions.by_id(self.token.hex)

    send_html_mail(
        request=request,
        template='mail_reservation_rejected.pt',
        subject=_("Your reservation was rejected"),
        receivers=(self.email, ),
        content={
            'model': self,
            'resource': resource,
            'reservations': reservations
        }
    )

    # create a snapshot of the ticket to keep the useful information
    tickets = TicketCollection(request.app.session())
    ticket = tickets.by_handler_id(self.token.hex)
    ticket.create_snapshot(request)

    scheduler.remove_reservation(self.token.hex)

    if submission:
        forms.submissions.delete(submission)

    request.success(_("The reservation was rejected"))

    # return none on intercooler js requests
    if not request.headers.get('X-IC-Request'):
        return morepath.redirect(request.params['return-to'])
def delete_data_source_item(self, request, form):

    """ Delete the data source item. """

    layout = ManageDataSourceItemsLayout(self.source, request)

    if form.submitted(request):
        data_source_items = DataSourceItemCollection(request.session)
        data_source_items.delete(self)
        request.message(_("Mapping deleted."), 'success')
        return morepath.redirect(layout.manage_model_link)

    return {
        'message': _(
            'Do you really want to delete "${item}"?',
            mapping={
                'item': self.name
            }
        ),
        'layout': layout,
        'form': form,
        'title': self.name,
        'subtitle': _("Delete mapping"),
        'button_text': _("Delete mapping"),
        'button_class': 'alert',
        'cancel': layout.manage_model_link
    }
def handle_complete_submission(self, request):
    form = request.get_form(self.form_class, data=self.data)

    # we're not really using a csrf protected form here (the complete form
    # button is basically just there so we can use a POST instead of a GET)
    form.validate()
    form.ignore_csrf_error()

    if form.errors:
        return morepath.redirect(request.link(self))
    else:
        if self.state == 'complete':
            self.data.changed()  # trigger updates
            request.success(_(u"Your changes were saved"))

            return morepath.redirect(request.link(
                FormCollection(request.app.session()).scoped_submissions(
                    self.name, ensure_existance=False)
            ))
        else:
            collection = FormCollection(request.app.session())
            collection.submissions.complete_submission(self)

            # make sure accessing the submission doesn't flush it, because
            # it uses sqlalchemy utils observe, which doesn't like premature
            # flushing at all
            with collection.session.no_autoflush:
                ticket = TicketCollection(request.app.session()).open_ticket(
                    handler_code='FRM', handler_id=self.id.hex
                )

            send_html_mail(
                request=request,
                template='mail_ticket_opened.pt',
                subject=_("A ticket has been opened"),
                receivers=(self.email, ),
                content={
                    'model': ticket
                }
            )

            request.success(_("Thank you for your submission!"))
            request.app.update_ticket_count()

            return morepath.redirect(request.link(ticket, 'status'))
def handle_pending_submission(self, request):
    """ Renders a pending submission, takes it's input and allows the
    user to turn the submission into a complete submission, once all data
    is valid.

    Takes the following query parameters for customization::

        * ``edit`` no validation is done on the first load if present
        * ``return-to`` the view redirects to this url once complete if present
        * ``title`` a custom title (required if external submission)
        * ``quiet`` no success messages are rendered if present

    """
    collection = FormCollection(request.app.session())

    form = request.get_form(self.form_class, data=self.data)
    form.action = request.link(self)

    if 'edit' not in request.GET:
        form.validate()

    if not request.POST:
        form.ignore_csrf_error()
    else:
        collection.submissions.update(self, form)

    # these parameters keep between form requests (the rest throw away)
    for param in {'return-to', 'title', 'quiet'}:
        if param in request.GET:
            action = URL(form.action).query_param(param, request.GET[param])
            form.action = action.as_string()

    completable = not form.errors and 'edit' not in request.GET

    if completable and 'return-to' in request.GET:

        if 'quiet' not in request.GET:
            request.success(_("Your changes were saved"))

        return morepath.redirect(request.GET['return-to'])

    if 'title' in request.GET:
        title = request.GET['title']
    else:
        title = self.form.title

    return {
        'layout': FormSubmissionLayout(self, request, title),
        'title': title,
        'form': form,
        'completable': completable,
        'edit_link': request.link(self) + '?edit',
        'complete_link': request.link(self, 'complete'),
        'is_pending': self.state == 'pending',
        'readonly': 'readonly' in request.GET,
    }
def manage_data_source(self, request):

    """ Manage the data source.

    Redirect to the list of data source items.

    """

    layout = ManageDataSourceItemsLayout(self, request)
    return morepath.redirect(layout.manage_model_link)
Exemple #28
0
def handle_new_allocation(self, request, form):
    """ Handles new allocations for differing form classes. """

    if form.submitted(request):
        scheduler = self.get_scheduler(request.app.libres_context)

        try:
            allocations = scheduler.allocate(
                dates=form.dates,
                whole_day=form.whole_day,
                quota=form.quota,
                quota_limit=form.quota_limit,
                data=form.data,
                partly_available=form.partly_available
            )
        except LibresError as e:
            utils.show_libres_error(e, request)
        else:
            request.success(_("Successfully added ${n} allocations", mapping={
                'n': len(allocations)
            }))

            self.highlight_allocations(allocations)
            return morepath.redirect(request.link(self))
    elif not request.POST:
        start, end = utils.parse_fullcalendar_request(request, self.timezone)
        whole_day = request.params.get('whole_day') == 'yes'

        if start and end:
            if whole_day:
                form.start.data = start
                form.end.data = end

                if hasattr(form, 'as_whole_day'):
                    form.as_whole_day.data = 'yes'
            else:
                form.start.data = start
                form.end.data = end

                if hasattr(form, 'as_whole_day'):
                    form.as_whole_day.data = 'no'

                if hasattr(form, 'start_time'):
                    form.start_time.data = start
                    form.end_time.data = end

    layout = ResourceLayout(self, request)
    layout.breadcrumbs.append(Link(_("New allocation"), '#'))
    layout.editbar_links = None

    return {
        'layout': layout,
        'title': _("New allocation"),
        'form': form
    }
Exemple #29
0
def accept_ticket(self, request):
    user = UserCollection(request.app.session()).by_username(
        request.identity.userid)

    self.accept_ticket(user)

    request.success(_(u"You have accepted ticket ${number}", mapping={
        'number': self.number
    }))

    request.app.update_ticket_count()

    return morepath.redirect(request.link(self))
Exemple #30
0
def handle_edit_event(self, request, form):
    """ Edit an event.

    An anonymous user might edit an initiated event, a logged in user can also
    edit all events.

    """

    assert_anonymous_access_only_temporary(request, self)

    if form.submitted(request):
        form.update_model(self)

        request.success(_("Your changes were saved"))

        if 'return-to' in request.GET:
            return morepath.redirect(request.GET['return-to'])

        return morepath.redirect(request.link(self))

    form.apply_model(self)

    if 'return-to' in request.GET:
        action = URL(form.action)
        action = action.query_param('return-to', request.GET['return-to'])
        form.action = action.as_string()

    layout = EventLayout(self, request)
    layout.breadcrumbs.append(Link(_("Edit"), '#'))
    layout.editbar_links = []

    return {
        'layout': layout,
        'title': self.title,
        'form': form,
        'form_width': 'large'
    }
Exemple #31
0
 def finalize(self):
     self.clear()
     return morepath.redirect(self.request.link(self.context))
Exemple #32
0
def modal_process_delete(context, request):
    if not context.delete_view_enabled:
        raise HTTPNotFound()
    context.model.delete()
    return morepath.redirect(
        request.link(context.collection_ui, "+modal-close"))
def root_default(self, request):
    return morepath.redirect('/customers')
Exemple #34
0
def create(self, request, appstruct):
    policy = Policy(**appstruct)
    request.db_session.add(policy)
    request.db_session.flush()
    return redirect(request.link(policy))
Exemple #35
0
def view_default_assistant(self, request):
    return morepath.redirect(request.link(self.assistant))
Exemple #36
0
def process_profile(context, request):
    userinfo_f = userinfo_form(request)
    password_f = password_form(request)
    controls = list(request.POST.items())
    controls_dict = dict(controls)
    active_form = controls_dict['__formid__']

    user = context.model

    attributes_f = attributes_form(user, request)

    failed = False
    if active_form == 'userinfo-form':
        try:
            data = userinfo_f.validate(controls)
        except deform.ValidationFailure as e:
            failed = True
            userinfo_f = e
            userdata = userinfo_f.field.schema.serialize(user.data.as_dict())
            for k in userdata.keys():
                if userinfo_f.cstruct[k] is not colander.null:
                    userdata[k] = userinfo_f.cstruct[k]
            userinfo_f.field.cstruct = userdata

        if not failed:
            updatedata = {}
            for f in ['email']:
                updatedata[f] = data[f]
            user.update(updatedata)

        if not failed:
            request.notify('success', 'Profile updated',
                           'Your profile have been successfully updated')
            return morepath.redirect(request.url)
    elif active_form == 'password-form':
        try:
            data = password_f.validate(controls)
        except deform.ValidationFailure as e:
            failed = True
            password_f = e

        if not failed:
            if not user.validate(data['password_current']):
                exc = colander.Invalid(password_f, 'Invalid password')
                password_f.widget.handle_error(password_f, exc)
                failed = True

        if not failed:
            try:
                user.change_password(data['password_current'],
                                     data['password'])
            except morpfw.authn.pas.exc.InvalidPasswordError as e:
                exc = colander.Invalid(password_f, 'Invalid password')
                password_f.widget.handle_error(password_f, exc)
                failed = True

        if not failed:
            request.notify('success', 'Password changed',
                           'Your password have been successfully changed')
            return morepath.redirect(request.url)
    elif active_form == 'personalinfo-form':
        try:
            data = attributes_f.validate(controls)
        except deform.ValidationFailure as e:
            failed = True
            attributes_f = e

        if not failed:
            xattrprovider = user.xattrprovider()
            xattrprovider.update(data)
            request.notify('success', 'Profile updated',
                           'Your profile have been successfully updated')
            return morepath.redirect(request.url)

    else:
        request.notify('error', 'Unknown form',
                       'Invalid form identifier was supplied')

        return morepath.redirect(request.url)

    has_photo = user.get_blob('profile-photo')
    return {
        'page_title':
        'Personal Settings',
        'profile_photo':
        request.link(context, '+download?field=profile-photo')
        if has_photo else None,
        'forms': [{
            'form_title':
            'Personal Information',
            'form':
            attributes_f,
            'readonly':
            False,
            'form_data':
            user['xattrs'] if active_form != 'personalinfo-form' else None
        }, {
            'form_title':
            'User Information',
            'form':
            userinfo_f,
            'readonly':
            False,
            'form_data':
            user.data.as_dict() if active_form != 'userinfo-form' else None
        }, {
            'form_title': 'Password',
            'form': password_f,
            'readonly': False,
        }]
    }
Exemple #37
0
def root_default(self, request):
    return redirect('/documents')
Exemple #38
0
def publish_issue(self, request, form):
    """ Publish an issue.

    This moves all accepted notices related to this issue to the published
    state (if not already) and generates the PDF. The publication numbers are
    assigned during PDF creation.

    This view is only visible by a publisher.

    """

    layout = Layout(self, request)
    if not layout.publishing:
        return {
            'layout': layout,
            'title': self.name,
            'subtitle': _("Publish"),
            'callout': _("Publishing is disabled."),
            'show_form': False
        }

    if self.notices('submitted').first():
        request.message(
            _("There are submitted notices for this issue!"), 'warning'
        )
    if self.pdf:
        request.message(
            _("A PDF already exists for this issue!"), 'warning'
        )

    old_numbers = self.publication_numbers()
    if any(old_numbers.values()):
        request.message(
            _("There are already official notices with publication numbers!"),
            'warning'
        )

    if form.submitted(request):
        self.publish(request)
        request.message(_("Issue published."), 'success')

        new_numbers = self.publication_numbers()
        if any(old_numbers.values()) and old_numbers != new_numbers:
            request.message(
                _(
                    "The already assigned publication numbers have been "
                    "changed. Recreating the following issues might be needed."
                ), 'warning'
            )

        return redirect(layout.manage_issues_link)

    return {
        'layout': layout,
        'form': form,
        'title': self.name,
        'subtitle': _("Publish"),
        'button_text': _("Publish"),
        'cancel': layout.manage_issues_link,
        'message': _(
            (
                'Do you really want to publish "${item}"? This will assign '
                'the publication numbers to the official notices and create '
                'the PDF.'
            ),
            mapping={
                'item': self.name,
                'number': len(self.notices('accepted').all())
            }
        ),
    }
Exemple #39
0
def create(self, request, appstruct):
    page = Page(**appstruct)
    request.db_session.add(page)
    request.db_session.flush()
    return redirect(request.link(page))
Exemple #40
0
def modal_process_xattredit(context, request):
    result = process_xattredit(context, request)
    if isinstance(result, HTTPFound):
        return morepath.redirect(request.link(context, "+modal-close"))
    return result
Exemple #41
0
def logout(self, request):
    @request.after
    def forget(response):
        request.app.forget_identity(response, request)

    return redirect('/')
def create(self, request, appstruct):
    proposition_type = PropositionType(**appstruct)
    request.db_session.add(proposition_type)
    request.db_session.flush()
    return redirect(request.link(proposition_type))
Exemple #43
0
 def default(self, request):
     return morepath.redirect('/')
Exemple #44
0
def reject_notice(self, request, form):
    """ Reject a notice.

    This view is used by the publishers to reject a submitted notice.

    Only submitted notices may be rejected.

    """

    layout = Layout(self, request)

    if self.state != 'submitted':
        return {
            'layout': layout,
            'title': self.title,
            'subtitle': _("Reject Official Note"),
            'callout': _("Only submitted official notices may be rejected."),
            'show_form': False
        }

    if form.submitted(request):
        self.reject(request, form.comment.data)
        request.message(_("Official notice rejected."), 'success')
        if self.user:
            request.app.send_transactional_email(
                subject=request.translate(
                    _("Official Notice Rejected ${id}",
                      mapping={'id': self.id})),
                receivers=(self.user.username, ),
                reply_to=request.app.mail['transactional']['sender'],
                content=render_template(
                    'mail_notice_rejected.pt', request, {
                        'title':
                        request.translate(
                            _("Official Notice Rejected ${id}",
                              mapping={'id': self.id})),
                        'model':
                        self,
                        'comment':
                        form.comment.data,
                        'layout':
                        MailLayout(self, request),
                        'url':
                        request.link(self)
                    }))
        return redirect(layout.dashboard_or_notices_link)

    return {
        'message':
        _('Do you really want to reject "${item}"?',
          mapping={'item': self.title}),
        'layout':
        layout,
        'form':
        form,
        'title':
        self.title,
        'subtitle':
        _("Reject Official Note"),
        'button_text':
        _("Reject Official Note"),
        'button_class':
        'alert',
        'cancel':
        request.link(self)
    }
Exemple #45
0
 def view(self, request):
     @request.after
     def set_header(response):
         response.headers.add('Foo', 'FOO')
     return morepath.redirect('http://example.org')
Exemple #46
0
def submit_notice(self, request, form):
    """ Submit a notice.

    This view is used by the editors to submit their drafts for the publishers
    to review.

    Only drafted notices may be submitted. Editors may only submit their own
    notices (publishers may submit any notice).

    If a notice has invalid/past issues or an invalid/inactive
    category/organization, the user is redirected to the edit view.

    """

    layout = Layout(self, request)
    is_private = request.is_private(self)

    if not is_private:
        user_ids, group_ids = get_user_and_group(request)
        if not ((self.group_id in group_ids) or (self.user_id in user_ids)):
            raise HTTPForbidden()

    if self.state != 'drafted' and self.state != 'rejected':
        return {
            'layout':
            layout,
            'title':
            self.title,
            'subtitle':
            _("Submit Official Note"),
            'callout':
            _("Only drafted or rejected official notices may be submitted."),
            'show_form':
            False
        }

    if (self.expired_issues or (self.overdue_issues and not is_private)
            or self.invalid_category or self.invalid_organization):
        return redirect(request.link(self, name='edit'))

    if form.submitted(request):
        self.submit(request)
        request.message(_("Official notice submitted."), 'success')
        return redirect(layout.dashboard_or_notices_link)

    return {
        'message':
        _('Do you really want to submit "${item}"?',
          mapping={'item': self.title}),
        'layout':
        layout,
        'form':
        form,
        'title':
        self.title,
        'subtitle':
        _("Submit Official Note"),
        'button_text':
        _("Submit Official Note"),
        'cancel':
        request.link(self)
    }
Exemple #47
0
def logout(context, request):
    @request.after
    def forget(response):
        request.app.forget_identity(response, request)

    return morepath.redirect(request.relative_url('/'))
Exemple #48
0
def get_oauth_login(self, _):
    """redirect to login URL on ekklesia ID server"""
    return redirect(self.get_authorization_url())
Exemple #49
0
def collection_index(context, request):
    return morepath.redirect(
        request.link(context, "+%s" % context.default_view))
Exemple #50
0
def get_oauth_callback(self, _request):
    self.fetch_token()
    self.after_auth()
    return redirect(self.back_url or "/")
Exemple #51
0
def page_redirect(self, request):
    lang = request.i18n.get_locale().language
    url = request.class_link(Page, {'name': self.name, 'lang': lang})
    return redirect(url)
Exemple #52
0
def create(self, request, appstruct):
    department = Department(**appstruct)
    request.db_session.add(department)
    request.db_session.flush()
    return redirect(request.link(department))
Exemple #53
0
def get_oauth_callback(self, _request):
    self.fetch_token()
    self.after_auth()
    return redirect(self.redirect_after_success_url)
Exemple #54
0
def update(self, request, appstruct):
    self.update(**appstruct)
    return redirect(request.link(self))
Exemple #55
0
def model_index(context, request):
    return morepath.redirect(
        request.link(context, '+%s' % context.default_view))
Exemple #56
0
def process_delete(context, request):
    context.model.delete()
    return morepath.redirect(request.link(context.collection_ui))
Exemple #57
0
 def edit(self, request):
     if request.POST.get("submit"):
         request.app.wiki.store_page(self.name, request.POST["content"])
         return redirect(request.link(self))
     elif request.POST.get("cancel"):
         return redirect(request.link(Page("FrontPage")))
Exemple #58
0
def index(self, request):
    return redirect(request.link(Page("FrontPage")))
Exemple #59
0
def modal_process_delete(context, request):
    context.model.delete()
    return morepath.redirect(
        request.link(context.collection_ui, "+modal-close"))
def update(self, request, appstruct):
    request.db_session.add(self)
    self.update(**appstruct)
    prop = request.q(Proposition).get({"id": appstruct["proposition_id"]})
    return redirect(request.link(prop))