From a6ddc6399a5b4bdb60ff46398592ed07837f02ec Mon Sep 17 00:00:00 2001
From: Jeremy Fee <jmfee@usgs.gov>
Date: Thu, 2 Jan 2020 11:03:13 -0700
Subject: [PATCH] Proposed Metadata model for flags, etc

---
 geomagio/webservice/metadata.py | 89 +++++++++++++++++++++++++++++++++
 1 file changed, 89 insertions(+)
 create mode 100644 geomagio/webservice/metadata.py

diff --git a/geomagio/webservice/metadata.py b/geomagio/webservice/metadata.py
new file mode 100644
index 00000000..1ee9f019
--- /dev/null
+++ b/geomagio/webservice/metadata.py
@@ -0,0 +1,89 @@
+from __future__ import absolute_import
+
+import datetime
+from .database import db
+
+
+# known category values as constants
+CATEGORY_FLAG = 'flag'
+CATEGORY_ADJUSTED_MATRIX = 'adjusted-matrix'
+
+
+class Metadata(db.Model):
+    """Metadata database model.
+
+    This class is used for Data flagging and other Metadata.
+
+    Flag example:
+    ```
+    automatic_flag = Metadata(
+        created_by = 'algorithm/version',
+        start_time = UTCDateTime('2020-01-02T00:17:00.1Z'),
+        end_time = UTCDateTime('2020-01-02T00:17:00.1Z'),
+        network = 'NT',
+        station = 'BOU',
+        channel = 'BEU',
+        category = CATEGORY_FLAG,
+        comment = "spike detected",
+        priority = 1,
+        data_valid = False)
+    ```
+
+    Adjusted Matrix example:
+    ```
+    adjusted_matrix = Metadata(
+        created_by = 'algorithm/version',
+        start_time = UTCDateTime('2020-01-02T00:17:00Z'),
+        end_time = None,
+        network = 'NT',
+        station = 'BOU',
+        category = CATEGORY_ADJUSTED_MATRIX,
+        comment = 'automatic adjusted matrix',
+        priority = 1,
+        value = {
+            'parameters' => {'x': 1, 'y': 2, 'z': 3}
+            'matrix' => [ ... ]
+        }
+    )
+    ```
+    """
+
+    # table and primary key
+    __tablename__ = 'metadata'
+    id = db.Column(db.Integer, primary_key=True)
+
+    # author
+    created_by = db.Column(db.Text, index=True)  # email/program id
+    created_time = db.Column(db.DateTime, default=datetime.datetime.utcnow)
+
+    # time range
+    start_time = db.Column(db.DateTime, index=True, nullable=True)
+    end_time = db.Column(db.DateTime, index=True, nullable=True)
+    # data this metadata applies to
+    # channel/location nullable for wildcard
+    network = db.Column(db.Text, index=True, nullable=False)
+    station = db.Column(db.Text, index=True, nullable=False)
+    channel = db.Column(db.Text, index=True, nullable=True)
+    location = db.Column(db.Text, index=True, nullable=True)
+
+    # metadata
+    # category (flag, matrix, etc)
+    category = db.Column(db.Text, index=True, nullable=False)
+    # comment
+    comment = db.Column(db.Text, nullable=True)
+    # higher priority overrides lower priority
+    priority = db.Column(db.Integer, default=1, index=True)
+    # whether data is valid during
+    data_valid = db.Column(db.Boolean, default=True, index=True)
+    # json encoded value
+    value = db.Column(db.JSON, nullable=False)
+
+    # reviewer
+    # email
+    reviewed_by = db.Column(db.Text)
+    # when reviewed
+    reviewed_time = db.Column(db.DateTime)
+    # comments by reviewer
+    review_comment = db.Column(db.Text)
+    # whether data rejected during review
+    review_reject = db.Column(db.Boolean, default=False, index=True)
-- 
GitLab