From 3e6260ada449e1a8b556344c65c32151429bd228 Mon Sep 17 00:00:00 2001
From: Fabian Gallenkamp <fabian.gallenkamp@uni-hamburg.de>
Date: Wed, 13 Feb 2019 16:01:50 +0100
Subject: [PATCH] multiple tools added

---
 app.py                            | 398 ++++++++++++++++++++++++++++--
 sample_db.sqlite                  | Bin 45056 -> 53248 bytes
 templates/export/softwares.jinja2 |   7 +
 3 files changed, 386 insertions(+), 19 deletions(-)
 create mode 100644 templates/export/softwares.jinja2

diff --git a/app.py b/app.py
index 493dc54..0ce9c30 100644
--- a/app.py
+++ b/app.py
@@ -85,6 +85,8 @@ class Programminglanguage(db.Model):
     id = db.Column(db.Integer, primary_key=True)
     name = db.Column(db.Unicode(64))
 
+    version = db.Column(db.String(100))
+
     def __str__(self):
         return "{}".format(self.name)
 
@@ -121,6 +123,8 @@ class Software(db.Model):
 
     programminglanguages = db.relationship('Programminglanguage', secondary=software_programminglanguages_table)
 
+    architecture = db.Column(db.Enum('standalone', 'package', 'framework', 'app', 'SaaS', 'other', name='software_types'))
+
     def __str__(self):
         return "{}".format(self.name)
 
@@ -167,10 +171,11 @@ inline_form_options = {
 }'''
 
 class AdvancedSoftwareView(sqla.ModelView):
-    column_sortable_list = ('name', ('license', ("license.name", "license.version")), 'lastchanged' , ('softwarecategory', 'softwarecategory.name'),)
-    column_list = ('name', 'license', 'softwarecategory', 'links', )
+    column_sortable_list = ('name', ('license', ("license.name", "license.version")) , ('softwarecategory', 'softwarecategory.name'), 'lastchanged', )
+    column_list = ('name', 'license', 'softwarecategory', 'links', 'architecture','programminglanguages', )
     inline_models = (Link,)
     column_hide_backrefs = False
+    page_size = 100
 
     def _links_formatter(view, context, model, name):
         form_links = []
@@ -188,13 +193,25 @@ class AdvancedSoftwareView(sqla.ModelView):
     @action('advancedexport', 'AdvancedExport')
     def action_advancedexport(self, ids):
         try:
+            # Generate sub pages
             with open('templates/export/software.jinja2', "r", encoding="utf-8") as file_:
                 template = Template(file_.read())
             softwares = Software.query.filter(Software.id.in_(ids))
             for software_tool in softwares:
-                template.stream(name=software_tool.name).dump('./data/' + software_tool.name + '.asciidoc', encoding='utf-8')
+                template.stream(name=software_tool.name).dump('../digitale-Methoden-wiki/Tool_' + software_tool.name.replace(' ','') + '.asciidoc', encoding='utf-8')
 
-            base_path = pathlib.Path('./data/')
+            softwareincategory = []
+            software_categorys = SoftwareCategory.query.all()
+            for software_category in software_categorys:
+                softwares = Software.query.filter(Software.softwarecategory_id == software_category.id)
+                softwareincategory.append((software_category,softwares))
+
+            # Generate overview page
+            with open('templates/export/softwares.jinja2', "r", encoding="utf-8") as file_:
+                template = Template(file_.read())
+            template.stream(softwareincategory=softwareincategory).dump('../digitale-Methoden-wiki/Softwareübersicht.asciidoc', encoding='utf-8')
+
+            base_path = pathlib.Path('../digitale-Methoden-wiki/')
             data = io.BytesIO()
             with zipfile.ZipFile(data, mode='w') as z:
                 for f_name in base_path.iterdir():
@@ -354,23 +371,45 @@ def build_sample_db():
 
     db.drop_all()
     db.create_all()
+    lic_bsd = License(name="BSD")
+    lic_gpl2 = License(name="GPL", version="2.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_apache2 = License(name="Apache", version="2.0")
     lic_mit = License(name="MIT")
     lic_prop = License(name="Proprietär")
     db.session.add(lic_gpl3)
+    db.session.add(lic_gpl3)
     db.session.add(lic_agpl3)
-    db.session.add(lic_apache)
+    db.session.add(lic_apache2)
     db.session.add(lic_mit)
     db.session.add(lic_prop)
 
+    prol_r = Programminglanguage(name="R")
+    prol_py = Programminglanguage(name="Python")
+    prol_cy = Programminglanguage(name="Cython")
+    prol_java = Programminglanguage(name="Java")
+    prol_objc = Programminglanguage(name="Objective-C")
+    db.session.add(prol_r)
+    db.session.add(prol_py)
+    db.session.add(prol_java)
+    db.session.add(prol_objc)
+
     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_tm = SoftwareCategory(name="Automatisierte Inhaltsanalyse/Text Mining", short_description="")
+
+    cat_senti = SoftwareCategory(name="Sentiment Analysis", short_description="")
+    cat_topic = SoftwareCategory(name="Topic-Modellierung", short_description="")
     cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware")
+    cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware")
+    cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware")
+    cat_esmema = SoftwareCategory(name="ESM/EMA-Studien", short_description="Datenerhebung in 'natürlicher' Umgebung.")
+    cat_transkript = SoftwareCategory(name="Audio-Transkribtion", short_description="Transkriptionssoftware")
+    cat_misc = SoftwareCategory(name="Weiteres", short_description="Zu speziell zum Einordnen..")
 
     db.session.add(cat_tracking)
     db.session.add(cat_scraping)
@@ -379,8 +418,10 @@ def build_sample_db():
     aware = Software(name="AWARE",
                      short_description="",
                      developer="",
+                     maintainer="",
                      softwarecategory=cat_tracking,
-                     license=lic_apache)
+                     architecture="framework",
+                     license=lic_apache2)
     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"))
@@ -391,16 +432,22 @@ def build_sample_db():
     meili = Software(name="MEILI",
                      short_description="",
                      developer="Adrian C. Prelipcean",
+                     maintainer="Adrian C. Prelipcean",
                      softwarecategory=cat_tracking,
+                     architecture="framework",
                      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",
+                              short_description="",
                               developer="Chris Karr",
+                              maintainer="Chris Karr",
                               softwarecategory=cat_tracking,
-                              license=lic_apache)
+                              architecture="framework",
+                              license=lic_apache2,
+                              programminglanguages=[prol_py,prol_java])
     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"))
@@ -411,6 +458,7 @@ def build_sample_db():
                          developer="John Harrison",
                          maintainer="Ju Yeong Kim",
                          softwarecategory=cat_scraping,
+                         architecture="package",
                          license=lic_agpl3)
     db.session.add(rselenium)
     db.session.add(Link(software=rselenium, type="repository", url="https://github.com/ropensci/RSelenium", comment=""))
@@ -420,6 +468,7 @@ def build_sample_db():
                      developer="Chris Karr",
                      maintainer="Ju Yeong Kim",
                      softwarecategory=cat_int,
+                     architecture="SaaS",
                      license=lic_agpl3)
     db.session.add(amcat)
     db.session.add(Link(software=amcat, type="website", url="http://vanatteveldt.com/amcat/", comment="entwickler"))
@@ -431,6 +480,7 @@ def build_sample_db():
                      developer="",
                      maintainer="",
                      softwarecategory=cat_int,
+                     architecture="standalone",
                      license=lic_prop)
     db.session.add(cosmos)
     db.session.add(Link(software=cosmos, type="website", url="http://socialdatalab.net/COSMOS", comment=""))
@@ -441,6 +491,7 @@ def build_sample_db():
                      developer="Gregor Wiedeman, Andreas Niekler",
                      maintainer="",
                      softwarecategory=cat_int,
+                     architecture="framework",
                      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=""))
@@ -449,6 +500,7 @@ def build_sample_db():
                      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="",
+                     architecture="SaaS",
                      softwarecategory=cat_int,
                      license=lic_lgpl)
     db.session.add(ilcm)
@@ -459,6 +511,7 @@ def build_sample_db():
                      developer="",
                      maintainer="",
                      softwarecategory=cat_qda,
+                     architecture="standalone",
                      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=""))
@@ -468,40 +521,347 @@ def build_sample_db():
                      developer="",
                      maintainer="",
                      softwarecategory=cat_qda,
+                     architecture="standalone",
                      license=lic_prop)
     db.session.add(leximancer)
     db.session.add(Link(software=leximancer, type="website", url="https://info.leximancer.com/", comment=""))
 
-    maxqda = Software(name="MAXQDA",
+    tool = Software(name="MAXQDA",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_qda,
+                    architecture="standalone",
+                    license=lic_prop)
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://www.rrz.uni-hamburg.de/services/software/alphabetisch/maxqda.html", comment=""))
+
+    tool = Software(name="NVivo",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_qda,
+                    license=lic_prop,
+                    programminglanguages=[])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://www.qsrinternational.com/nvivo/who-uses-nvivo/academics", comment=""))
+
+    tool = Software(name="QDAMiner",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_qda,
+                    license=lic_prop,
+                    programminglanguages=[])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://provalisresearch.com/products/qualitative-data-analysis-software/", comment=""))
+
+    tool = Software(name="ORA Pro",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_qda,
+                    license=lic_prop,
+                    programminglanguages=[])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://netanomics.com/", comment=""))
+
+    tool = Software(name="Quirkos",
                      short_description="",
                      developer="",
                      maintainer="",
-                     softwarecategory=cat_transkript,
-                     license=lic_prop)
-    db.session.add(maxqda)
-    db.session.add(Link(software=maxqda, type="website", url="https://www.rrz.uni-hamburg.de/services/software/alphabetisch/maxqda.html", comment=""))
+                     softwarecategory=cat_qda,
+                     license=lic_prop,
+                     programminglanguages=[])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://www.quirkos.com/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="RQDA",
+                    short_description="It includes a number of standard Computer-Aided Qualitative Data Analysis features. In addition it seamlessly integrates with R, which means that a) statistical analysis on the coding is possible, and b) functions for data manipulation and analysis can be easily extended by writing R functions. To some extent, RQDA and R make an integrated platform for both quantitative and qualitative data analysis.",
+                    developer="Ronggui Huang",
+                    maintainer="Ronggui Huang",
+                    softwarecategory=cat_qda,
+                    license=lic_bsd,
+                    programminglanguages=[prol_r])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://rqda.r-forge.r-project.org/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/Ronggui/RQDA", comment=""))
+
+    tool = Software(name="TAMS",
+                    short_description="Text Analysis Markup System (TAMS) is both a system of marking documents for qualitative analysis and a series of tools for mining information based on that syntax.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_qda,
+                    license=lic_gpl2,
+                    programminglanguages=[])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://sourceforge.net/projects/tamsys", comment=""))
+
+    tool = Software(name="Apache OpenNLP",
+                    short_description="OpenNLP supports the most common NLP tasks, such as tokenization, sentence segmentation, part-of-speech tagging, named entity extraction, chunking, parsing, language detection and coreference resolution.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    license=lic_apache2,
+                    architecture="package",
+                    programminglanguages=[prol_java])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://opennlp.apache.org/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="GATE",
+                    short_description="GATE - General Architecture for Text Engineering",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="package",
+                    license=lic_lgpl,
+                    programminglanguages=[prol_java])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://gate.ac.uk/overview.html", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/GateNLP/gate-core", comment=""))
+
+    tool = Software(name="NLTK",
+                    short_description="NLTK is a leading platform for building Python programs to work with human language data. It provides easy-to-use interfaces to over 50 corpora and lexical resources such as WordNet, along with a suite of text processing libraries for classification, tokenization, stemming, tagging, parsing, and semantic reasoning, wrappers for industrial-strength NLP libraries, and an active discussion forum.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="package",
+                    license=lic_apache2,
+                    programminglanguages=[prol_py])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://www.nltk.org/index.html", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/nltk/nltk", comment=""))
+
+    tool = Software(name="Gensim",
+                    short_description="Gensim is a Python library for topic modelling, document indexing and similarity retrieval with large corpora. Target audience is the natural language processing (NLP) and information retrieval (IR) community.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="package",
+                    license=lic_lgpl,
+                    programminglanguages=[prol_py])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://pypi.org/project/gensim/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="Pandas",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="package",
+                    license=lic_bsd,
+                    programminglanguages=[prol_py])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://pandas.pydata.org/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/pandas-dev/pandas", comment=""))
+
+    tool = Software(name="spaCy",
+                    short_description=" spaCy excels at large-scale information extraction tasks. It's written from the ground up in carefully memory-managed Cython. Independent research has confirmed that spaCy is the fastest in the world. If your application needs to process entire web dumps, spaCy is the library you want to be using.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="package",
+                    license=lic_mit,
+                    programminglanguages=[prol_cy])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://spacy.io/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/explosion/spaCy", comment=""))
+
+    tool = Software(name="RapidMiner",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="framework",
+                    license=lic_agpl3,
+                    programminglanguages=[prol_java])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://rapidminer.com/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/rapidminer/rapidminer-studio", comment=""))
+
+    tool = Software(name="tm",
+                    short_description="",
+                    developer="Ingo Feinerer, Kurt Hornik",
+                    maintainer="Ingo Feinerer, Kurt Hornik",
+                    softwarecategory=cat_tm,
+                    architecture="package",
+                    license=lic_gpl3,
+                    programminglanguages=[prol_r])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://tm.r-forge.r-project.org/", comment=""))
+    db.session.add(Link(software=tool, type="website", url="https://cran.r-project.org/package=tm", comment="cran"))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="Stanford CoreNLP",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="framework",
+                    license=lic_gpl3,
+                    programminglanguages=[prol_java])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="https://stanfordnlp.github.io/CoreNLP/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/stanfordnlp/CoreNLP", comment=""))
+
+    tool = Software(name="xtas",
+                    short_description="the eXtensible Text Analysis Suite(xtas) is a collection of natural language processing and text mining tools, brought together in a single software package with built-in distributed computing and support for the Elasticsearch document store.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_tm,
+                    architecture="framework",
+                    license=lic_apache2,
+                    programminglanguages=[prol_py])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://nlesc.github.io/xtas/", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/NLeSC/xtas", comment=""))
+
+    tool = Software(name="Stm",
+                    short_description="The Structural Topic Model (STM) allows researchers to estimate topic models with document-level covariates. The package also includes tools for model selection, visualization, and estimation of topic-covariate regressions. Methods developed in Roberts et al (2014) <doi:10.1111/ajps.12103> and Roberts et al (2016) <doi:10.1080/01621459.2016.1141684>.",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_topic,
+                    architecture="package",
+                    license=lic_mit,
+                    programminglanguages=[prol_r])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="http://structuraltopicmodel.com", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="https://github.com/bstewart/stm", comment=""))
 
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
+
+    tool = Software(name="",
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
+    db.session.add(tool)
+    db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
     '''
     tool = Software(name="",
-                     short_description="",
-                     developer="",
-                     maintainer="",
-                     softwarecategory=,
-                     license=lic_)
+                    short_description="",
+                    developer="",
+                    maintainer="",
+                    softwarecategory=cat_,
+                    architecture="package",
+                    license=lic_,
+                    programminglanguages=[prol_])
     db.session.add(tool)
     db.session.add(Link(software=tool, type="website", url="", comment=""))
+    db.session.add(Link(software=tool, type="repository", url="", comment=""))
     '''
 
 
+    paco = Software(name="paco",
+                     short_description="",
+                     developer="Bob Evans",
+                     maintainer="Bob Evans",
+                     softwarecategory=cat_esmema,
+                     architecture="framework",
+                     license=lic_apache2,
+                     programminglanguages=[prol_objc, prol_java])
+    db.session.add(paco)
+    db.session.add(Link(software=paco, type="website", url="https://www.pacoapp.com/", comment=""))
+    db.session.add(Link(software=paco, type="repository", url="https://github.com/google/paco", comment=""))
 
     f4analyse = Software(name="f4analyse",
                      short_description="",
                      developer="",
                      maintainer="",
                      softwarecategory=cat_transkript,
+                     architecture="standalone",
                      license=lic_prop)
     db.session.add(f4analyse)
-    db.session.add(Link(software=f4analyse, type="website", url="", comment=""))
+    db.session.add(Link(software=f4analyse, type="website", url="https://www.audiotranskription.de/f4-analyse", comment=""))
 
     db.session.commit()
     return
diff --git a/sample_db.sqlite b/sample_db.sqlite
index d94e828b6dace831930de402a07592a3bef3dc3d..81c755dbc5d1178004e2e2b7319413fd5bbc7d35 100644
GIT binary patch
literal 53248
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
A^Z)<=

delta 466
zcmZozz})bFX@Wc>_e2FxaduV){t|vBzFyvMyk6XXT<M%u9MSBon-v9G**3?rd9rXd
zSF*8-%gQpgyKdgVrOG(@Blqda2E6O}L|E9xjg1)_{Yw&)a#ANN@(EAkOP>6JPiS*5
zUpb=y8~+vt{xAH``ET%_=ikS_WwW5d0{+cg<O38ovluW6@bU#Q@Tc<|@g3r8<O|xY
zDB!@yq{}+_e5~%~#<+S$IbH?^25zoG2L8AF$NA^;=kXQrS@6!}UdY|W)yY-3Sy3RE
zOI?hcn?atJ7o?PtG0h|~FEOXGIF*&Pv5t#}L9sa!Dl=Ij>yw%&CpUvEOs!*xk7KZ2
zNhT{xb14T8gJ`?3FT{||e%UV>`5R@}c^HHnlc9o>y>ln<nz3;+NCv}9{FJNB-&oDc
z!yw*lsHn=oz`)2j**xz(uRaSmgFJ&eRKy}*g;$N4n?aXBkpZNJb8=z66d$t+6E}l6
zuPI1~lXLRgd`V$JMvw@|2@H&!j^U0$uFRVhSQHksC<ri%a92%cU!cKQwOLWXi<_TM
XgpEO(myx$THK{nWBz1G=>T(tUpHgOR

diff --git a/templates/export/softwares.jinja2 b/templates/export/softwares.jinja2
new file mode 100644
index 0000000..7515a18
--- /dev/null
+++ b/templates/export/softwares.jinja2
@@ -0,0 +1,7 @@
+{% for softwarecategory in softwareincategory %}
+== {{ softwarecategory[0].name }}
+_{{softwarecategory[0].short_description}}_
+{% for software in softwarecategory[1] %}
+link:Tool_{{ software.name.replace(' ','') }}.asciidoc[{{ software.name }}] ({% for link in software.links %}link:{{link.url}}[{{link.type}}{{'-'+link.comment if link.comment else '' }}] {% endfor %}):: {{software.short_description}} < {{software.license}} | {{software.architecture}} | {% for prol in software.programminglanguages %}{{prol.name}} {% endfor %} >
+{% endfor %}
+{% endfor %}
\ No newline at end of file
-- 
GitLab