From cdd3ba67228be822720d88a025a92b1c1a17362d Mon Sep 17 00:00:00 2001
From: Fabian Gallenkamp <fabian.gallenkamp@uni-hamburg.de>
Date: Fri, 8 Feb 2019 16:02:07 +0100
Subject: [PATCH] Improved sql layout

---
 app.py           |  59 ++++++++++++++++++++++++++++++++++++++---------
 sample_db.sqlite | Bin 28672 -> 45056 bytes
 2 files changed, 48 insertions(+), 11 deletions(-)

diff --git a/app.py b/app.py
index 8f51c9f..3fe031c 100644
--- a/app.py
+++ b/app.py
@@ -42,10 +42,13 @@ software_features_table = db.Table('software_features', db.Model.metadata,
                                    db.Column('software_id', db.Integer, db.ForeignKey('software.id')),
                                    db.Column('feature_id', db.Integer, db.ForeignKey('feature.id')))
 # Create N2one table
-software_licence_table = db.Table('software_license', db.Model.metadata,
+software_languages_table = db.Table('software_languages', db.Model.metadata,
                                   db.Column('software_id', db.Integer, db.ForeignKey('software.id')),
-                                  db.Column('license_id', db.Integer, db.ForeignKey('license.id')))
-
+                                  db.Column('language_id', db.Integer, db.ForeignKey('language.id')))
+# Create N2one table
+software_programminglanguages_table = db.Table('software_programminglanguages', db.Model.metadata,
+                                  db.Column('software_id', db.Integer, db.ForeignKey('software.id')),
+                                  db.Column('programming_id', db.Integer, db.ForeignKey('programminglanguage.id')))
 
 class License(db.Model):
     id = db.Column(db.Integer, primary_key=True)
@@ -66,6 +69,23 @@ class Feature(db.Model):
     def __str__(self):
         return "{}".format(self.name)
 
+
+class Language(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    name = db.Column(db.Unicode(64))
+
+    def __str__(self):
+        return "{}".format(self.name)
+
+
+class Programminglanguage(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    name = db.Column(db.Unicode(64))
+
+    def __str__(self):
+        return "{}".format(self.name)
+
+
 class Matterofexpense(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.Unicode(64))
@@ -77,8 +97,10 @@ class Matterofexpense(db.Model):
 class Software(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.String(120))
-    text = db.Column(db.Text, nullable=False)
-    date = db.Column(db.Date)
+    short_description = db.Column(db.Text, nullable=False)
+    developer = db.Column(db.String(120))
+    lastchanged = db.Column(db.Date)
+
 
     license_id = db.Column(db.Integer(), db.ForeignKey(License.id))
     license = db.relationship(License, backref='softwares')
@@ -87,11 +109,26 @@ class Software(db.Model):
     matterofexpense = db.relationship(Matterofexpense, backref='softwares')
 
     features = db.relationship('Feature', secondary=software_features_table)
+    languages = db.relationship('Language', secondary=software_languages_table)
+    programminglanguages = db.relationship('Programminglanguage', secondary=software_programminglanguages_table)
 
     def __str__(self):
         return "{}".format(self.name)
 
 
+class Link(db.Model):
+    id = db.Column(db.Integer, primary_key=True)
+    type = db.Column(db.Enum('repository', 'website', 'developer', 'tutorial', 'faq', 'other', name='link_types'))
+
+    url = db.Column(db.String(120))
+
+    software_id = db.Column(db.Integer(), db.ForeignKey(Software.id))
+    software = db.relationship(Software, backref='Links')
+
+    def __str__(self):
+        return "{}:{}".format(self.type,self.url)
+
+
 # Flask views
 @app.route('/')
 def index():
@@ -118,7 +155,9 @@ inline_form_options = {
     'form_extra_fields': None,
 }'''
 
-class AdvancedExportView(sqla.ModelView):
+class AdvancedSoftwareView(sqla.ModelView):
+    inline_models = (Link,)
+
     @action('advancedexport', 'AdvancedExport')
     def action_advancedexport(self, ids):
         try:
@@ -140,7 +179,6 @@ class AdvancedExportView(sqla.ModelView):
                 as_attachment=True,
                 attachment_filename='data.zip'
             )
-
             flash("Done")
         except Exception as ex:
             if not self.handle_view_exception(ex):
@@ -265,16 +303,15 @@ class ScreenView(sqla.ModelView):
 
 
 # Create admin
-admin = admin.Admin(app, name='Example: SQLAlchemy', template_mode='bootstrap3')
+admin = admin.Admin(app, name='Softwaresammlung: Digitale Methoden', template_mode='bootstrap3')
 
 # Add views
-admin.add_view(AdvancedExportView(Software, db.session))
+admin.add_view(AdvancedSoftwareView(Software, db.session))
 admin.add_view(sqla.ModelView(Feature, db.session))
 admin.add_view(sqla.ModelView(License, db.session, category="Other"))
+admin.add_view(sqla.ModelView(Link, db.session, category="Other"))
 admin.add_sub_category(name="Links", parent_name="Other")
 admin.add_link(MenuLink(name='Back Home', url='/', category='Links'))
-admin.add_link(MenuLink(name='Google', url='http://www.google.com/', category='Links'))
-admin.add_link(MenuLink(name='Mozilla', url='http://mozilla.org/', category='Links'))
 
 
 def build_sample_db():
diff --git a/sample_db.sqlite b/sample_db.sqlite
index a3fd5a17f720f47ed3eb8110a0e9f78cd29f2d5a..9f5332adfdf19c39b683be53d3b458be6f74306e 100644
GIT binary patch
delta 934
zcmZp8z}WDBX@ayM4+8@OHv<B2P1G?~<YCa0IKj)nz`(_Rfq}n-pNX%R_Zx3E_fKvi
zE>%u8_6r*u1K2g2jJepwMMW7~JWCRja#C|L^Rhvh+d0V9F~n6N#L>yeRRJV2`5>RP
zT1jO=szR7!kh6zlkcOdwrj7y^XK7ImLdXatHhCV8<mC6fBK6Mxe!(F@j-GxYU?bu|
z+KUyOJzSl=6*NE`1y4T(4fUebg8bsllKi4dbsYuu^3<f_%#u_PGbObwH7CCywFty1
zDJ{t_%1q1wvC|R@K~#Q8Mrx6|CfFHn{z0yu?tTj1u8|tW`DrEPiA9qi@W}aaX*S7l
zvWvUBGd7!py$F>|jV~z5PcKT$&CSe9&q>TnFHKBOEygR!HMx#QObAok<XJqj+(^Qc
z_wfW|BJtxhQ#2KVT-{uQT>YF~gB6gZU=}NAWTt3xX*OnYu!|cSGB(wtIu)i2;Xb$s
zC&*FkP%g+NaQ0rFKrN_vD!LP3;xKzt*eCn*=rM9kuH)GzpU=iFE-TB}YKY<pSkSOf
z4(4_BEzZa<Dv3`?Elw`VEGWs$&r=9-jR;Zj^AAz*3-$2<B@B4%p(PJ4&YZ;JlH`oU
zy!6x*1sBH<*U4wNr6ynGUBSpYxr$GVk!|u)zSz)45f*lFV`Iiff3P#K1R540R+My$
zsbKN}J}2X1X0ZPnEx`uEf&xafpcnxa-F$%0#c(l;f&v>O{}TrOCz}NYZt=@VF>){{
j%7XG;d1_I5Vro%Jae8q|T6%d(ar!0&7KP0$3V-AQX0I*g

delta 293
zcmZp8z|`=7ae}lUHv<C$I|Bl+P1G@#<Yv&5IKj)nz`(|x!N6a_&%{^GYs}-rov~R^
z-~*RIV<H>7xUMc^Q)x+JQch}dep*R+Vo_>*PG)jyUNHureR2S&7&}yQauuia<n=sa
zlh<=PPG;s+X64dsOktfY%B{!922wXUihF^)BMZB@tSn<oD2n+odsrt2aEeaW<1vsb
zNv$YR2yu-FQSkE*QSb}(@zGJ>;!H^_Nu9im=Qtzt<UC$2MwZDld1E&-@iQ56F!4WS
u;Q!43bhDtqHGVloabq4Pb_RY?1_lNv5a4EHXW$oRU|?``a!OjHpa1{|Axw_|

-- 
GitLab