diff --git a/app.py b/app.py index 0af8fbbdfe9c052937633006e799f205fac37803..2fd2192dda9a75ddc890968da59f5510396b0c37 100644 --- a/app.py +++ b/app.py @@ -3,12 +3,13 @@ import os.path as op import zipfile import io import pathlib -from flask import Flask, flash, send_file +from flask import Flask, flash, send_file, url_for from flask_sqlalchemy import SQLAlchemy from jinja2 import Template from markupsafe import Markup from sqlalchemy.ext.hybrid import hybrid_property from sqlalchemy.sql import expression, functions +from werkzeug.utils import redirect from wtforms import validators @@ -88,14 +89,6 @@ class Programminglanguage(db.Model): return "{}".format(self.name) -class Matterofexpense(db.Model): - id = db.Column(db.Integer, primary_key=True) - name = db.Column(db.Unicode(64)) - - def __str__(self): - return "{}".format(self.name) - - class SoftwareCategory(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(120)) @@ -110,17 +103,18 @@ class Software(db.Model): name = db.Column(db.String(120)) short_description = db.Column(db.String(120)) developer = db.Column(db.String(120)) + maintainer = db.Column(db.String(120)) lastchanged = db.Column(db.Date) + price = db.Column(db.Integer()) + modelprice = type = db.Column(db.Enum('yearly', 'once', name='modelprice')) + license_id = db.Column(db.Integer(), db.ForeignKey(License.id)) license = db.relationship(License, backref='softwares') softwarecategory_id = db.Column(db.Integer(), db.ForeignKey(SoftwareCategory.id)) softwarecategory = db.relationship(SoftwareCategory, backref='software') - matterofexpense_id = db.Column(db.Integer(), db.ForeignKey(Matterofexpense.id)) - matterofexpense = db.relationship(Matterofexpense, backref='softwares') - features = db.relationship('Feature', secondary=software_features_table) languages = db.relationship('Language', secondary=software_languages_table) @@ -133,7 +127,7 @@ class Software(db.Model): 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')) + type = db.Column(db.Enum('repository', 'website', 'developer', 'tutorial', 'wiki', 'faq', 'other', name='link_types')) url = db.Column(db.String(120)) @@ -149,7 +143,7 @@ class Link(db.Model): # Flask views @app.route('/') def index(): - return '<a href="/admin/">Click me to get to Admin!</a>' + return redirect(url_for("admin.index")) # Custom filter class @@ -178,12 +172,18 @@ class AdvancedSoftwareView(sqla.ModelView): inline_models = (Link,) column_hide_backrefs = False - #def _user_formatter(view, context, model, name): - # return Markup(for link in model.links) - - #column_formatters = { - # 'links': _user_formatter - #} + def _links_formatter(view, context, model, name): + form_links = [] + for link in model.links: + form_link = "<a href='{}' target='_blank'>{}</a>".format(link.url,link.type) + if link.comment: + form_link = "<a href='{}' target='_blank'>{}-{}</a>".format(link.url,link.type,link.comment) + form_links.append(form_link) + return Markup(','.join(form_links)) + + column_formatters = { + 'links': _links_formatter + } @action('advancedexport', 'AdvancedExport') def action_advancedexport(self, ids): @@ -338,8 +338,10 @@ 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_view(sqla.ModelView(SoftwareCategory, 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_sub_category(name="Andere Sammlungen", parent_name="Other") +admin.add_link(MenuLink(name="CRAN-R", url='https://cran.r-project.org/web/views/', category='Andere Sammlungen', target="_blank")) +admin.add_link(MenuLink(name="ROpenSci", url='https://ropensci.org/packages/', category='Andere Sammlungen', target="_blank")) + def build_sample_db(): @@ -352,17 +354,33 @@ def build_sample_db(): db.drop_all() db.create_all() - lic_gpl = License(name="GPL", version="3.0") + lic_gpl3 = License(name="GPL", version="3.0") + lic_agpl3 = License(name="AGPL", version="3.0") + lic_lgpl = License(name="LGPL") lic_apache = License(name="Apache", version="2.0") lic_mit = License(name="MIT") - db.session.add(lic_gpl) + lic_prop = License(name="Proprietär") + db.session.add(lic_gpl3) + db.session.add(lic_agpl3) db.session.add(lic_apache) db.session.add(lic_mit) + db.session.add(lic_prop) - cat_tracking = SoftwareCategory(name="Tracking", short_description="") - db.session.add(cat_tracking) + cat_tracking = SoftwareCategory(name="datenschutzkonformes Tracking", short_description="Sammlung von Sensordaten/Logdaten oder Nutzungsdaten mit expliziter Einverständnis mittels Software auf dem Gerät.") + cat_scraping = SoftwareCategory(name="Scraping", short_description="Tools im Zusammenhang mit Web-Scraping.") + cat_int = SoftwareCategory(name="Forschungsplattformen", short_description="Integrierte Forschungsumgebungen/Plattformen für sozialwissenschaftliche Forschung.") + cat_qda = SoftwareCategory(name="QDA-Software", short_description="Computer-gestützte Analyse qualitativer Daten.") + cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware") - aware = Software(name="AWARE", softwarecategory=cat_tracking, license=lic_apache) + db.session.add(cat_tracking) + db.session.add(cat_scraping) + db.session.add(cat_int) + + aware = Software(name="AWARE", + short_description="", + developer="", + softwarecategory=cat_tracking, + license=lic_apache) db.session.add(aware) db.session.add(Link(software=aware, type="website", url="http://www.awareframework.com/", comment="")) db.session.add(Link(software=aware, type="repository", url="https://github.com/denzilferreira/aware-client", comment="android")) @@ -370,6 +388,112 @@ def build_sample_db(): db.session.add(Link(software=aware, type="repository", url="https://github.com/tetujin/aware-client-osx", comment="OSX")) db.session.add(Link(software=aware, type="repository", url="https://github.com/denzilferreira/aware-server", comment="server")) + meili = Software(name="MEILI", + short_description="", + developer="Adrian C. Prelipcean", + softwarecategory=cat_tracking, + license=lic_gpl3) + db.session.add(meili) + db.session.add(Link(software=meili, type="repository", url="https://github.com/Badger-MEILI", + comment="group")) + + passivedatakit = Software(name="Passive Data Kit", + developer="Chris Karr", + softwarecategory=cat_tracking, + license=lic_apache) + db.session.add(passivedatakit) + db.session.add(Link(software=passivedatakit, type="website", url="https://passivedatakit.org/", comment="")) + db.session.add(Link(software=passivedatakit, type="repository", url="https://github.com/audaciouscode/PassiveDataKit-Django", comment="djangoserver")) + db.session.add(Link(software=passivedatakit, type="repository", url="https://github.com/audaciouscode/PassiveDataKit-Android", comment="android")) + db.session.add(Link(software=passivedatakit, type="repository", url="https://github.com/audaciouscode/PassiveDataKit-iOS", comment="iOS")) + + rselenium = Software(name="RSelenium", + developer="John Harrison", + maintainer="Ju Yeong Kim", + softwarecategory=cat_scraping, + license=lic_agpl3) + db.session.add(rselenium) + db.session.add(Link(software=rselenium, type="repository", url="https://github.com/ropensci/RSelenium", comment="")) + + amcat = Software(name="AmCAT", + short_description="The Amsterdam Content Analysis Toolkit (AmCAT) is an open source infrastructure that makes it easy to do large-scale automatic and manual content analysis (text analysis) for the social sciences and humanities.", + developer="Chris Karr", + maintainer="Ju Yeong Kim", + softwarecategory=cat_int, + license=lic_agpl3) + db.session.add(amcat) + db.session.add(Link(software=amcat, type="website", url="http://vanatteveldt.com/amcat/", comment="entwickler")) + db.session.add(Link(software=amcat, type="repository", url="https://github.com/amcat/amcat", comment="")) + db.session.add(Link(software=amcat, type="wiki", url="http://wiki.amcat.nl/3.4:AmCAT_Navigator_3", comment="")) + + cosmos = Software(name="COSMOS", + short_description="COSMOS Open Data Analytics software", + developer="", + maintainer="", + softwarecategory=cat_int, + license=lic_prop) + db.session.add(cosmos) + db.session.add(Link(software=cosmos, type="website", url="http://socialdatalab.net/COSMOS", comment="")) + + + lcm = Software(name="LCM", + short_description="Leipzig Corpus Miner a decentralized SaaS application for the analysis of very large amounts of news texts ", + developer="Gregor Wiedeman, Andreas Niekler", + maintainer="", + softwarecategory=cat_int, + license=lic_lgpl) + db.session.add(lcm) + db.session.add(Link(software=lcm, type="website", url="http://lcm.informatik.uni-leipzig.de/generic.html", comment="")) + + ilcm = Software(name="iLCM", + short_description="The iLCM(LCM=Leipzig Corpus Miner) project pursues the development of an integrated research environment for the analysis of structured and unstructured data in a ‘Software as a Service’ architecture (SaaS). The research environment addresses requirements for the quantitative evaluation of large amounts of qualitative data using text mining methods and requirements for the reproducibility of data-driven research designs in the social sciences.", + developer="Gregor Wiedeman, Andreas Niekler", + maintainer="", + softwarecategory=cat_int, + license=lic_lgpl) + db.session.add(ilcm) + db.session.add(Link(software=ilcm, type="website", url="https://ilcm.informatik.uni-leipzig.de/", comment="")) + + atlasti = Software(name="ATLAS.ti", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_qda, + license=lic_prop) + db.session.add(atlasti) + db.session.add(Link(software=atlasti, type="website", url="https://atlasti.com/de/produkt/what-is-atlas-ti/", comment="")) + + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=, + license=lic_) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + + + ''' + tool = Software(name="", + short_description="", + developer="", + maintainer="", + softwarecategory=, + license=lic_) + db.session.add(tool) + db.session.add(Link(software=tool, type="website", url="", comment="")) + ''' + + + + f4analyse = Software(name="f4analyse", + short_description="", + developer="", + maintainer="", + softwarecategory=cat_transkript, + license=lic_prop) + db.session.add(f4analyse) + db.session.add(Link(software=f4analyse, type="website", url="", comment="")) db.session.commit() return diff --git a/sample_db.sqlite b/sample_db.sqlite index eac3f58be98c21776a2dc8da005f0dfc9829646e..681dfb27abb30d999720a9d4ce84e5a0a7f2a0bc 100644 Binary files a/sample_db.sqlite and b/sample_db.sqlite differ diff --git a/templates/admin/index.html b/templates/admin/index.html index 8eab106b061466e2cfe7ed09105cb38f05c75857..4a39a1ec2924c8e9edcc3585f37a2bfb4b6c4325 100644 --- a/templates/admin/index.html +++ b/templates/admin/index.html @@ -4,17 +4,11 @@ <div class="container"> <div class="row"> <div class="col-sm-10 col-sm-offset-1"> - <h1>Flask-Admin example</h1> + <h1>Digitale Methoden WiSo-Fakultät</h1> <p class="lead"> - Basic SQLAlchemy model views. + Weitere Infos zum Projekt finden sich <a href="https://www.wiso.uni-hamburg.de/forschung/forschungslabor/aktuelleprojekte/digitale-methoden.html" target="_blank">hier</a> </p> - <p> - This example shows how to add basic CRUD-views for your SQLAlchemy models. - </p> - <p> - The views are generated automatically, but it is perfectly possible to customize them to suit your needs. - </p> - <a class="btn btn-primary" href="/"><i class="glyphicon glyphicon-chevron-left"></i> Back</a> + <!--<a class="btn btn-primary" href="/"><i class="glyphicon glyphicon-chevron-left"></i> Back</a>--> </div> </div> </div>