Skip to content
Snippets Groups Projects
Commit 6fd9dfd8 authored by Robin Sonnabend's avatar Robin Sonnabend
Browse files

Publish protocols before decisions and attachments are visible

parent 18bb9969
Branches
No related tags found
No related merge requests found
"""empty message
Revision ID: a1f23743bddb
Revises: 0555db125011
Create Date: 2017-02-28 13:38:25.900461
"""
from alembic import op
import sqlalchemy as sa
# revision identifiers, used by Alembic.
revision = 'a1f23743bddb'
down_revision = '0555db125011'
branch_labels = None
depends_on = None
def upgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.add_column('protocols', sa.Column('public', sa.Boolean(), nullable=True))
# ### end Alembic commands ###
def downgrade():
# ### commands auto generated by Alembic - please adjust! ###
op.drop_column('protocols', 'public')
# ### end Alembic commands ###
......@@ -125,13 +125,14 @@ class Protocol(db.Model):
participants = db.Column(db.String)
location = db.Column(db.String)
done = db.Column(db.Boolean)
public = db.Column(db.Boolean)
tops = relationship("TOP", backref=backref("protocol"), cascade="all, delete-orphan", order_by="TOP.number")
decisions = relationship("Decision", backref=backref("protocol"), cascade="all, delete-orphan", order_by="Decision.id")
documents = relationship("Document", backref=backref("protocol"), cascade="all, delete-orphan", order_by="Document.is_compiled")
errors = relationship("Error", backref=backref("protocol"), cascade="all, delete-orphan", order_by="Error.id")
def __init__(self, protocoltype_id, date, source=None, content_public=None, content_private=None, start_time=None, end_time=None, author=None, participants=None, location=None, done=False):
def __init__(self, protocoltype_id, date, source=None, content_public=None, content_private=None, start_time=None, end_time=None, author=None, participants=None, location=None, done=False, public=False):
self.protocoltype_id = protocoltype_id
self.date = date
self.source = source
......@@ -143,6 +144,7 @@ class Protocol(db.Model):
self.participants = participants
self.location = location
self.done = done
self.public = public
def __repr__(self):
return "<Protocol(id={}, protocoltype_id={})>".format(
......@@ -190,6 +192,18 @@ class Protocol(db.Model):
if LOCATION_KEY in remarks:
self.location = remarks[LOCATION_KEY].value.strip()
def has_public_view_right(self, user):
return (
(self.public and self.protocoltype.has_public_view_right(user))
or self.protocoltype.has_private_view_right(user)
)
def has_private_view_right(self, user):
return self.protocoltype.has_private_view_right(user)
def has_modify_right(self, user):
return self.protocoltype.has_modify_right(user)
def is_done(self):
return self.done
......
......@@ -104,7 +104,12 @@ def index():
key=_sort_key
)
finished_protocols = sorted(
[protocol for protocol in protocols if protocol.done],
[
protocol for protocol in protocols
if protocol.done
and (protocol.has_public_view_right(user)
or protocol.has_private_view_right(user))
],
key=_sort_key
)
protocol = finished_protocols[0] if len(finished_protocols) > 0 else None
......@@ -112,7 +117,7 @@ def index():
if check_login():
todos = [
todo for todo in Todo.query.all()
if todo.protocoltype.has_public_view_right(user)
if todo.protocoltype.has_private_view_right(user)
and not todo.is_done()
]
todos_table = TodosTable(todos) if todos is not None else None
......@@ -395,7 +400,7 @@ def list_protocols():
protocol for protocol in protocols
if (protocol.protocoltype.has_private_view_right(user)
and _matches_search(protocol.content_private))
or (protocol.protocoltype.has_public_view_right(user)
or (protocol.has_public_view_right(user)
and _matches_search(protocol.content_public))
]
for protocol in protocols:
......@@ -464,12 +469,12 @@ def show_protocol(protocol_id):
user = current_user()
protocol = Protocol.query.filter_by(id=protocol_id).first()
if protocol is None or not protocol.protocoltype.has_public_view_right(user):
flash("Invalides Protokoll.", "alert-error")
flash("Invalides Protokoll oder fehlende Zugriffsrechte.", "alert-error")
return redirect(request.args.get("next") or url_for("index"))
errors_table = ErrorsTable(protocol.errors)
visible_documents = [
document for document in protocol.documents
if (not document.is_private and document.protocol.protocoltype.has_public_view_right(user))
if (not document.is_private and document.protocol.has_public_view_right(user))
or (document.is_private and document.protocol.protocoltype.has_private_view_right(user))
]
documents_table = DocumentsTable(visible_documents)
......@@ -650,6 +655,19 @@ def update_protocol(protocol_id):
return redirect(request.args.get("next") or url_for("show_protocol", protocol_id=protocol.id))
return render_template("protocol-update.html", upload_form=upload_form, edit_form=edit_form, protocol=protocol)
@app.route("/protocol/publish/<int:protocol_id>")
@login_required
def publish_protocol(protocol_id):
user = current_user()
protocol = Protocol.query.filter_by(id=protocol_id).first()
if protocol is None or not protocol.protocoltype.has_modify_right(user):
flash("Invalides Protokoll oder keine Berechtigung.", "alert-error")
return redirect(request.args.get("next") or url_for("index"))
protocol.public = True
db.session.commit()
return redirect(request.args.get("next") or url_for("show_protocol", protocol_id=protocol.id))
@app.route("/prococol/send/<int:protocol_id>")
@login_required
def send_protocol(protocol_id):
......@@ -891,7 +909,7 @@ def list_decisions():
search_form.search.data = search_term
decisions = [
decision for decision in Decision.query.all()
if decision.protocol.protocoltype.has_public_view_right(user)
if decision.protocol.has_public_view_right(user)
]
if protocoltype_id is not None and protocoltype_id != -1:
decisions = [
......@@ -926,7 +944,7 @@ def download_document(document_id):
if ((document.is_private
and not document.protocol.protocoltype.has_private_view_right(user))
or (not document.is_private
and not document.protocol.protocoltype.has_public_view_right(user))):
and not document.protocol.has_public_view_right(user))):
flash("Keine Berechtigung.", "alert-error")
return redirect(request.args.get("next") or url_for("index"))
return send_file(document.as_file_like(), cache_timeout=1, as_attachment=True, attachment_filename=document.name)
......
......@@ -4,41 +4,47 @@
{% set logged_in = check_login() %}
{% set user = current_user() %}
{% set has_public_view_right = protocol.protocoltype.has_public_view_right(user) %}
{% set has_private_view_right = protocol.protocoltype.has_private_view_right(user) %}
{% set has_modify_right = protocol.protocoltype.has_modify_right(user) %}
{% set has_public_type_view_right = protocol.protocoltype.has_public_view_right(user) %}
{% set has_public_view_right = protocol.has_public_view_right(user) %}
{% set has_private_view_right = protocol.has_private_view_right(user) %}
{% set has_modify_right = protocol.has_modify_right(user) %}
{% block content %}
<div class="container">
<div class="btn-group">
{% if has_modify_right %}
{% if config.ETHERPAD_ACTIVE %}
<a class="btn {% if protocol.source is none %}btn-primary{% else %}btn-default{% endif %}" href="{{url_for("etherpull_protocol", protocol_id=protocol.id)}}">Aus Etherpad</a>
{% endif %}
{% if protocol.source is not none %}
<a class="btn btn-primary" href="{{url_for("get_protocol_source", protocol_id=protocol.id)}}">Quelltext</a>
{% endif %}
<a class="btn {% if protocol.is_done() %}btn-success{% else %}btn-default{% endif %}" href="{{url_for("update_protocol", protocol_id=protocol.id)}}">Editieren</a>
{% if not protocol.is_done() %}
<a class="btn btn-default" href="{{url_for("get_protocol_template", protocol_id=protocol.id)}}">Vorlage</a>
{% if has_modify_right %}
<div class="btn-group">
{% if has_modify_right %}
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-primary" href="{{url_for("etherpush_protocol", protocol_id=protocol.id)}}">In Etherpad</a>
<a class="btn {% if protocol.source is none %}btn-primary{% else %}btn-default{% endif %}" href="{{url_for("etherpull_protocol", protocol_id=protocol.id)}}">Aus Etherpad</a>
{% endif %}
{% else %}
{% if config.MAIL_ACTIVE %}
<a class="btn btn-default" href="{{url_for("send_protocol", protocol_id=protocol.id)}}">Mail versenden</a>
{% if protocol.source is not none %}
<a class="btn btn-primary" href="{{url_for("get_protocol_source", protocol_id=protocol.id)}}">Quelltext</a>
{% endif %}
<a class="btn {% if protocol.is_done() %}btn-success{% else %}btn-default{% endif %}" href="{{url_for("update_protocol", protocol_id=protocol.id)}}">Editieren</a>
{% if not protocol.is_done() %}
<a class="btn btn-default" href="{{url_for("get_protocol_template", protocol_id=protocol.id)}}">Vorlage</a>
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-primary" href="{{url_for("etherpush_protocol", protocol_id=protocol.id)}}">In Etherpad</a>
{% endif %}
{% else %}
{% if config.MAIL_ACTIVE %}
<a class="btn btn-default" href="{{url_for("send_protocol", protocol_id=protocol.id)}}">Mail versenden</a>
{% endif %}
{% if not protocol.public %}
<a class="btn btn-default" href="{{url_for("publish_protocol", protocol_id=protocol.id)}}">Veröffentlichen</a>
{% endif %}
{% endif %}
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-default" href="{{protocol.get_etherpad_link()}}" target="_blank">Etherpad</a>
{% endif %}
<a class="btn btn-default" href="{{url_for("show_type", type_id=protocol.protocoltype.id)}}">Typ</a>
{% if protocol.has_compiled_document() %}
<a class="btn btn-success" href="{{url_for("download_document", document_id=protocol.get_compiled_document().id)}}">Download</a>
{% endif %}
<a class="btn btn-danger" href="{{url_for("delete_protocol", protocol_id=protocol.id)}}" onclick="return confirm('Bist du dir sicher, dass du das Protokoll {{protocol.get_identifier()}} löschen möchtest?');">Löschen</a>
{% endif %}
{% if config.ETHERPAD_ACTIVE %}
<a class="btn btn-default" href="{{protocol.get_etherpad_link()}}" target="_blank">Etherpad</a>
{% endif %}
<a class="btn btn-default" href="{{url_for("show_type", type_id=protocol.protocoltype.id)}}">Typ</a>
{% if protocol.has_compiled_document() %}
<a class="btn btn-success" href="{{url_for("download_document", document_id=protocol.get_compiled_document().id)}}">Download</a>
{% endif %}
<a class="btn btn-danger" href="{{url_for("delete_protocol", protocol_id=protocol.id)}}" onclick="return confirm('Bist du dir sicher, dass du das Protokoll {{protocol.get_identifier()}} löschen möchtest?');">Löschen</a>
{% endif %}
</div>
</div>
{% endif %}
<div class="row">
<div id="left-column" class="col-lg-6">
{% if protocol.is_done() %}
......@@ -69,7 +75,7 @@
<h3>Tagesordnung{% if has_modify_right and not protocol.has_nonplanned_tops() %} <a href="{{url_for("new_top", protocol_id=protocol.id)}}">Top hinzufügen</a>{% endif %}</h3>
{% include "protocol-tops-include.html" %}
{% if protocol.is_done() %}
{% if protocol.is_done() and has_public_view_right %}
<h3>Beschlüsse</h3>
<ul>
{% if protocol.decisions|length > 0 %}
......@@ -105,7 +111,7 @@
{{render_table(errors_table)}}
{% endif %}
{% endif %}
{% if protocol.documents|length > 0 %}
{% if protocol.documents|length > 0 and has_public_view_right %}
{{render_table(documents_table)}}
{% else %}
{% if has_modify_right %}
......
......@@ -9,7 +9,7 @@
{% for top in protocol.tops %}
<li>
{{top.name}}
{% if not protocol.is_done() and has_private_view_right %}
{% if not protocol.is_done() and has_public_type_view_right %}
({{top.number}})
{% endif %}
{% if not protocol.is_done() and has_modify_right %}
......
......@@ -4,9 +4,10 @@
{% set loggedin = check_login() %}
{% set user = current_user() %}
{% set has_public_view_right = protocol.protocoltype.has_public_view_right(user) %}
{% set has_private_view_right = protocol.protocoltype.has_private_view_right(user) %}
{% set has_modify_right = protocol.protocoltype.has_modify_right(user) %}
{% set has_public_type_view_right = protocol.has_public_type_view_right(user) %}
{% set has_public_view_right = protocol.has_public_view_right(user) %}
{% set has_private_view_right = protocol.has_private_view_right(user) %}
{% set has_modify_right = protocol.has_modify_right(user) %}
{% block content %}
<div class="container">
......
......@@ -106,6 +106,7 @@ class ProtocolForm(FlaskForm):
author = StringField("Protokollant")
participants = StringField("Anwesende")
done = BooleanField("Fertig")
public = BooleanField("Veröffentlicht")
class TopForm(FlaskForm):
name = StringField("TOP", validators=[InputRequired("Du musst den Namen des TOPs angeben.")])
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment