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