diff --git a/migrations/versions/7dd3c479c048_.py b/migrations/versions/7dd3c479c048_.py new file mode 100644 index 0000000000000000000000000000000000000000..6e43ec5002f93d410767d0476e12b290b78c2145 --- /dev/null +++ b/migrations/versions/7dd3c479c048_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 7dd3c479c048 +Revises: ab996d2365af +Create Date: 2017-03-01 03:54:18.283388 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '7dd3c479c048' +down_revision = 'ab996d2365af' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('protocoltypes', sa.Column('modify_group', sa.String(), nullable=True)) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('protocoltypes', 'modify_group') + # ### end Alembic commands ### diff --git a/models/database.py b/models/database.py index 1bff6cd09e3fc1d7860773d36709091a27f7cfc7..85ae45ac68135b1b85b1b7d254763b792c0e073f 100644 --- a/models/database.py +++ b/models/database.py @@ -26,6 +26,7 @@ class ProtocolType(db.Model): organization = db.Column(db.String) usual_time = db.Column(db.Time) is_public = db.Column(db.Boolean) + modify_group = db.Column(db.String) private_group = db.Column(db.String) public_group = db.Column(db.String) private_mail = db.Column(db.String) @@ -42,13 +43,15 @@ class ProtocolType(db.Model): todos = relationship("Todo", backref=backref("protocoltype"), order_by="Todo.id") def __init__(self, name, short_name, organization, usual_time, - is_public, private_group, public_group, private_mail, public_mail, + is_public, modify_group, private_group, public_group, + private_mail, public_mail, use_wiki, wiki_category, wiki_only_public, printer, calendar): self.name = name self.short_name = short_name self.organization = organization self.usual_time = usual_time self.is_public = is_public + self.modify_group = modify_group self.private_group = private_group self.public_group = public_group self.private_mail = private_mail @@ -61,15 +64,15 @@ class ProtocolType(db.Model): def __repr__(self): return ("<ProtocolType(id={}, short_name={}, name={}, " - "organization={}, is_public={}, private_group={}, " - "public_group={}, use_wiki={}, wiki_category='{}', " - "wiki_only_public={}, printer={}, usual_time={}, " - "calendar='{}')>".format( + "organization={}, is_public={}, modify_group={}, " + "private_group={}, public_group={}, use_wiki={}, " + "wiki_category='{}', wiki_only_public={}, printer={}, " + "usual_time={}, calendar='{}')>".format( self.id, self.short_name, self.name, - self.organization, self.is_public, self.private_group, - self.public_group, self.use_wiki, self.wiki_category, - self.wiki_only_public, self.printer, self.usual_time, - self.calendar)) + self.organization, self.is_public, self.modify_group, + self.private_group, self.public_group, self.use_wiki, + self.wiki_category, self.wiki_only_public, self.printer, + self.usual_time, self.calendar)) def get_latest_protocol(self): candidates = sorted([protocol for protocol in self.protocols if protocol.is_done()], key=lambda p: p.date, reverse=True) @@ -88,7 +91,7 @@ class ProtocolType(db.Model): return (user is not None and self.private_group != "" and self.private_group in user.groups) def has_modify_right(self, user): - return self.has_private_view_right(user) + return (user is not None and self.modify_group != "" and self.modify_group in user.groups) @staticmethod def get_modifiable_protocoltypes(user): diff --git a/views/forms.py b/views/forms.py index b6b7f57882adbb959b5729b01bf2df7683880d56..f33f3e9a49b078b0180aae5bf1de4934a59dad2d 100644 --- a/views/forms.py +++ b/views/forms.py @@ -10,7 +10,11 @@ from shared import current_user import config def get_protocoltype_choices(protocoltypes, add_all=True): - choices = [(protocoltype.id, protocoltype.short_name) for protocoltype in protocoltypes] + choices = [ + (protocoltype.id, protocoltype.short_name) + for protocoltype + in sorted(protocoltypes, key=lambda t: t.short_name) + ] if add_all: choices.insert(0, (-1, "Alle")) return choices @@ -23,12 +27,17 @@ def get_todostate_choices(): def get_calendar_choices(): calendars = CalendarClient().get_calendars() - choices = list(zip(calendars, calendars)) + choices = [] + if calendars is not None: + calendars = sorted(calendars) + choices = list(zip(calendars, calendars)) choices.insert(0, ("", "Kein Kalender")) return choices def get_printer_choices(): - choices = list(zip(config.PRINTING_PRINTERS, config.PRINTING_PRINTERS)) + choices = [] + if config.PRINTING_PRINTERS is not None: + choices = list(zip(config.PRINTING_PRINTERS, config.PRINTING_PRINTERS)) choices.insert(0, ("", "Nicht drucken")) return choices @@ -54,6 +63,7 @@ class ProtocolTypeForm(FlaskForm): organization = StringField("Organisation", validators=[InputRequired("Du musst eine zugehörige Organisation angeben.")]) usual_time = DateTimeField("Üblicher Beginn", validators=[InputRequired("Bitte gib die Zeit an, zu der die Sitzung beginnt.")], format="%H:%M") is_public = BooleanField("Öffentlich sichtbar") + modify_group = SelectField("Bearbeitungsgruppe", choices=[]) private_group = SelectField("Interne Gruppe", choices=[]) public_group = SelectField("Öffentliche Gruppe", choices=[]) private_mail = StringField("Interner Verteiler") @@ -69,6 +79,7 @@ class ProtocolTypeForm(FlaskForm): self.calendar.choices = get_calendar_choices() self.printer.choices = get_printer_choices() group_choices = get_group_choices() + self.modify_group.choices = group_choices self.private_group.choices = group_choices self.public_group.choices = group_choices diff --git a/views/tables.py b/views/tables.py index e47a75d23c61ef73d09e0bb29f0f04a3f9adc9e4..c0fc83137e5d722fceb63713bbeeb9112f5bd6da 100644 --- a/views/tables.py +++ b/views/tables.py @@ -108,7 +108,8 @@ class ProtocolTypeTable(SingleValueTable): def headers(self): general_headers = ["Name", "Abkürzung", "Organisation", "Beginn", - "Öffentlich", "Interne Gruppe", "Öffentliche Gruppe"] + "Öffentlich", "Bearbeitungsgruppe", "Interne Gruppe", + "Öffentliche Gruppe"] mail_headers = ["Interner Verteiler", "Öffentlicher Verteiler"] if not config.MAIL_ACTIVE: mail_headers = [] @@ -132,6 +133,7 @@ class ProtocolTypeTable(SingleValueTable): self.value.organization, self.value.usual_time.strftime("%H:%M") if self.value.usual_time is not None else "", # todo: remove if, this field is required Table.bool(self.value.is_public), + self.value.modify_group, self.value.private_group, self.value.public_group, ]