Skip to content

Commit

Permalink
Adds edit consultation.
Browse files Browse the repository at this point in the history
Also gets rid of entity ConsultationDocument, this was really not
needed, as the GeneralFile class has very much the same functionality.
  • Loading branch information
cyrillkuettel committed Jun 23, 2024
1 parent f965c88 commit 4bc47da
Show file tree
Hide file tree
Showing 36 changed files with 929 additions and 394 deletions.
19 changes: 2 additions & 17 deletions src/privatim/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,13 @@
from privatim.layouts.action_menu import ActionMenuEntry
from pyramid.config import Configurator
from pyramid_beaker import session_factory_from_settings
from sqlalchemy import Table, MetaData, Column, ForeignKey
from sqlalchemy_file import FileField
from sqlalchemy import Column, ForeignKey
from email.headerregistry import Address
from privatim.mail import PostmarkMailer
from privatim.orm.uuid_type import UUIDStr as UUIDStrType

from pyramid.settings import asbool
from privatim.file import setup_filestorage
from privatim.file.setup import setup_filestorage
from privatim.flash import MessageQueue
from privatim.i18n import LocaleNegotiator
from privatim.route_factories.root_factory import root_factory
Expand Down Expand Up @@ -119,20 +118,6 @@ def main(


def upgrade(context: 'UpgradeContext'): # type: ignore[no-untyped-def]
if not context.has_table('consultation_assets'):
consultation_assets = Table(
'consultation_assets',
MetaData(),
Column('id', UUIDStrType, primary_key=True),
Column(
'consultation_id', UUIDStrType, ForeignKey('consultations.id')
),
Column('document', FileField),
)
consultation_assets.create(context.engine)

if context.has_column('consultations', 'documents'):
context.drop_column('consultations', 'documents')

if not context.has_column('consultations', 'creator_id'):
context.add_column(
Expand Down
6 changes: 3 additions & 3 deletions src/privatim/cli/initialize_db.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from privatim.layouts.layout import DEFAULT_TIMEZONE
from privatim.models.consultation import Status, Tag
from privatim.orm import get_engine
from privatim.models import (Consultation, ConsultationDocument, User, Meeting,
WorkingGroup, AgendaItem)
from privatim.models import (Consultation, User, Meeting, WorkingGroup,
AgendaItem, GeneralFile)
from privatim.orm import Base
import click

Expand Down Expand Up @@ -99,7 +99,7 @@ def add_example_content(
pdf = here / 'sample-pdf-for-initialize-db/' / pdfname
content = pdf.read_bytes()
consultation = Consultation(
documents=[ConsultationDocument(name=pdfname, content=content)],
documents=[GeneralFile(filename=pdfname, content=content)],
title='Verordnung über den Einsatz elektronischer Mittel zur Ton- '
'und Bildübertragung in Zivilverfahren (VEMZ)',
description='Mit der Revision der Schweizerischen '
Expand Down
2 changes: 1 addition & 1 deletion src/privatim/cli/shell.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
import click
from pyramid.paster import bootstrap, get_appsettings

from privatim import setup_filestorage
from privatim.file.setup import setup_filestorage
from privatim.cli.find_files import find_ini_file_or_abort

from typing import Any
Expand Down
Empty file added src/privatim/file/__init__.py
Empty file.
File renamed without changes.
20 changes: 0 additions & 20 deletions src/privatim/fliestorage_download.py

This file was deleted.

71 changes: 43 additions & 28 deletions src/privatim/forms/consultation_form.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,11 @@
from wtforms.validators import DataRequired
from wtforms import validators

from privatim.forms.fields import UploadMultipleField, SearchableSelectField
from privatim.forms.fields import SearchableSelectField
from privatim.forms.fields.fields import UploadMultipleFilesWithORMSupport
from privatim.i18n import _, translate

from privatim.models import Tag
from privatim.models import Tag, GeneralFile
from privatim.models.consultation import Status


Expand All @@ -35,11 +36,16 @@ def __init__(
self, context: 'Consultation | None', request: 'IRequest'
) -> None:
self._title = _('Edit Consultation')
session = request.dbsession
super().__init__(
request.POST,
obj=context,
meta={'context': context, 'request': request},
meta={
'context': context,
'dbsession': session
}
)

translated_choices = [
(code, translate(label))
for code, label in STATUS_CHOICES
Expand All @@ -63,35 +69,44 @@ def __init__(
validators.Optional(),
],
)
documents = UploadMultipleField(
label=_('Documents'),
validators=[
validators.Optional(),
]
)

def _populate_select_field(self, field):
# this a bit crude, but how else are you going to get the value?
for key, value in field.choices:
if key == field.data:
return value
return None
files = UploadMultipleFilesWithORMSupport(
label=_('Documents'), validators=[validators.Optional()],
file_class=GeneralFile
)

def populate_obj(self, obj: 'Consultation') -> None:
def populate_obj(
self,
obj: 'Consultation', # type: ignore[override]
) -> None:
session = self.meta.dbsession
for name, field in self._fields.items():
if (isinstance(field, SearchableSelectField) and field.raw_data
is not None):
session = self.meta.dbsession
stmt = select(Tag).where(Tag.name.in_(field.raw_data))
tags = session.execute(stmt).scalars().all()
obj.secondary_tags = tags
if (
isinstance(field, SearchableSelectField)
and field.raw_data is not None
):
existing_tags = {
tag.name: tag
for tag in session.execute(
select(Tag).where(Tag.name.in_(field.raw_data))
)
.scalars()
.all()
}
# Create new tags for those not already existing
new_tags = set()
for tag_name in field.raw_data:
if tag_name not in existing_tags:
new_tag = Tag(name=tag_name)
session.add(new_tag)
new_tags.add(new_tag)
session.flush()
# Get all tags (existing + new)
all_tags = set(existing_tags.values()).union(new_tags)
setattr(obj, name, list(all_tags))
elif isinstance(field, SelectField) and field.data is not None:
value = self._populate_select_field(field)
# stmt = select(Status).where(Tag.name.in_(field.raw_data))
breakpoint()
if value:
value = dict(field.choices)[field.data]
if value and obj.status.name != value:
setattr(obj, name, Status(name=value))
elif isinstance(field, UploadMultipleField):
breakpoint()
else:
field.populate_obj(obj, name)
13 changes: 10 additions & 3 deletions src/privatim/forms/fields/__init__.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
from .fields import ChosenSelectWidget, DateTimeLocalField, \
TimezoneDateTimeField, SearchableSelectField, UploadField, \
UploadMultipleField
from .fields import (
ChosenSelectWidget,
DateTimeLocalField,
TimezoneDateTimeField,
SearchableSelectField,
UploadField,
UploadMultipleField,
# UploadOrSelectExistingMultipleFilesField,
)
from .transparent_form_field import TransparentFormField


Expand All @@ -25,4 +31,5 @@ def FieldList(**fields: 'Field') -> 'TransparentFormField[Any]':
"SearchableSelectField",
"UploadField",
"UploadMultipleField",
# "UploadOrSelectExistingMultipleFilesField"
)
Loading

0 comments on commit 4bc47da

Please sign in to comment.