From 54b1574d4983ce8f80620bec2ce8ed0aa317f561 Mon Sep 17 00:00:00 2001
From: Robin Sonnabend <robin@fsmpi.rwth-aachen.de>
Date: Wed, 22 Mar 2017 22:09:50 +0100
Subject: [PATCH] Make metadata internal optionally

/close #80
---
 migrations/versions/4651698510d7_.py | 30 ++++++++++++++++++++++++++++
 models/database.py                   |  4 +++-
 tasks.py                             |  2 +-
 templates/protocol-mail.txt          |  2 ++
 templates/protocol-show.html         |  4 +++-
 templates/protocol.tex               |  4 +++-
 templates/protocol.wiki              |  2 ++
 views/forms.py                       |  2 ++
 views/tables.py                      |  4 ++--
 9 files changed, 48 insertions(+), 6 deletions(-)
 create mode 100644 migrations/versions/4651698510d7_.py

diff --git a/migrations/versions/4651698510d7_.py b/migrations/versions/4651698510d7_.py
new file mode 100644
index 0000000..e6f86c6
--- /dev/null
+++ b/migrations/versions/4651698510d7_.py
@@ -0,0 +1,30 @@
+"""empty message
+
+Revision ID: 4651698510d7
+Revises: a06cc03bdef4
+Create Date: 2017-03-22 21:42:04.880972
+
+"""
+from alembic import op
+import sqlalchemy as sa
+
+
+# revision identifiers, used by Alembic.
+revision = '4651698510d7'
+down_revision = 'a06cc03bdef4'
+branch_labels = None
+depends_on = None
+
+
+def upgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.add_column('defaultmetas', sa.Column('internal', sa.Boolean(), nullable=True))
+    op.add_column('metas', sa.Column('internal', sa.Boolean(), nullable=True))
+    # ### end Alembic commands ###
+
+
+def downgrade():
+    # ### commands auto generated by Alembic - please adjust! ###
+    op.drop_column('metas', 'internal')
+    op.drop_column('defaultmetas', 'internal')
+    # ### end Alembic commands ###
diff --git a/models/database.py b/models/database.py
index 71dda40..9e47ae5 100644
--- a/models/database.py
+++ b/models/database.py
@@ -203,7 +203,7 @@ class Protocol(DatabaseModel):
         for default_meta in self.protocoltype.metas:
             if default_meta.key in remarks:
                 value = remarks[default_meta.key].value.strip()
-                meta = Meta(protocol_id=self.id, name=default_meta.name, value=value)
+                meta = Meta(protocol_id=self.id, name=default_meta.name, value=value, internal=default_meta.internal)
                 db.session.add(meta)
         db.session.commit()
 
@@ -657,6 +657,7 @@ class DefaultMeta(DatabaseModel):
     protocoltype_id = db.Column(db.Integer, db.ForeignKey("protocoltypes.id"))
     key = db.Column(db.String)
     name = db.Column(db.String)
+    internal = db.Column(db.Boolean)
 
     def get_parent(self):
         return self.protocoltype
@@ -668,6 +669,7 @@ class Meta(DatabaseModel):
     protocol_id = db.Column(db.Integer, db.ForeignKey("protocols.id"))
     name = db.Column(db.String)
     value = db.Column(db.String)
+    internal = db.Column(db.Boolean)
 
     def get_parent(self):
         return self.protocol
diff --git a/tasks.py b/tasks.py
index 84f4697..f08ea29 100644
--- a/tasks.py
+++ b/tasks.py
@@ -505,7 +505,7 @@ def send_protocol_async(protocol_id, show_private):
         protocol = Protocol.query.filter_by(id=protocol_id).first()
         to_addr = protocol.protocoltype.private_mail if show_private else protocol.protocoltype.public_mail
         subject = "{}{}-Protokoll vom {}".format("Internes " if show_private else "", protocol.protocoltype.short_name, date_filter(protocol.date))
-        mail_content = render_template("protocol-mail.txt", protocol=protocol)
+        mail_content = render_template("protocol-mail.txt", protocol=protocol, show_private=show_private)
         appendix = [(document.name, document.as_file_like())
             for document in protocol.documents
             if show_private or not document.is_private
diff --git a/templates/protocol-mail.txt b/templates/protocol-mail.txt
index 4235afc..0cb09c8 100644
--- a/templates/protocol-mail.txt
+++ b/templates/protocol-mail.txt
@@ -5,7 +5,9 @@ Datum: {{protocol.date|datify_long}}
 Zeit: von {{protocol.start_time|timify}} bis {{protocol.end_time|timify}}
 {% endif %}
 {% for meta in protocol.metas %}
+{% if not meta.internal or show_private %}
 {{meta.name}}: {{meta.value}}
+{% endif %}
 {% endfor %}
 
 Die Tagesordnung ist:
diff --git a/templates/protocol-show.html b/templates/protocol-show.html
index 1316ede..9ce74b3 100644
--- a/templates/protocol-show.html
+++ b/templates/protocol-show.html
@@ -65,7 +65,9 @@
                 {% endif %}
                 {% if has_public_view_right %}
                     {% for meta in protocol.metas %}
-                        <p><strong>{{meta.name}}:</strong> {{meta.value}}</p>
+                        {% if not meta.internal or has_private_view_right %}
+                            <p><strong>{{meta.name}}:</strong> {{meta.value}}</p>
+                        {% endif %}
                     {% endfor %}
 		{% endif %}
             {% else %}
diff --git a/templates/protocol.tex b/templates/protocol.tex
index 2004b24..1c757ba 100644
--- a/templates/protocol.tex
+++ b/templates/protocol.tex
@@ -27,7 +27,9 @@
     {\bf Datum:} & \VAR{protocol.date|datify_long|escape_tex}\\
 \ENV{endif}
 \ENV{for meta in protocol.metas}
-    {\bf \VAR{meta.name|escape_tex}:} & \VAR{meta.value|escape_tex}\\
+    \ENV{if not meta.internal or show_private}
+        {\bf \VAR{meta.name|escape_tex}:} & \VAR{meta.value|escape_tex}\\
+    \ENV{endif}
 \ENV{endfor}
 \end{tabular}
 \normalsize
diff --git a/templates/protocol.wiki b/templates/protocol.wiki
index 5cb8c6c..bc5e061 100644
--- a/templates/protocol.wiki
+++ b/templates/protocol.wiki
@@ -7,7 +7,9 @@
 | zeit = von <var>protocol.start_time|timify</var> bis <var>protocol.end_time|timify</var>
 <env> endif </env>
 <env> for meta in protocol.metas </env>
+<env> if not meta.internal or not protocol.protocoltype.wiki_only_public </env>
 | <var>meta.name|lower</var> = <var>meta.value</var>
+<env> endif </env>
 <env> endfor </env>
 }}
 
diff --git a/views/forms.py b/views/forms.py
index 6ee8e92..78bb64b 100644
--- a/views/forms.py
+++ b/views/forms.py
@@ -243,10 +243,12 @@ class TodoMailForm(FlaskForm):
 class MetaForm(FlaskForm):
     name = StringField("Name", validators=[InputRequired("Bitte gib den Namen der Metadaten an.")])
     value = StringField("Wert")
+    internal = BooleanField("Intern")
 
 class DefaultMetaForm(FlaskForm):
     key = StringField("Key", validators=[InputRequired("Bitte gib den Protokoll-Syntax-Schlüssel der Metadaten an.")])
     name = StringField("Name", validators=[InputRequired("Bitte gib den Namen der Metadaten an.")])
+    internal = BooleanField("Intern")
 
 class DecisionCategoryForm(FlaskForm):
     name = StringField("Name", validators=[InputRequired("Bitte gib den Namen der Kategorie an.")])
diff --git a/views/tables.py b/views/tables.py
index 4d98c4c..e612dd9 100644
--- a/views/tables.py
+++ b/views/tables.py
@@ -474,13 +474,14 @@ class DefaultMetasTable(Table):
         )
 
     def headers(self):
-        return ["Name", "Key", ""]
+        return ["Name", "Key", "Intern", ""]
 
     def row(self, meta):
         user = current_user()
         general_part = [
             meta.name,
             meta.key,
+            Table.bool(meta.internal)
         ]
         links = [
             Table.link(url_for("edit_defaultmeta", defaultmeta_id=meta.id), "Ändern"),
@@ -491,7 +492,6 @@ class DefaultMetasTable(Table):
 
 class DecisionCategoriesTable(Table):
     def __init__(self, categories, protocoltype):
-        print(categories)
         super().__init__(
             "Beschlusskategorien",
             categories, 
-- 
GitLab