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)), }
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)), }
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, '#')) }
def breadcrumbs(self): return ( Link(_("Homepage"), self.homepage_url), Link( _("Daycare Subsidy Calculator"), self.request.link(self.model) ) )
def breadcrumbs_iter(self): yield Link( _("Homepage"), self.homepage_url) yield Link( _("Mission Reports"), self.request.class_link(MissionReportCollection)) yield from self.suffixes
def view_mission_report_vehicles(self, request): return { 'layout': MissionReportLayout(self, request, Link(_("Vehicles"), request.link(self))), 'title': _("Vehicles"), 'vehicles': tuple(self.query()), }
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
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"))
def view_roadwork_collection(self, request): return { 'layout': RoadworkCollectionLayout(self, request), 'title': _("Roadworks"), 'model': self }
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."))
def view_mission_reports(self, request): return { 'layout': MissionReportLayout(self, request), 'title': _("Mission Reports"), 'reports': self.batch, 'count': self.mission_count(), 'year': self.year, }
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"))
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"), }
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))
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' ) }
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), ) }
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))
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 ) ) ]
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 }
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
def custom_handle_settings(self, request, form): return handle_generic_settings(self, request, form, _("Daycare Settings"))
""") 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"))
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)) ]
def breadcrumbs(self): return [ Link(_("Homepage"), self.homepage_url), Link(_("Roadworks"), '#'), ]
def breadcrumbs(self): return [ Link(_("Homepage"), self.homepage_url), Link(_("Addresses"), '#'), ]
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 ) ) ) ) ]
def update_streets(self, request): request.assert_valid_csrf_token() self.update() request.success(_("The streets directory has been updated"))
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())
def validate_services(self, field): try: tuple(Services.parse_definition(field.data)) except (YAMLError, TypeError, KeyError): raise ValidationError(_("Invalid services configuration"))
def breadcrumbs(self): return [ Link(_("Homepage"), self.homepage_url), Link(_("Addresses"), self.request.class_link(AddressCollection)), Link(_(self.model.street), '#') ]