예제 #1
0
def handle_new_mission_report(self, request, form):

    if form.submitted(request):
        mission = self.add(
            **{
                k: v
                for k, v in form.data.items()
                if k != 'csrf_token' and not k.startswith('vehicles_')
            })

        form.populate_obj(mission)

        if mission.date.year != date.today().year:
            request.warning(
                _("The report was entered in the current year, "
                  "please verify the date"))
        else:
            request.success(_("Successfully added a mission report"))

        return request.redirect(request.link(mission))

    return {
        'title':
        _("Mission Reports"),
        'form':
        form,
        'layout':
        MissionReportLayout(self, request, Link(_("New"), '#', editbar=False)),
    }
예제 #2
0
def handle_new_vehicle(self, request, form):

    if form.submitted(request):
        vehicle = self.add(
            **{
                k: v
                for k, v in form.data.items()
                if k not in ('csrf_token', 'symbol')
            })

        # required for the symbol image
        form.populate_obj(vehicle)

        request.success(_("Successfully added a vehicle"))

        return request.redirect(
            request.class_link(MissionReportVehicleCollection))

    return {
        'title':
        _("Vehicle"),
        'form':
        form,
        'layout':
        MissionReportLayout(self, request,
                            Link(_("Vehicles"), request.link(self)),
                            Link(_("New"), '#', editbar=False)),
    }
예제 #3
0
def handle_edit_vehicle(self, request, form):

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

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

        return request.redirect(
            request.class_link(MissionReportVehicleCollection))

    elif not request.POST:
        form.process(obj=self)

    return {
        'title':
        self.title,
        'form':
        form,
        'layout':
        MissionReportLayout(
            self, request,
            Link(_("Vehicles"),
                 request.class_link(MissionReportVehicleCollection)),
            Link(self.title, '#'))
    }
예제 #4
0
 def breadcrumbs(self):
     return (
         Link(_("Homepage"), self.homepage_url),
         Link(
             _("Daycare Subsidy Calculator"),
             self.request.link(self.model)
         )
     )
예제 #5
0
    def breadcrumbs_iter(self):
        yield Link(
            _("Homepage"),
            self.homepage_url)

        yield Link(
            _("Mission Reports"),
            self.request.class_link(MissionReportCollection))

        yield from self.suffixes
예제 #6
0
def view_mission_report_vehicles(self, request):

    return {
        'layout':
        MissionReportLayout(self, request,
                            Link(_("Vehicles"), request.link(self))),
        'title':
        _("Vehicles"),
        'vehicles':
        tuple(self.query()),
    }
예제 #7
0
def view_mission_report_files(self, request):
    data = view_get_image_collection(self, request)
    data['layout'] = MissionReportLayout(
        self, request, Link(self.report.title, request.link(self.report)),
        Link(_("Images"), '#', editbar=False))

    return data
예제 #8
0
class MissionReportVehicleForm(Form):

    name = StringField(_("Name"), validators=[InputRequired()])

    description = StringField(_("Description"), validators=[InputRequired()])

    symbol = UploadFileWithORMSupport(
        _("Symbol"),
        file_class=MissionReportFile,
        validators=[
            Optional(),
            WhitelistedMimeType(IMAGE_MIME_TYPES_AND_SVG),
            FileSizeLimit(1 * 1024 * 1024)
        ])

    website = URLField(_("Website"))
예제 #9
0
def view_roadwork_collection(self, request):

    return {
        'layout': RoadworkCollectionLayout(self, request),
        'title': _("Roadworks"),
        'model': self
    }
예제 #10
0
    def pre_validate(self, form):
        for day in SERVICE_DAYS.values():
            days = sum(1 for id in self.services.available
                       if self.services.is_selected(id, day))

            if days > 1:
                raise ValidationError(_("Each day may only be selected once."))
예제 #11
0
def view_mission_reports(self, request):
    return {
        'layout': MissionReportLayout(self, request),
        'title': _("Mission Reports"),
        'reports': self.batch,
        'count': self.mission_count(),
        'year': self.year,
    }
예제 #12
0
class MissionReportForm(Form):

    date = TimezoneDateTimeField(_("Date"),
                                 timezone='Europe/Zurich',
                                 validators=[InputRequired()])

    duration = DecimalField(
        _("Mission duration (h)"),
        validators=[InputRequired(), NumberRange(0, 10000)])

    nature = TextAreaField(_("Mission nature"),
                           render_kw={'rows': 4},
                           validators=[InputRequired()])

    location = StringField(_("Location"), validators=[InputRequired()])

    personnel = IntegerField(
        _("Mission personnel"),
        validators=[InputRequired(), NumberRange(0, 10000)])

    backup = IntegerField(_("Backup personnel"),
                          validators=[InputRequired(),
                                      NumberRange(0, 10000)])

    civil_defence = BooleanField(_("Civil Defence involvement"))
예제 #13
0
def handle_roadwork_connection_error(self, request):

    @request.after
    def set_status_code(response):
        response.status_code = 500

    return {
        'layout': DefaultLayout(self, request),
        'title': _("Connection Error"),
    }
예제 #14
0
        def choice(daycare):
            label = _(
                ("${title} / day rate CHF ${rate} / "
                 "${weeks} weeks open per year"),
                mapping={
                    'title': daycare.title,
                    'rate': daycare.rate,
                    'weeks': daycare.weeks
                })

            return (daycare.id.hex, self.request.translate(label))
예제 #15
0
def view_daycare_subsidy_calculator(self, request, form):
    calculation = None

    if form.submitted(request):
        calculation = self.calculate(
            daycare=form.selected_daycare,
            services=form.services.services,
            income=form.income.data,
            wealth=form.wealth.data,
            rebate=form.rebate.data
        )

    return {
        'title': _("Daycare Subsidy Calculator"),
        'layout': DaycareSubsidyCalculatorLayout(self, request),
        'form': form,
        'calculation': calculation,
        'button_text': _("Calculate"),
        'settings': self.settings,
        'eligible': (
            calculation and calculation.city_share_per_month != '0.00'
        )
    }
예제 #16
0
def handle_edit_mission_report(self, request, form):

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

        request.success(_("Your changes were saved"))
        return request.redirect(request.link(self))

    elif not request.POST:
        form.process(obj=self)

    return {
        'title':
        _("Mission Reports"),
        'form':
        form,
        'layout':
        MissionReportLayout(
            self,
            request,
            Link(self.title, request.link(self)),
            Link(_("Edit"), '#', editbar=False),
        )
    }
예제 #17
0
        def services_table():
            total = Decimal(0)
            total_percentage = Decimal(0)

            for day in SERVICE_DAYS.values():
                for service_id in services.selected:
                    if day in services.selected[service_id]:
                        service = services.available[service_id]
                        cost = parent_share_per_day * service.percentage / 100

                        total += cost
                        total_percentage += service.percentage

                        label = SERVICE_DAYS_LABELS[day]
                        yield (label, service.title, format_5_cents(cost))

            yield (_("Total"), None, format_5_cents(total))
예제 #18
0
    def editbar_links(self):
        if not self.request.is_manager:
            return

        return [
            Link(
                text=_("Update"),
                url=self.csrf_protected_url(
                    self.request.link(self.model, '+update')
                ),
                attrs={'class': 'sync'},
                traits=Intercooler(
                    request_method='POST',
                    redirect_after=self.request.url
                )
            )
        ]
예제 #19
0
def view_streets(self, request):
    request.include('street-search')

    by_letter = {
        letter: tuple(streets)
        for letter, streets in groupby(self.streets(), lambda s: s.letter)
    }

    @lru_cache(maxsize=1)
    def link_to_street(street):
        return request.class_link(AddressSubsetCollection, {'street': street})

    return {
        'layout': AddressLayout(self, request),
        'title': _("Streets Directory"),
        'streets': by_letter,
        'link_to_street': link_to_street
    }
예제 #20
0
class DaycareSubsidyCalculatorForm(Form):

    daycare = SelectField(
        label=_("Select Daycare"),
        validators=(InputRequired(), ),
        choices=(),
    )

    services = DaycareServicesField(label=_("Care"),
                                    validators=(InputRequired(), ))

    income = DecimalField(label=_("Definite Taxable income"),
                          validators=(InputRequired(), NumberRange(min=0)))

    wealth = DecimalField(label=_("Definite Taxable wealth"),
                          validators=(InputRequired(), NumberRange(min=0)))

    rebate = BooleanField(
        label=_("Rebate"),
        description=_(
            "Does at least one child in your household attend the same "
            "daycare for more than two whole days a week?"))

    def on_request(self):
        self.daycare.choices = tuple(self.daycare_choices)

    @property
    def daycare_choices(self):
        def choice(daycare):
            label = _(
                ("${title} / day rate CHF ${rate} / "
                 "${weeks} weeks open per year"),
                mapping={
                    'title': daycare.title,
                    'rate': daycare.rate,
                    'weeks': daycare.weeks
                })

            return (daycare.id.hex, self.request.translate(label))

        for daycare in self.model.daycares.values():
            yield choice(daycare)

    @property
    def selected_daycare(self):
        for daycare in self.model.daycares.values():
            if daycare.id.hex == self.daycare.data:
                return daycare
예제 #21
0
def custom_handle_settings(self, request, form):
    return handle_generic_settings(self, request, form, _("Daycare Settings"))
예제 #22
0
            """)

    def validate_services(self, field):
        try:
            tuple(Services.parse_definition(field.data))
        except (YAMLError, TypeError, KeyError):
            raise ValidationError(_("Invalid services configuration"))

    def directory_choices(self):
        dirs = DirectoryCollection(self.request.session, type='extended')

        def choice(directory):
            return (directory.id.hex, directory.title)

        for d in dirs.query().order_by(Directory.order):
            yield choice(d)

    def on_request(self):
        self.directory.choices = list(self.directory_choices())


@WinterthurApp.form(model=Organisation,
                    name='daycare-settings',
                    template='form.pt',
                    permission=Secret,
                    form=WinterthurDaycareSettingsForm,
                    setting=_("Daycare Calculator"),
                    icon='fa-calculator')
def custom_handle_settings(self, request, form):
    return handle_generic_settings(self, request, form, _("Daycare Settings"))
예제 #23
0
 def breadcrumbs(self):
     return [
         Link(_("Homepage"), self.homepage_url),
         Link(_("Roadworks"), self.request.class_link(RoadworkCollection)),
         Link(self.model.title, self.request.link(self.model))
     ]
예제 #24
0
 def breadcrumbs(self):
     return [
         Link(_("Homepage"), self.homepage_url),
         Link(_("Roadworks"), '#'),
     ]
예제 #25
0
 def breadcrumbs(self):
     return [
         Link(_("Homepage"), self.homepage_url),
         Link(_("Addresses"), '#'),
     ]
예제 #26
0
    def editbar_links(self):

        # this is a bit different then usual, trying out some things as part
        # of this project - probably not a good idea to copy this elsewhere
        if not self.request.is_manager:
            return

        if self.suffixes and not getattr(self.suffixes[-1], 'editbar', True):
            return

        if isinstance(self.model, MissionReportCollection):
            return [
                Link(
                    _("Vehicles"), self.request.class_link(
                        MissionReportVehicleCollection
                    ), attrs={'class': 'vehicles'}
                ),
                LinkGroup(
                    title=_("Add"),
                    links=[
                        Link(
                            text=_("Mission Report"),
                            url=self.request.link(
                                self.model,
                                name='+new'
                            ),
                            attrs={'class': 'new-report'}
                        )
                    ]
                ),
            ]

        if isinstance(self.model, MissionReportVehicleCollection):
            return [
                LinkGroup(
                    title=_("Add"),
                    links=[
                        Link(
                            text=_("Vehicle"),
                            url=self.request.link(
                                self.model,
                                name='+new'
                            ),
                            attrs={'class': 'new-vehicle'}
                        )
                    ]
                ),
            ]

        if isinstance(self.model, MissionReport):
            return [
                Link(
                    _("Images"),
                    self.request.link(self.model, name='images'),
                    attrs={'class': 'upload-images'}
                ),
                Link(
                    _("Edit"),
                    self.request.link(self.model, name='edit'),
                    attrs={'class': 'edit-link'}
                ),
                Link(
                    _("Delete"),
                    self.csrf_protected_url(
                        self.request.link(self.model)
                    ),
                    attrs={'class': 'delete-link'},
                    traits=(
                        Confirm(
                            _(
                                "Do you really want to delete "
                                "this mission report?"
                            ),
                            _("This cannot be undone."),
                            _("Delete mission report"),
                            _("Cancel")
                        ),
                        Intercooler(
                            request_method='DELETE',
                            redirect_after=self.request.class_link(
                                MissionReportCollection
                            )
                        )
                    )
                )
            ]

        if isinstance(self.model, MissionReportVehicle):
            if self.model.uses:
                return [
                    Link(
                        _("Delete"),
                        '#',
                        attrs={'class': 'delete-link'},
                        traits=(
                            Block(
                                _("This vehicle can't be deleted."),
                                _(
                                    "There are mission reports associated "
                                    "with this vehicle."
                                ),
                                _("Cancel")
                            ),
                        )
                    )
                ]
            else:
                return [
                    Link(
                        _("Delete"),
                        self.csrf_protected_url(
                            self.request.link(self.model)
                        ),
                        attrs={'class': 'delete-link'},
                        traits=(
                            Confirm(
                                _(
                                    "Do you really want to delete "
                                    "this vehicle?"
                                ),
                                _("This cannot be undone."),
                                _("Delete vehicle"),
                                _("Cancel")
                            ),
                            Intercooler(
                                request_method='DELETE',
                                redirect_after=self.request.class_link(
                                    MissionReportVehicleCollection
                                )
                            )
                        )
                    )
                ]
예제 #27
0
def update_streets(self, request):
    request.assert_valid_csrf_token()

    self.update()

    request.success(_("The streets directory has been updated"))
예제 #28
0
class WinterthurDaycareSettingsForm(Form):

    max_income = DecimalField(label=_("Maximum taxable income"),
                              fieldset=_("Variables"),
                              places=0,
                              validators=[InputRequired()])

    max_wealth = DecimalField(label=_("Maximum taxable wealth"),
                              fieldset=_("Variables"),
                              places=0,
                              validators=[InputRequired()])

    min_income = DecimalField(label=_("Minimum income"),
                              fieldset=_("Variables"),
                              places=0,
                              validators=[InputRequired()])

    min_rate = DecimalField(label=_("Minimum day-rate"),
                            fieldset=_("Variables"),
                            places=0,
                            validators=[InputRequired()])

    max_rate = DecimalField(label=_("Maximum day-rate"),
                            fieldset=_("Variables"),
                            places=0,
                            validators=[InputRequired()])

    max_subsidy = DecimalField(label=_("Maximum subsidy"),
                               fieldset=_("Variables"),
                               places=0,
                               validators=[InputRequired()])

    wealth_premium = DecimalField(label=_("Wealth premium (%)"),
                                  fieldset=_("Variables"),
                                  places=2,
                                  validators=[InputRequired()])

    rebate = DecimalField(label=_("Rebate (%)"),
                          fieldset=_("Variables"),
                          places=2,
                          validators=[InputRequired()])

    services = TextAreaField(label=_("Care"),
                             fieldset=_("Variables"),
                             validators=[InputRequired()],
                             render_kw={
                                 'rows': 32,
                                 'data-editor': 'yaml'
                             })

    directory = RadioField(label=_("Directory"),
                           fieldset=_("Institutions"),
                           validators=[InputRequired()],
                           choices=None)

    explanation = HtmlField(label=_("Explanation"),
                            fieldset=_("Details"),
                            render_kw={'rows': 32})

    def populate_obj(self, obj, *args, **kwargs):
        super().populate_obj(obj, *args, **kwargs)
        obj.meta['daycare_settings'] = {
            k: v
            for k, v in self.data.items() if k != 'csrf_token'
        }

    def process_obj(self, obj):
        super().process_obj(obj)
        for k, v in obj.meta.get('daycare_settings', {}).items():
            if hasattr(self, k):
                getattr(self, k).data = v

        if not self.services.data or not self.services.data.strip():
            self.services.data = textwrap.dedent("""
                # Beispiel:
                #
                # - titel: "Ganzer Tag inkl. Mitagessen"
                #   tage: "Montag, Dienstag, Mittwoch, Donnerstag, Freitag"
                #   prozent: 100.00
            """)

    def validate_services(self, field):
        try:
            tuple(Services.parse_definition(field.data))
        except (YAMLError, TypeError, KeyError):
            raise ValidationError(_("Invalid services configuration"))

    def directory_choices(self):
        dirs = DirectoryCollection(self.request.session, type='extended')

        def choice(directory):
            return (directory.id.hex, directory.title)

        for d in dirs.query().order_by(Directory.order):
            yield choice(d)

    def on_request(self):
        self.directory.choices = list(self.directory_choices())
예제 #29
0
 def validate_services(self, field):
     try:
         tuple(Services.parse_definition(field.data))
     except (YAMLError, TypeError, KeyError):
         raise ValidationError(_("Invalid services configuration"))
예제 #30
0
 def breadcrumbs(self):
     return [
         Link(_("Homepage"), self.homepage_url),
         Link(_("Addresses"), self.request.class_link(AddressCollection)),
         Link(_(self.model.street), '#')
     ]