# HG changeset patch # User Sandro Knauß # Date 1335359188 -7200 # Node ID f65edc0382cc42f95bb6f09ff149c40c76852dbe # Parent 4841b443f1fda0422153db90eb42c62f60cb9841 prepare for release: * diffrent web directory with all web specific content (split doc dir -> doc (data) and web (rendered data)) * update installation diff -r 4841b443f1fd -r f65edc0382cc .hgignore --- a/.hgignore Wed Apr 25 00:06:27 2012 +0200 +++ b/.hgignore Wed Apr 25 15:06:28 2012 +0200 @@ -19,3 +19,9 @@ doc/_build/* twisted/plugins/dropin.cache *.db +*.old +_build/ +web/dev/ +web/*.html +web/files/*.tar.gz +web.tar.gz diff -r 4841b443f1fd -r f65edc0382cc Makefile --- a/Makefile Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,153 +0,0 @@ -# Makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = sphinx-build -PAPER = -BUILDDIR = doc/_build - -# Internal variables. -PAPEROPT_a4 = -D latex_paper_size=a4 -PAPEROPT_letter = -D latex_paper_size=letter -ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) doc -# the i18n builder cannot share the environment and doctrees with the others -I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) doc - -.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext - -help: - @echo "Please use \`make ' where is one of" - @echo " html to make standalone HTML files" - @echo " dirhtml to make HTML files named index.html in directories" - @echo " singlehtml to make a single large HTML file" - @echo " pickle to make pickle files" - @echo " json to make JSON files" - @echo " htmlhelp to make HTML files and a HTML help project" - @echo " qthelp to make HTML files and a qthelp project" - @echo " devhelp to make HTML files and a Devhelp project" - @echo " epub to make an epub" - @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" - @echo " latexpdf to make LaTeX files and run them through pdflatex" - @echo " text to make text files" - @echo " man to make manual pages" - @echo " texinfo to make Texinfo files" - @echo " info to make Texinfo files and run them through makeinfo" - @echo " gettext to make PO message catalogs" - @echo " changes to make an overview of all changed/added/deprecated items" - @echo " linkcheck to check all external links for integrity" - @echo " doctest to run all doctests embedded in the documentation (if enabled)" - -clean: - -rm -rf $(BUILDDIR)/* - -html: - $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." - -dirhtml: - $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml - @echo - @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." - -singlehtml: - $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml - @echo - @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." - -pickle: - $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle - @echo - @echo "Build finished; now you can process the pickle files." - -json: - $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json - @echo - @echo "Build finished; now you can process the JSON files." - -htmlhelp: - $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp - @echo - @echo "Build finished; now you can run HTML Help Workshop with the" \ - ".hhp project file in $(BUILDDIR)/htmlhelp." - -qthelp: - $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp - @echo - @echo "Build finished; now you can run "qcollectiongenerator" with the" \ - ".qhcp project file in $(BUILDDIR)/qthelp, like this:" - @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Iro.qhcp" - @echo "To view the help file:" - @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Iro.qhc" - -devhelp: - $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp - @echo - @echo "Build finished." - @echo "To view the help file:" - @echo "# mkdir -p $$HOME/.local/share/devhelp/Iro" - @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Iro" - @echo "# devhelp" - -epub: - $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub - @echo - @echo "Build finished. The epub file is in $(BUILDDIR)/epub." - -latex: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo - @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." - @echo "Run \`make' in that directory to run these through (pdf)latex" \ - "(use \`make latexpdf' here to do that automatically)." - -latexpdf: - $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex - @echo "Running LaTeX files through pdflatex..." - $(MAKE) -C $(BUILDDIR)/latex all-pdf - @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." - -text: - $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text - @echo - @echo "Build finished. The text files are in $(BUILDDIR)/text." - -man: - $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man - @echo - @echo "Build finished. The manual pages are in $(BUILDDIR)/man." - -texinfo: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo - @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo." - @echo "Run \`make' in that directory to run these through makeinfo" \ - "(use \`make info' here to do that automatically)." - -info: - $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo - @echo "Running Texinfo files through makeinfo..." - make -C $(BUILDDIR)/texinfo info - @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo." - -gettext: - $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale - @echo - @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale." - -changes: - $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes - @echo - @echo "The overview file is in $(BUILDDIR)/changes." - -linkcheck: - $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck - @echo - @echo "Link check complete; look for any errors in the above output " \ - "or in $(BUILDDIR)/linkcheck/output.txt." - -doctest: - $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest - @echo "Testing of doctests in the sources finished, look at the " \ - "results in $(BUILDDIR)/doctest/output.txt." diff -r 4841b443f1fd -r f65edc0382cc createdoc.py --- a/createdoc.py Wed Apr 25 00:06:27 2012 +0200 +++ b/createdoc.py Wed Apr 25 15:06:28 2012 +0200 @@ -5,7 +5,13 @@ from genshi import Markup loader = TemplateLoader('doc/tmpl', auto_reload=True) + +from glob import glob +import re +import os.path import inspect +from pkg_resources import parse_version + from docutils.core import publish_doctree import docutils @@ -13,6 +19,10 @@ from docutils import core from docutils.writers.html4css1 import Writer,HTMLTranslator +from iro.view.xmlrpc import TwistedInterface as Current +from iro import __version__ +from createerm import createSchemaPlot, tables, tables_cls + class NoHeaderHTMLTranslator(HTMLTranslator): def __init__(self, document): HTMLTranslator.__init__(self,document) @@ -38,9 +48,6 @@ return core.publish_from_doctree(d, writer=_w) -from iro.view.xmlrpc import TwistedInterface as Current - -from createerm import createSchemaPlot, tables, tables_cls class Link(): def __init__(self,name,title): @@ -169,6 +176,11 @@ self.description = Markup(core.publish_string(cls.__doc__,writer=_w)) +class File: + def __init__(self,path): + self.version = re.search("/iro-(.*).tar.gz",path).group(1) + self.name = os.path.basename(path) + def main(): sites=[Site("index.html","Iro"), @@ -177,11 +189,22 @@ Site("about.html","About us"), ] + files=[File(f) for f in glob("web/files/*tar.gz")] + files.sort(key=lambda a:parse_version(a.version),reverse=True) + code ="files/iro-%s.tar.gz"%__version__ + current_methods = dict(inspect.getmembers(Current())) current=[ Method(i,current_methods) for i in Current().listMethods() if i != "listMethods" ] t = [Table(tables_cls[str(f)]) for f in tables] - createSchemaPlot('doc/images/db-schema.svg') + createSchemaPlot('web/images/db-schema.svg') + + gd = {"sites":sites, + "current":current, + "tables": t, + "code":code, + "files":files + } for site in sites: print("generiere %s" % site.name) @@ -189,8 +212,8 @@ def a(s): if s == site: return {"class":"menu active"} - stream = tmpl.generate(sites=sites, active=a, current=current, tables=t) - with open('doc/'+site.name, "w") as g: + stream = tmpl.generate(active=a, **gd) + with open('web/'+site.name, "w") as g: g.write(stream.render('html', doctype='html')) if __name__ == '__main__': diff -r 4841b443f1fd -r f65edc0382cc doc/about.html --- a/doc/about.html Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ - - - - - - Iro · About us - - - - - - - - - - - - -
-
-
-

About us

-
-

Contact

-

- Netzguerilla.net Clerc Knauß Vollnhals GbR
- Manteuffelstraße 40
- 10997 Berlin -

-

- WWW: netzguerilla.net
-

-

- E-Mail: iro@netzguerilla.net
-

-

- Telefon: +49 30 69201075
-

-

German legal notice - Inhaltlich verantwortlich

-

- Verantwortlich für den Inhalt nach § 55 Abs. 2 RStV bzw. §5 TMG sowie beauftragt mit dem Jugendschutz gemäß TMG, JMStV sowie GjSM:
- Sandro Knauß, Anschrift wie oben, iro@netzguerilla.net -

-
-
-
-
-
-
- -
- - \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/conf.py --- a/doc/conf.py Wed Apr 25 00:06:27 2012 +0200 +++ b/doc/conf.py Wed Apr 25 15:06:28 2012 +0200 @@ -25,7 +25,7 @@ # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode'] +extensions = ['sphinx.ext.autodoc', 'sphinx.ext.doctest', 'sphinx.ext.todo', 'sphinx.ext.coverage', 'sphinx.ext.ifconfig', 'sphinx.ext.viewcode','sphinx.ext.extlinks'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] @@ -242,3 +242,5 @@ #texinfo_show_urls = 'footnote' autoclass_content = 'both' + +extlinks = {'irofile': ("../files/iro-%s.tar.gz","Iro ")} diff -r 4841b443f1fd -r f65edc0382cc doc/css/960.css --- a/doc/css/960.css Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -.container_12,.container_16{margin-left:auto;margin-right:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16{display:inline;float:left;margin-left:10px;margin-right:10px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15{position:relative}.container_12 .grid_3,.container_16 .grid_4{width:220px}.container_12 .grid_6,.container_16 .grid_8{width:460px}.container_12 .grid_9,.container_16 .grid_12{width:700px}.container_12 .grid_12,.container_16 .grid_16{width:940px}.alpha{margin-left:0}.omega{margin-right:0}.container_12 .grid_1{width:60px}.container_12 .grid_2{width:140px}.container_12 .grid_4{width:300px}.container_12 .grid_5{width:380px}.container_12 .grid_7{width:540px}.container_12 .grid_8{width:620px}.container_12 .grid_10{width:780px}.container_12 .grid_11{width:860px}.container_16 .grid_1{width:40px}.container_16 .grid_2{width:100px}.container_16 .grid_3{width:160px}.container_16 .grid_5{width:280px}.container_16 .grid_6{width:340px}.container_16 .grid_7{width:400px}.container_16 .grid_9{width:520px}.container_16 .grid_10{width:580px}.container_16 .grid_11{width:640px}.container_16 .grid_13{width:760px}.container_16 .grid_14{width:820px}.container_16 .grid_15{width:880px}.container_12 .prefix_3,.container_16 .prefix_4{padding-left:240px}.container_12 .prefix_6,.container_16 .prefix_8{padding-left:480px}.container_12 .prefix_9,.container_16 .prefix_12{padding-left:720px}.container_12 .prefix_1{padding-left:80px}.container_12 .prefix_2{padding-left:160px}.container_12 .prefix_4{padding-left:320px}.container_12 .prefix_5{padding-left:400px}.container_12 .prefix_7{padding-left:560px}.container_12 .prefix_8{padding-left:640px}.container_12 .prefix_10{padding-left:800px}.container_12 .prefix_11{padding-left:880px}.container_16 .prefix_1{padding-left:60px}.container_16 .prefix_2{padding-left:120px}.container_16 .prefix_3{padding-left:180px}.container_16 .prefix_5{padding-left:300px}.container_16 .prefix_6{padding-left:360px}.container_16 .prefix_7{padding-left:420px}.container_16 .prefix_9{padding-left:540px}.container_16 .prefix_10{padding-left:600px}.container_16 .prefix_11{padding-left:660px}.container_16 .prefix_13{padding-left:780px}.container_16 .prefix_14{padding-left:840px}.container_16 .prefix_15{padding-left:900px}.container_12 .suffix_3,.container_16 .suffix_4{padding-right:240px}.container_12 .suffix_6,.container_16 .suffix_8{padding-right:480px}.container_12 .suffix_9,.container_16 .suffix_12{padding-right:720px}.container_12 .suffix_1{padding-right:80px}.container_12 .suffix_2{padding-right:160px}.container_12 .suffix_4{padding-right:320px}.container_12 .suffix_5{padding-right:400px}.container_12 .suffix_7{padding-right:560px}.container_12 .suffix_8{padding-right:640px}.container_12 .suffix_10{padding-right:800px}.container_12 .suffix_11{padding-right:880px}.container_16 .suffix_1{padding-right:60px}.container_16 .suffix_2{padding-right:120px}.container_16 .suffix_3{padding-right:180px}.container_16 .suffix_5{padding-right:300px}.container_16 .suffix_6{padding-right:360px}.container_16 .suffix_7{padding-right:420px}.container_16 .suffix_9{padding-right:540px}.container_16 .suffix_10{padding-right:600px}.container_16 .suffix_11{padding-right:660px}.container_16 .suffix_13{padding-right:780px}.container_16 .suffix_14{padding-right:840px}.container_16 .suffix_15{padding-right:900px}.container_12 .push_3,.container_16 .push_4{left:240px}.container_12 .push_6,.container_16 .push_8{left:480px}.container_12 .push_9,.container_16 .push_12{left:720px}.container_12 .push_1{left:80px}.container_12 .push_2{left:160px}.container_12 .push_4{left:320px}.container_12 .push_5{left:400px}.container_12 .push_7{left:560px}.container_12 .push_8{left:640px}.container_12 .push_10{left:800px}.container_12 .push_11{left:880px}.container_16 .push_1{left:60px}.container_16 .push_2{left:120px}.container_16 .push_3{left:180px}.container_16 .push_5{left:300px}.container_16 .push_6{left:360px}.container_16 .push_7{left:420px}.container_16 .push_9{left:540px}.container_16 .push_10{left:600px}.container_16 .push_11{left:660px}.container_16 .push_13{left:780px}.container_16 .push_14{left:840px}.container_16 .push_15{left:900px}.container_12 .pull_3,.container_16 .pull_4{left:-240px}.container_12 .pull_6,.container_16 .pull_8{left:-480px}.container_12 .pull_9,.container_16 .pull_12{left:-720px}.container_12 .pull_1{left:-80px}.container_12 .pull_2{left:-160px}.container_12 .pull_4{left:-320px}.container_12 .pull_5{left:-400px}.container_12 .pull_7{left:-560px}.container_12 .pull_8{left:-640px}.container_12 .pull_10{left:-800px}.container_12 .pull_11{left:-880px}.container_16 .pull_1{left:-60px}.container_16 .pull_2{left:-120px}.container_16 .pull_3{left:-180px}.container_16 .pull_5{left:-300px}.container_16 .pull_6{left:-360px}.container_16 .pull_7{left:-420px}.container_16 .pull_9{left:-540px}.container_16 .pull_10{left:-600px}.container_16 .pull_11{left:-660px}.container_16 .pull_13{left:-780px}.container_16 .pull_14{left:-840px}.container_16 .pull_15{left:-900px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1} \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/css/reset.css --- a/doc/css/reset.css Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}:focus{outline:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0} \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/css/style-ie.css --- a/doc/css/style-ie.css Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,15 +0,0 @@ -#head #menu { - - width: 750px; - -} - - #head #menu li { - - display: inline; - position: relative; - float: left; - margin: 0px; - padding: 0px; - - } \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/css/style.css --- a/doc/css/style.css Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,975 +0,0 @@ - -body { - - background-color: #eee; - color: #111; - margin: 0px; - padding: 0px; - font-family: "DroidSans", "Trebuchet MS", sans-serif; - line-height: 1.6em; - font-size: 1.3em; - -} - - #head-container { - - display: block; - position: relative; - width: 100%; - height: 90px; - - background: #111 url(../images/head.png) top left repeat-x; - - } - - #head { - - display: block; - position: relative; - width: 960px; - height: 90px; - margin: 0px auto; - - } - - #head #logo { - - display: block; - position: absolute; - left: 0px; - bottom: 10px; - width: 200px; - height: 70px; - - } - - #head #logo a { - - display: block; - position: relative; - width: 200px; - padding-left: 70px; - height: 70px; - background: url(../images/netzguerilla-3.png) 0px 0px no-repeat; - text-decoration: none; - - } - - #head #logo a span { - - display: none; - - } - - #head #menu { - - display: block; - position: absolute; - right: 0px; - bottom: 0px; - margin: 0px; - padding: 0px; - - } - - #head #menu li { - - display: inline-block; - position: relative; - margin: 0px; - padding: 0px; - - } - - #head #menu li a { - - display: block; - position: relative; - - color: #c03; - text-decoration: none; - text-transform: uppercase; - padding: 0px 7px; - background: #333 url(../images/fade-top.png) bottom left repeat-x; - margin-left: 5px; - font-size: .8em; - font-weight: bold; - - -webkit-border-top-left-radius: 4px; - -webkit-border-top-right-radius: 4px; - -moz-border-radius-topleft: 4px; - -moz-border-radius-topright: 4px; - border-top-left-radius: 4px; - border-top-right-radius: 4px; - - } - - #head #menu li a:hover { - - background: #c03 url(../images/fade-top.png) bottom left repeat-x; - color: #fff; - - } - - #head #menu li a.active { - - background-color: #eee; - background-image: none; - color: #000; - - } - - #content-container { - - display: block; - position: relative; - - } - #content { - - padding: 20px 0px; - - } - - #main {} - - #main h2 { - - display: block; - position: relative; - color: #a01; - font-size: 1.8em; - line-height: 1.4em; - margin-bottom: 15px; - text-shadow: 0px 0px 5px #fff; - - } - - #main h3 { - - display: block; - position: relative; - color: #b02; - font-size: 1.4em; - line-height: 1.4em; - margin: 10px 0px; - - } - - #main h4 { - - display: block; - position: relative; - color: #a01; - font-size: 1.3em; - line-height: 1.4em; - margin: 10px 0px; - - } - - #main h5 { - - display: block; - position: relative; - color: #900; - font-size: 1.2em; - line-height: 1.4em; - margin: 10px 0px; - - } - - #main .item { - - display: block; - position: relative; - - padding: 30px 40px; - - border-radius: 15px; - -o-border-radius: 15px; - -moz-border-radius: 15px; - -webkit-border-radius: 15px; - - -moz-box-shadow: 0px 0px 20px #eee; - -o-box-shadow: 0px 0px 20px #eee; - -webkit-box-shadow: 0px 0px 20px #eee; - box-shadow: 0px 0px 20px #eee; - - background-color: #fff; - margin-bottom: 20px; - font-size: .9em; - - } - - #main .item p { - - margin: 5px 0px; - - } - - #main .item a { - - text-decoration: none; - color: #b02; - - } - - #main .item ol { - - list-style-type: none; - list-style-position: inside; - - } - - #main .item ol li { - - margin-left: 2em; - - } - - #main .item table { - - width: 100%; - margin: 0px; - - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - - -moz-box-shadow: 0px 0px 15px #ccc; - -o-box-shadow: 0px 0px 15px #ccc; - -webkit-box-shadow: 0px 0px 15px #ccc; - box-shadow: 0px 0px 15px #ccc; - - - } - - #main .item table.docs { - - font-size: .8em; - - } - - #main .item table.docs td { - - font-weight: bold; - padding-right: 0.2em; - min-width: 120px; - - } - - #main .item table.docs td+td { - - font-weight: normal; - padding-right: 0.2em; - min-width: 80px; - - } - - #main .item table.docs td+td+td { - - font-weight: normal; - padding-right: 0em; - white-space: normal; - - } - - #main .item table td { - - background-color: #eee; - line-height: 1.7em; - - } - - #main .item table thead tr td { - - background-color: #c03; - color: #fff; - font-size: .8em; - padding: 5px; - - } - - #main .item table tbody tr td { - - color: #222; - vertical-align: top; - - } - - #main .item table tbody tr td.content { - - padding: 10px; - font-size: .8em; - - } - - #main .item table tbody tr td.content strong.title { - - display: inline-block; - position: relative; - max-width: 140px; - overflow: hidden; - - } - - #main .item table tbody tr td.content span.meta { - - display: block; - position: relative; - max-width: 140px; - overflow: hidden; - line-height: 1.4em; - font-size: .8em; - - } - - #main .item table tbody tr td.content span.hate { - - display: block; - position: relative; - line-height: 1.4em; - border: 1px solid #ccc; - padding: 10px; - text-align: justify; - - } - #main .item table tbody tr:nth-child(odd) td { - - background-color: #f9f9f9; - - } - - #main .item table tbody tr:nth-child(even) td { - - background-color: #f6f6f6; - - } - - #main .item table tr td:first-child { - - padding-left: 5px; - - } - - #main .item table tr td:last-child { - - padding-right: 5px; - - } - - #main .item table tr td.controls { - - width: 80px; - text-align: right; - - } - - #main .item table tr td.controls a { - - display: inline-block; - width: 20px; - height: 20px; - overflow: hidden; - text-indent: 30px; - background-color: #eee; - - -moz-box-shadow: 0px 0px 5px #ccc; - -o-box-shadow: 0px 0px 5px #ccc; - -webkit-box-shadow: 0px 0px 5px #ccc; - box-shadow: 0px 0px 5px #ccc; - - -webkit-border-radius: 3px; - -moz-border-radius: 3px; - border-radius: 3px; - - vertical-align: bottom; - margin: 0px 0px 4px 2px; - - background-image: url(../images/icons/bug.png); - background-position: center center; - background-repeat: no-repeat; - - } - - #main .item table tr td.controls a:hover { - - background-color: #c03; - - } - - #main .item table tr td.controls a.edit { - - background-image: url(../images/icons/pencil.png); - - } - - #main .item table tr td.controls a.delete { - - background-image: url(../images/icons/bin.png); - - } - - #main .item table tr td.controls a.details { - - background-image: url(../images/icons/zoom.png); - - } - - #main .item table tr td.controls a.accept { - - background-image: url(../images/icons/accept.png); - - } - - /* round corners */ - - #main .item table thead tr:first-child td:first-child { - - -webkit-border-top-left-radius: 5px; - -moz-border-radius-topleft: 5px; - border-top-left-radius: 5px; - - } - - #main .item table thead tr:first-child td:last-child { - - -webkit-border-top-right-radius: 5px; - -moz-border-radius-topright: 5px; - border-top-right-radius: 5px; - - } - - #main .item table tbody tr:last-child td:first-child { - - -webkit-border-bottom-left-radius: 5px; - -moz-border-radius-bottomleft: 5px; - border-bottom-left-radius: 5px; - - } - - #main .item table tbody tr:last-child td:last-child { - - -webkit-border-bottom-right-radius: 5px; - -moz-border-radius-bottomright: 5px; - border-bottom-right-radius: 5px; - - } - - #main .item code.copyme { - - display: block; - margin: 0px 0px 10px; - padding: 10px; - line-height: 1em; - border: 1px solid #ccc; - background-color: #eee; - - } - - /* main view */ - - #main .hate-pagination { - - display: block; - position: relative; - line-height: 1.2em; - padding: 10px 0px; - - } - - #main .hate-pagination-back { - - display: block; - position: relative; - width: 300px; - text-align: left; - float: left; - - } - - #main .hate-pagination-forward { - - display: block; - position: relative; - width: 300px; - text-align: right; - float: right; - - } - - #main .ad-item { - - display: block; - position: relative; - border-bottom: 1px solid #ccc; - line-height: 1.2em; - padding: 20px 0px; - text-align: center; - - } - - #main .hate-item { - - display: block; - position: relative; - border-bottom: 1px solid #ccc; - line-height: 1.2em; - padding: 10px 0px; - - } - - #main .hate-item .hate-item-icon { - - display: block; - position: relative; - width: 48px; - padding: 5px 0px 5px 10px; - float: left; - - } - - #main .hate-item .hate-item-main { - - display: block; - position: relative; - width: 550px; - float: right; - - } - - #main .hate-item .hate-item-author { - - display: block; - position: relative; - font-size: .8em; - font-weight: bold; - color: #222; - - } - - #main .hate-item .hate-item-author a { - - color: #222; - - } - - #main .hate-item .hate-item-content { - - display: block; - position: relative; - font-size: .8em; - font-weight: normal; - color: #444; - - } - - #main .hate-item .hate-item-meta { - - display: block; - position: relative; - font-size: .6em; - color: #666; - - } - - #main .hate-item .hate-item-meta a { - - color: #666; - - } - - #main .hate-item .hate-item-meta a.facepalm { - - display: inline-block; - padding-left: 20px; - line-height: 16px; - background: url(../images/icons/facepalm.png) top left no-repeat; - - } - - #main .hate-item:hover .hate-item-meta a.facepalm { - - background: url(../images/icons/facepalm-hl.png) top left no-repeat; - - } - - #main .hate-item .hate-item-meta span.godwin { - - display: inline-block; - padding-left: 20px; - line-height: 16px; - background: url(../images/icons/godwinbonus.png) top left no-repeat; - - } - - #main .hate-item:hover { - - background-color: #fce; - - } - - #main .hate-item:hover a { - - color: #c03; - - } - - #main .hate-detail { - - display: block; - position: relative; - border-bottom: 1px solid #ccc; - line-height: 1.2em; - padding: 10px 0px; - - } - - #main .hate-detail .hate-item-icon { - - display: block; - position: relative; - width: 48px; - padding: 5px 0px; - float: left; - - } - - #main .hate-detail .hate-item-main { - - display: block; - position: relative; - - } - - #main .hate-detail .hate-item-author { - - display: block; - position: relative; - font-size: 1.2em; - line-height: 50px; - font-weight: bold; - color: #222; - width: 560px; - float: right; - - } - - #main .hate-detail .hate-item-content { - - display: block; - position: relative; - font-size: 1.2em; - line-height: 1.4em; - font-weight: normal; - color: #444; - padding: 10px 0px; - - } - - #main .hate-detail .hate-item-meta { - - display: block; - position: relative; - font-size: .8em; - color: #666; - - } - - #main .hate-detail .hate-item-meta a { - - color: #666; - - } - - #main .hate-detail .hate-item-meta a.facepalm { - - display: inline-block; - padding-left: 20px; - line-height: 16px; - background: url(../images/icons/facepalm.png) top left no-repeat; - - } - - #main .hate-detail:hover .hate-item-meta a.facepalm { - - background: url(../images/icons/facepalm-hl.png) top left no-repeat; - - } - - #main .hate-detail .hate-item-meta span.godwin { - - display: inline-block; - padding-left: 20px; - line-height: 16px; - background: url(../images/icons/godwinbonus.png) top left no-repeat; - - } - - - /* special stuff */ - - #main span.redacted { - - display: inline-block; - background-color: #333; - color: #c03; - line-height: 1.1em; - padding: 0px 5px; - - } - - #main code.apikey { - - font-size: 1.1em; - background-color: #a01; - color: #fff; - display: inline-block; - padding: 0px 5px; - - } - - #main a.bookmarklet { - - font-size: 1.4em; - background-color: #ccc; - color: #666; - border: 1px solid #666; - display: inline-block; - padding: 5px 10px; - - -webkit-border-radius: 10px; - -moz-border-radius: 10px; - border-radius: 10px; - - } - - #main form input[type=text], - #main form input[type=password] { - - display: block; - position: relative; - border: 1px solid #999; - font-size: .9em; - padding: 3px; - - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - - } - - #main form input[type=submit] { - - display: block; - position: relative; - border: 1px solid #ccc; - color: #111; - font-size: .9em; - padding: 2px; - - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - - - } - - #main form span.input { - - display: inline-block; - position: relative; - border: 1px solid #999; - font-size: .9em; - padding: 0px 2px; - background-color: #fff; - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - - - } - - #main form span.input input[type=text] { - - display: inline-block; - position: relative; - border-width: 0px; - font-size: 1em; - padding: 0px; - background-color: #fff; - - } - - #main form span.input input[type=text].right { - - text-align: right; - - } - - #main form span.input input.size-2 { - - width: 1.5em !important; - - } - - #main form span.input input.size-4 { - - width: 2.5em !important; - - } - - #main form label { - - display: block; - position: relative; - font-size: .75em; - color: #666; - - } - - #main form textarea { - - display: block; - position: relative; - border: 1px solid #999; - font-size: .9em; - font-family: sans-serif; - padding: 3px; - - border-radius: 5px; - -o-border-radius: 5px; - -moz-border-radius: 5px; - -webkit-border-radius: 5px; - - } - - - #main form fieldset { - - border: 1px solid #ccc; - padding: 5px; - margin: 5px 0px; - - } - - #main form fieldset legend { - - font-size: .75em; - color: #666; - - } - - #sidebar {} - - #sidebar h3 { - - display: block; - position: relative; - color: #fff; - font-size: 1.2em; - line-height: 1.4em; - margin: 5px 0px; - - } - - #sidebar .item { - - display: block; - position: relative; - - padding: 0px 10px; - - border-radius: 10px; - -o-border-radius: 10px; - -moz-border-radius: 10px; - -webkit-border-radius: 10px; - - -moz-box-shadow: 0px 0px 20px #eee; - -o-box-shadow: 0px 0px 20px #eee; - -webkit-box-shadow: 0px 0px 20px #eee; - box-shadow: 0px 0px 20px #eee; - - background-color: #333; - margin-bottom: 20px; - font-size: .8em; - - } - - #sidebar .center { - - text-align: center; - - } - - #sidebar .counter-item .content { - - font-size: 3em; - color: #c03; - font-weight: bold; - line-height: 1em; - padding-bottom: 5px; - text-align: center; - - } - - #sidebar .submenu-item { - - background-color: #ddd; - - } - - #sidebar .submenu-item ul {} - - #sidebar .submenu-item ul li {} - - #sidebar .submenu-item ul li+li { - - border-top: 1px dotted #999; - - } - - #sidebar .submenu-item ul a { - - color: #c03; - text-decoration: none; - text-transform: uppercase; - - } - - #sidebar .submenu-item ul a:hover { - - color: #a01; - - } - - #foot-container { - - display: block; - position: relative; - background: #222; - color: #ddd; - - } - - #foot { - - display: block; - position: relative; - width: 960px; - margin: 0px auto; - padding: 20px; - font-size: .8em; - - } - - #foot a { - - text-decoration: none; - color: #c03; - - } - diff -r 4841b443f1fd -r f65edc0382cc doc/current.html --- a/doc/current.html Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,532 +0,0 @@ - - - - - - Iro · api docs current - - - - - - - - - - - - -
-
-
-

API Documentation

-
-

-

-
    -
  1. 1. Intro
  2. -
  3. 2. - Interfaces -
      -
    1. 2.1 XML-RPC
    2. -
    3. 2.2 SOAP
    4. -
    5. 2.3 JSON
    6. -
    7. 2.4 JSONP
    8. -
    -
  4. -
  5. 3. - Methods -
      -
    1. 3.1 Status
    2. 3.2 Sms
    3. 3.3 Fax
    4. 3.4 Mail
    5. 3.5 Routes
    6. 3.6 DefaultRoute
    7. 3.7 Bill
    8. 3.8 Telnumber
    9. 3.9 Email
    10. -
    -
  6. -
-
-

Intro

-

- Iro API has many methods, that are usefull if you want to send a bunch of messages. This Site describes the API for Iro 1.0. -

-
-

Interfaces

-

- You can use diffrent interfaces to get to same result. -

-
-

XML-RPC

-

- Interface-URI: http://localhost:8000/xmlrpc -

-
-
-

SOAP

-

- Interface-URI: http://localhost:8000/soap -

-
-
-

JSON

-

- Interface-URI: http://localhost:8000/json/<methode> -

-

- Not yet implementet -

-
-
-

JSONP

-

- Interface-URI: http://localhost:8000/jsonp/<methode>?callback=<callback> -

-

- Not yet implementet -

-
-
-

Methods

-
-

Status

-

status(user=None, id=False, detailed=None)

-

Returns the status of one or more jobs.

-
Parameter
- - - - - - - - - - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
idintegerone job id
detailedbooleanreturn more details about the status
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returndict
    -
  • key -- is the job id
  • -
  • [key]['status'] -- status of the job
  • -
-
-

Sms

-

sms(user, message, recipients, route='default', info='')

-

Send a sms.

-
Parameter
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
messagestringmessage
recipientslista list of telefon numbers (use ITU-T E.123)
routestring|listroute to use to send, or a list of routes as fallback
infostringa name, to combine different jobs to one billing group
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnintegerthe job id
-
-

Fax

-

fax(user, subject, fax, recipients, route='default', info='')

-

Send a fax.

-
Parameter
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
subjectstringsubject
faxstringcontent (base64 encoded)
recipientslista list of telefon numbers (use ITU-T E.123)
routestring|listroute to use to send, or a list of routes as fallback
infostringa name, to combine different jobs to one billing group
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnintegerthe job id
-
-

Mail

-

mail(user, subject, body, recipients, frm=None, route='default', info='')

-

Send a mail.

-
Parameter
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
subjectstringsubject
bodystringmail body
recipientslista list of email addresses
frmstringsender mail address
routestring|listroute to use to send, or a list of routes as fallback
infostringa name, to combine different jobs to one billing group
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnintegerthe job id
-
-

Routes

-

routes(user, typ=None)

-

Returns a list of all possible offernames.

-
Parameter
- - - - - - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
typstringa typ of message -- one of in this list ["sms","fax","mail"]
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnlista list of all possible offer names for a typ
-
-

DefaultRoute

-

defaultRoute(user, typ=None)

-

Returns all default offernames.

-
Parameter
- - - - - - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
typstringa typ of message -- one of in this list ["sms","fax","mail"]
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnlista list of all possible offer names for a typ
-
-

Bill

-

bill(user=None)

-

Returns the bill, of not paid messages.

-
Parameter
- - - - - - - - - - - - - - - -
parametertypedescription
userstringapikey of a user
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returndict
    -
  • route -- one offer name ; "total" complete sum
  • -
  • [route][info][anz] -- Number of sended messages in one billing group
  • -
  • [route][info][price] -- Price for one billing group
  • -
  • [route | total][anz] -- Number of sended messages for one offer
  • -
  • [route | total][price] -- Price for one offer
  • -
-
-

Telnumber

-

telnumber(recipients)

-

Return True, if all telnumbers a vaild.

-
Parameter
- - - - - - - - - - - - - - - -
parametertypedescription
recipientslista list of telnumbers (use ITU-T E.123)
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnbooleanTrue -- all numbers are valid
-
-

Email

-

email(recipients)

-

Return True, if all mailadresses a valid.

-
Parameter
- - - - - - - - - - - - - - - -
parametertypedescription
recipientslista list of mailadresses
-
Return
- - - - - - - - - - - - - - - -
parametertypedescription
returnbooleanTrue -- all addresses are valid
-
-
-
-
-
-
-
- -
- - \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/database.html --- a/doc/database.html Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ - - - - - - Iro · Datenbase - - - - - - - - - - - - -
-
-
-

Datenbase Schema

-
-

-

-
    -
  1. 1. Datenbase schema
  2. -
  3. 3. - Tables -
      -
    1. 2.1 Apiuser
    2. 2.2 Offer
    3. 2.3 Job
    4. 2.4 Userright
    5. 2.5 Message
    6. -
    -
  4. -
-
-

Schema

- -

Overview of used tables.

-
-

Tables

-
-

Apiuser

-

An user in iro.

-
-

Offer

-

All possible Offers over a Message can be sended. provider, typ and route are used to get the data form configuration file.

-
-

Job

-

A complete Job.

-
-
    -
  • status show the status of the job (init, started, sending, sended or error).
  • -
  • info is used to make it possible to create different billing groups for user.
  • -
-

-
-

Userright

-

Allowed offers for one user. Default routes are sorted by default value.

-
-

Message

-

A message that has created costs.

-
-isBilled is False since the bill is paid.

-
-
-
-
-
-
-
- -
- - \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/images/db-schema.svg --- a/doc/images/db-schema.svg Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,99 +0,0 @@ - - - - - - -G - - -message - -message - -- id : INTEGER -- recipient : VARCHAR(100) -- isBilled : BOOLEAN -- date : DATETIME -- price : NUMERIC(8, 4) -- count : INTEGER -- exID : VARCHAR(100) -- job : VARCHAR(40) -- offer : VARCHAR(100) - - -job - -job - -- id : INTEGER -- info : VARCHAR(100) -- status : VARCHAR(7) -- user : VARCHAR(100) - - -message->job - - -+ id -+ job - - -offer - -offer - -- name : VARCHAR(100) -- provider : VARCHAR(100) -- route : VARCHAR(100) -- typ : VARCHAR(100) - - -message->offer - - -+ name -+ offer - - -userright - -userright - -- user : VARCHAR(100) -- offer : VARCHAR(100) -- default : INTEGER - - -apiuser - -apiuser - -- name : VARCHAR(100) -- ng_kunde : INTEGER -- apikey : VARCHAR(50) - - -job->apiuser - - -+ name -+ user - - -apiuser->userright - -+ name -+ user - - -offer->userright - -+ name -+ offer - - - diff -r 4841b443f1fd -r f65edc0382cc doc/images/favicon.png Binary file doc/images/favicon.png has changed diff -r 4841b443f1fd -r f65edc0382cc doc/images/netzguerilla-3.png Binary file doc/images/netzguerilla-3.png has changed diff -r 4841b443f1fd -r f65edc0382cc doc/index.html --- a/doc/index.html Wed Apr 25 00:06:27 2012 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,66 +0,0 @@ - - - - - - Iro · work in progress - - - - - - - - - - - - -
-
-
-

Iro

-
-

What it is all about?

-

- Iro is a non blocking server for sending a message to a bunsh of recipient. It can handle diffrent types of message typs and can be extended easially. - It was initially written for sms backend of castorticker.de. Diffrent backends are supportes by Iro. -

-
-

Supported Backends

-

- A backend is a provider, that actually sends the message. -

    -
  • smtp with TLS and SSL
  • -
  • smstrade all diffrent routes are selectable
  • -
  • sipgate fax and sms
  • -
-

-
-

Installation

-

- You'll find the installtion instruction under dev/install. -

-

Documentation

-

- All documentation for extending iro see dev -

-
-
-
-
-
-
- -
- - \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc doc/install.rst --- a/doc/install.rst Wed Apr 25 00:06:27 2012 +0200 +++ b/doc/install.rst Wed Apr 25 15:06:28 2012 +0200 @@ -1,7 +1,12 @@ Installation of Iro =================== -Start with downloading the source http://BLAFOO. Install the module via ``setup.py install`` und ran ``iro-install`` afterwards, that will create a sample configuration file named ``iro.conf``. Now update the Configuration file and run ``iro-install install`` afterwards, that will create the Database and Offers for you. After that you have to ref:`adding_user`. After that you can start Iro ``twisted -ny extras/iro.tac``. +Start with downloading the `source <../index.html#files>`_. +Afterwards install the module via ``setup.py install`` und ran ``iro-install``. That will create a sample configuration file named ``iro.conf``. +Update the configuration file and run ``iro-install install`` afterwards. That will create the Database and Offers for you. +After that you have to :ref:`adding_user`. +Now you are ready to start Iro ``twisted -ny extras/iro.tac``. + .. _adding_user: diff -r 4841b443f1fd -r f65edc0382cc doc/tmpl/index.html --- a/doc/tmpl/index.html Wed Apr 25 00:06:27 2012 +0200 +++ b/doc/tmpl/index.html Wed Apr 25 15:06:28 2012 +0200 @@ -16,7 +16,7 @@ It was initially written for sms backend of castorticker.de. Diffrent backends are supportes by Iro.

-
+

Supported Backends

A backend is a provider, that actually sends the message. @@ -28,18 +28,38 @@

-
+

Installation

- You'll find the installtion instruction under dev/install. + Just download ${code} see also installtion instruction under Installing Iro.

Documentation

- All documentation for extending iro see dev + If you want just use iro see API Documentation. + For extending iro see the developer documenation. +

+
+
+

Files

+

+

- +
+

Planned features for 1.0

+

+

    +
  • JSON Interface
  • +
  • admin interface for creating modifing users
  • +
  • heartbeat
  • +
+ For any further ideas, bugs or anything - send at iro@netzgerilla.net. +

+
+ diff -r 4841b443f1fd -r f65edc0382cc fabfile.py --- a/fabfile.py Wed Apr 25 00:06:27 2012 +0200 +++ b/fabfile.py Wed Apr 25 15:06:28 2012 +0200 @@ -15,6 +15,11 @@ env.deploy_user = 'hefee' +def hal(): + env.hosts = ['sandy@hal.netzguerilla.net'] + env.directory = "iro" + + def prepare_deploy(): local("python setup.py sdist") @@ -40,3 +45,26 @@ def testserver(): prepare_tests() virtualenv("python %s/tests/xmlrpc.py"%env.directory) + +def cleandoc(): + local("rm -rf _build/* web/dev/* web/*.html") + +def sphinxdoc(): + local("sphinx-build -b html -d _build/doctrees doc web/dev/") + +def createweb(): + prepare_deploy() + cleandoc() + local("mv dist/iro-%s.tar.gz web/files/"%__version__) + local("python createdoc.py") + sphinxdoc() + local("tar -czf web.tar.gz web") + +def pushweb(): + put("web.tar.gz","/tmp/") + run("tar -czf backup/iro.tar.gz iro/*") + run("tar -xzf /tmp/web.tar.gz") + run("rm -r iro/*") + run("mv web/* %s/"%env.directory) + run("rmdir web") + run("rm /tmp/web.tar.gz") diff -r 4841b443f1fd -r f65edc0382cc web/css/960.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/css/960.css Wed Apr 25 15:06:28 2012 +0200 @@ -0,0 +1,1 @@ +.container_12,.container_16{margin-left:auto;margin-right:auto;width:960px}.grid_1,.grid_2,.grid_3,.grid_4,.grid_5,.grid_6,.grid_7,.grid_8,.grid_9,.grid_10,.grid_11,.grid_12,.grid_13,.grid_14,.grid_15,.grid_16{display:inline;float:left;margin-left:10px;margin-right:10px}.push_1,.pull_1,.push_2,.pull_2,.push_3,.pull_3,.push_4,.pull_4,.push_5,.pull_5,.push_6,.pull_6,.push_7,.pull_7,.push_8,.pull_8,.push_9,.pull_9,.push_10,.pull_10,.push_11,.pull_11,.push_12,.pull_12,.push_13,.pull_13,.push_14,.pull_14,.push_15,.pull_15{position:relative}.container_12 .grid_3,.container_16 .grid_4{width:220px}.container_12 .grid_6,.container_16 .grid_8{width:460px}.container_12 .grid_9,.container_16 .grid_12{width:700px}.container_12 .grid_12,.container_16 .grid_16{width:940px}.alpha{margin-left:0}.omega{margin-right:0}.container_12 .grid_1{width:60px}.container_12 .grid_2{width:140px}.container_12 .grid_4{width:300px}.container_12 .grid_5{width:380px}.container_12 .grid_7{width:540px}.container_12 .grid_8{width:620px}.container_12 .grid_10{width:780px}.container_12 .grid_11{width:860px}.container_16 .grid_1{width:40px}.container_16 .grid_2{width:100px}.container_16 .grid_3{width:160px}.container_16 .grid_5{width:280px}.container_16 .grid_6{width:340px}.container_16 .grid_7{width:400px}.container_16 .grid_9{width:520px}.container_16 .grid_10{width:580px}.container_16 .grid_11{width:640px}.container_16 .grid_13{width:760px}.container_16 .grid_14{width:820px}.container_16 .grid_15{width:880px}.container_12 .prefix_3,.container_16 .prefix_4{padding-left:240px}.container_12 .prefix_6,.container_16 .prefix_8{padding-left:480px}.container_12 .prefix_9,.container_16 .prefix_12{padding-left:720px}.container_12 .prefix_1{padding-left:80px}.container_12 .prefix_2{padding-left:160px}.container_12 .prefix_4{padding-left:320px}.container_12 .prefix_5{padding-left:400px}.container_12 .prefix_7{padding-left:560px}.container_12 .prefix_8{padding-left:640px}.container_12 .prefix_10{padding-left:800px}.container_12 .prefix_11{padding-left:880px}.container_16 .prefix_1{padding-left:60px}.container_16 .prefix_2{padding-left:120px}.container_16 .prefix_3{padding-left:180px}.container_16 .prefix_5{padding-left:300px}.container_16 .prefix_6{padding-left:360px}.container_16 .prefix_7{padding-left:420px}.container_16 .prefix_9{padding-left:540px}.container_16 .prefix_10{padding-left:600px}.container_16 .prefix_11{padding-left:660px}.container_16 .prefix_13{padding-left:780px}.container_16 .prefix_14{padding-left:840px}.container_16 .prefix_15{padding-left:900px}.container_12 .suffix_3,.container_16 .suffix_4{padding-right:240px}.container_12 .suffix_6,.container_16 .suffix_8{padding-right:480px}.container_12 .suffix_9,.container_16 .suffix_12{padding-right:720px}.container_12 .suffix_1{padding-right:80px}.container_12 .suffix_2{padding-right:160px}.container_12 .suffix_4{padding-right:320px}.container_12 .suffix_5{padding-right:400px}.container_12 .suffix_7{padding-right:560px}.container_12 .suffix_8{padding-right:640px}.container_12 .suffix_10{padding-right:800px}.container_12 .suffix_11{padding-right:880px}.container_16 .suffix_1{padding-right:60px}.container_16 .suffix_2{padding-right:120px}.container_16 .suffix_3{padding-right:180px}.container_16 .suffix_5{padding-right:300px}.container_16 .suffix_6{padding-right:360px}.container_16 .suffix_7{padding-right:420px}.container_16 .suffix_9{padding-right:540px}.container_16 .suffix_10{padding-right:600px}.container_16 .suffix_11{padding-right:660px}.container_16 .suffix_13{padding-right:780px}.container_16 .suffix_14{padding-right:840px}.container_16 .suffix_15{padding-right:900px}.container_12 .push_3,.container_16 .push_4{left:240px}.container_12 .push_6,.container_16 .push_8{left:480px}.container_12 .push_9,.container_16 .push_12{left:720px}.container_12 .push_1{left:80px}.container_12 .push_2{left:160px}.container_12 .push_4{left:320px}.container_12 .push_5{left:400px}.container_12 .push_7{left:560px}.container_12 .push_8{left:640px}.container_12 .push_10{left:800px}.container_12 .push_11{left:880px}.container_16 .push_1{left:60px}.container_16 .push_2{left:120px}.container_16 .push_3{left:180px}.container_16 .push_5{left:300px}.container_16 .push_6{left:360px}.container_16 .push_7{left:420px}.container_16 .push_9{left:540px}.container_16 .push_10{left:600px}.container_16 .push_11{left:660px}.container_16 .push_13{left:780px}.container_16 .push_14{left:840px}.container_16 .push_15{left:900px}.container_12 .pull_3,.container_16 .pull_4{left:-240px}.container_12 .pull_6,.container_16 .pull_8{left:-480px}.container_12 .pull_9,.container_16 .pull_12{left:-720px}.container_12 .pull_1{left:-80px}.container_12 .pull_2{left:-160px}.container_12 .pull_4{left:-320px}.container_12 .pull_5{left:-400px}.container_12 .pull_7{left:-560px}.container_12 .pull_8{left:-640px}.container_12 .pull_10{left:-800px}.container_12 .pull_11{left:-880px}.container_16 .pull_1{left:-60px}.container_16 .pull_2{left:-120px}.container_16 .pull_3{left:-180px}.container_16 .pull_5{left:-300px}.container_16 .pull_6{left:-360px}.container_16 .pull_7{left:-420px}.container_16 .pull_9{left:-540px}.container_16 .pull_10{left:-600px}.container_16 .pull_11{left:-660px}.container_16 .pull_13{left:-780px}.container_16 .pull_14{left:-840px}.container_16 .pull_15{left:-900px}.clear{clear:both;display:block;overflow:hidden;visibility:hidden;width:0;height:0}.clearfix:after{clear:both;content:' ';display:block;font-size:0;line-height:0;visibility:hidden;width:0;height:0}* html .clearfix,*:first-child+html .clearfix{zoom:1} \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc web/css/reset.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/css/reset.css Wed Apr 25 15:06:28 2012 +0200 @@ -0,0 +1,1 @@ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td{margin:0;padding:0;border:0;outline:0;font-size:100%;vertical-align:baseline;background:transparent}body{line-height:1}ol,ul{list-style:none}blockquote,q{quotes:none}blockquote:before,blockquote:after,q:before,q:after{content:'';content:none}:focus{outline:0}ins{text-decoration:none}del{text-decoration:line-through}table{border-collapse:collapse;border-spacing:0} \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc web/css/style-ie.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/css/style-ie.css Wed Apr 25 15:06:28 2012 +0200 @@ -0,0 +1,15 @@ +#head #menu { + + width: 750px; + +} + + #head #menu li { + + display: inline; + position: relative; + float: left; + margin: 0px; + padding: 0px; + + } \ No newline at end of file diff -r 4841b443f1fd -r f65edc0382cc web/css/style.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/css/style.css Wed Apr 25 15:06:28 2012 +0200 @@ -0,0 +1,975 @@ + +body { + + background-color: #eee; + color: #111; + margin: 0px; + padding: 0px; + font-family: "DroidSans", "Trebuchet MS", sans-serif; + line-height: 1.6em; + font-size: 1.3em; + +} + + #head-container { + + display: block; + position: relative; + width: 100%; + height: 90px; + + background: #111 url(../images/head.png) top left repeat-x; + + } + + #head { + + display: block; + position: relative; + width: 960px; + height: 90px; + margin: 0px auto; + + } + + #head #logo { + + display: block; + position: absolute; + left: 0px; + bottom: 10px; + width: 200px; + height: 70px; + + } + + #head #logo a { + + display: block; + position: relative; + width: 200px; + padding-left: 70px; + height: 70px; + background: url(../images/netzguerilla-3.png) 0px 0px no-repeat; + text-decoration: none; + + } + + #head #logo a span { + + display: none; + + } + + #head #menu { + + display: block; + position: absolute; + right: 0px; + bottom: 0px; + margin: 0px; + padding: 0px; + + } + + #head #menu li { + + display: inline-block; + position: relative; + margin: 0px; + padding: 0px; + + } + + #head #menu li a { + + display: block; + position: relative; + + color: #c03; + text-decoration: none; + text-transform: uppercase; + padding: 0px 7px; + background: #333 url(../images/fade-top.png) bottom left repeat-x; + margin-left: 5px; + font-size: .8em; + font-weight: bold; + + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topleft: 4px; + -moz-border-radius-topright: 4px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + + } + + #head #menu li a:hover { + + background: #c03 url(../images/fade-top.png) bottom left repeat-x; + color: #fff; + + } + + #head #menu li a.active { + + background-color: #eee; + background-image: none; + color: #000; + + } + + #content-container { + + display: block; + position: relative; + + } + #content { + + padding: 20px 0px; + + } + + #main {} + + #main h2 { + + display: block; + position: relative; + color: #a01; + font-size: 1.8em; + line-height: 1.4em; + margin-bottom: 15px; + text-shadow: 0px 0px 5px #fff; + + } + + #main h3 { + + display: block; + position: relative; + color: #b02; + font-size: 1.4em; + line-height: 1.4em; + margin: 10px 0px; + + } + + #main h4 { + + display: block; + position: relative; + color: #a01; + font-size: 1.3em; + line-height: 1.4em; + margin: 10px 0px; + + } + + #main h5 { + + display: block; + position: relative; + color: #900; + font-size: 1.2em; + line-height: 1.4em; + margin: 10px 0px; + + } + + #main .item { + + display: block; + position: relative; + + padding: 30px 40px; + + border-radius: 15px; + -o-border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + + -moz-box-shadow: 0px 0px 20px #eee; + -o-box-shadow: 0px 0px 20px #eee; + -webkit-box-shadow: 0px 0px 20px #eee; + box-shadow: 0px 0px 20px #eee; + + background-color: #fff; + margin-bottom: 20px; + font-size: .9em; + + } + + #main .item p { + + margin: 5px 0px; + + } + + #main .item a { + + text-decoration: none; + color: #b02; + + } + + #main .item ol { + + list-style-type: none; + list-style-position: inside; + + } + + #main .item ol li { + + margin-left: 2em; + + } + + #main .item table { + + width: 100%; + margin: 0px; + + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + + -moz-box-shadow: 0px 0px 15px #ccc; + -o-box-shadow: 0px 0px 15px #ccc; + -webkit-box-shadow: 0px 0px 15px #ccc; + box-shadow: 0px 0px 15px #ccc; + + + } + + #main .item table.docs { + + font-size: .8em; + + } + + #main .item table.docs td { + + font-weight: bold; + padding-right: 0.2em; + min-width: 120px; + + } + + #main .item table.docs td+td { + + font-weight: normal; + padding-right: 0.2em; + min-width: 80px; + + } + + #main .item table.docs td+td+td { + + font-weight: normal; + padding-right: 0em; + white-space: normal; + + } + + #main .item table td { + + background-color: #eee; + line-height: 1.7em; + + } + + #main .item table thead tr td { + + background-color: #c03; + color: #fff; + font-size: .8em; + padding: 5px; + + } + + #main .item table tbody tr td { + + color: #222; + vertical-align: top; + + } + + #main .item table tbody tr td.content { + + padding: 10px; + font-size: .8em; + + } + + #main .item table tbody tr td.content strong.title { + + display: inline-block; + position: relative; + max-width: 140px; + overflow: hidden; + + } + + #main .item table tbody tr td.content span.meta { + + display: block; + position: relative; + max-width: 140px; + overflow: hidden; + line-height: 1.4em; + font-size: .8em; + + } + + #main .item table tbody tr td.content span.hate { + + display: block; + position: relative; + line-height: 1.4em; + border: 1px solid #ccc; + padding: 10px; + text-align: justify; + + } + #main .item table tbody tr:nth-child(odd) td { + + background-color: #f9f9f9; + + } + + #main .item table tbody tr:nth-child(even) td { + + background-color: #f6f6f6; + + } + + #main .item table tr td:first-child { + + padding-left: 5px; + + } + + #main .item table tr td:last-child { + + padding-right: 5px; + + } + + #main .item table tr td.controls { + + width: 80px; + text-align: right; + + } + + #main .item table tr td.controls a { + + display: inline-block; + width: 20px; + height: 20px; + overflow: hidden; + text-indent: 30px; + background-color: #eee; + + -moz-box-shadow: 0px 0px 5px #ccc; + -o-box-shadow: 0px 0px 5px #ccc; + -webkit-box-shadow: 0px 0px 5px #ccc; + box-shadow: 0px 0px 5px #ccc; + + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + + vertical-align: bottom; + margin: 0px 0px 4px 2px; + + background-image: url(../images/icons/bug.png); + background-position: center center; + background-repeat: no-repeat; + + } + + #main .item table tr td.controls a:hover { + + background-color: #c03; + + } + + #main .item table tr td.controls a.edit { + + background-image: url(../images/icons/pencil.png); + + } + + #main .item table tr td.controls a.delete { + + background-image: url(../images/icons/bin.png); + + } + + #main .item table tr td.controls a.details { + + background-image: url(../images/icons/zoom.png); + + } + + #main .item table tr td.controls a.accept { + + background-image: url(../images/icons/accept.png); + + } + + /* round corners */ + + #main .item table thead tr:first-child td:first-child { + + -webkit-border-top-left-radius: 5px; + -moz-border-radius-topleft: 5px; + border-top-left-radius: 5px; + + } + + #main .item table thead tr:first-child td:last-child { + + -webkit-border-top-right-radius: 5px; + -moz-border-radius-topright: 5px; + border-top-right-radius: 5px; + + } + + #main .item table tbody tr:last-child td:first-child { + + -webkit-border-bottom-left-radius: 5px; + -moz-border-radius-bottomleft: 5px; + border-bottom-left-radius: 5px; + + } + + #main .item table tbody tr:last-child td:last-child { + + -webkit-border-bottom-right-radius: 5px; + -moz-border-radius-bottomright: 5px; + border-bottom-right-radius: 5px; + + } + + #main .item code.copyme { + + display: block; + margin: 0px 0px 10px; + padding: 10px; + line-height: 1em; + border: 1px solid #ccc; + background-color: #eee; + + } + + /* main view */ + + #main .hate-pagination { + + display: block; + position: relative; + line-height: 1.2em; + padding: 10px 0px; + + } + + #main .hate-pagination-back { + + display: block; + position: relative; + width: 300px; + text-align: left; + float: left; + + } + + #main .hate-pagination-forward { + + display: block; + position: relative; + width: 300px; + text-align: right; + float: right; + + } + + #main .ad-item { + + display: block; + position: relative; + border-bottom: 1px solid #ccc; + line-height: 1.2em; + padding: 20px 0px; + text-align: center; + + } + + #main .hate-item { + + display: block; + position: relative; + border-bottom: 1px solid #ccc; + line-height: 1.2em; + padding: 10px 0px; + + } + + #main .hate-item .hate-item-icon { + + display: block; + position: relative; + width: 48px; + padding: 5px 0px 5px 10px; + float: left; + + } + + #main .hate-item .hate-item-main { + + display: block; + position: relative; + width: 550px; + float: right; + + } + + #main .hate-item .hate-item-author { + + display: block; + position: relative; + font-size: .8em; + font-weight: bold; + color: #222; + + } + + #main .hate-item .hate-item-author a { + + color: #222; + + } + + #main .hate-item .hate-item-content { + + display: block; + position: relative; + font-size: .8em; + font-weight: normal; + color: #444; + + } + + #main .hate-item .hate-item-meta { + + display: block; + position: relative; + font-size: .6em; + color: #666; + + } + + #main .hate-item .hate-item-meta a { + + color: #666; + + } + + #main .hate-item .hate-item-meta a.facepalm { + + display: inline-block; + padding-left: 20px; + line-height: 16px; + background: url(../images/icons/facepalm.png) top left no-repeat; + + } + + #main .hate-item:hover .hate-item-meta a.facepalm { + + background: url(../images/icons/facepalm-hl.png) top left no-repeat; + + } + + #main .hate-item .hate-item-meta span.godwin { + + display: inline-block; + padding-left: 20px; + line-height: 16px; + background: url(../images/icons/godwinbonus.png) top left no-repeat; + + } + + #main .hate-item:hover { + + background-color: #fce; + + } + + #main .hate-item:hover a { + + color: #c03; + + } + + #main .hate-detail { + + display: block; + position: relative; + border-bottom: 1px solid #ccc; + line-height: 1.2em; + padding: 10px 0px; + + } + + #main .hate-detail .hate-item-icon { + + display: block; + position: relative; + width: 48px; + padding: 5px 0px; + float: left; + + } + + #main .hate-detail .hate-item-main { + + display: block; + position: relative; + + } + + #main .hate-detail .hate-item-author { + + display: block; + position: relative; + font-size: 1.2em; + line-height: 50px; + font-weight: bold; + color: #222; + width: 560px; + float: right; + + } + + #main .hate-detail .hate-item-content { + + display: block; + position: relative; + font-size: 1.2em; + line-height: 1.4em; + font-weight: normal; + color: #444; + padding: 10px 0px; + + } + + #main .hate-detail .hate-item-meta { + + display: block; + position: relative; + font-size: .8em; + color: #666; + + } + + #main .hate-detail .hate-item-meta a { + + color: #666; + + } + + #main .hate-detail .hate-item-meta a.facepalm { + + display: inline-block; + padding-left: 20px; + line-height: 16px; + background: url(../images/icons/facepalm.png) top left no-repeat; + + } + + #main .hate-detail:hover .hate-item-meta a.facepalm { + + background: url(../images/icons/facepalm-hl.png) top left no-repeat; + + } + + #main .hate-detail .hate-item-meta span.godwin { + + display: inline-block; + padding-left: 20px; + line-height: 16px; + background: url(../images/icons/godwinbonus.png) top left no-repeat; + + } + + + /* special stuff */ + + #main span.redacted { + + display: inline-block; + background-color: #333; + color: #c03; + line-height: 1.1em; + padding: 0px 5px; + + } + + #main code.apikey { + + font-size: 1.1em; + background-color: #a01; + color: #fff; + display: inline-block; + padding: 0px 5px; + + } + + #main a.bookmarklet { + + font-size: 1.4em; + background-color: #ccc; + color: #666; + border: 1px solid #666; + display: inline-block; + padding: 5px 10px; + + -webkit-border-radius: 10px; + -moz-border-radius: 10px; + border-radius: 10px; + + } + + #main form input[type=text], + #main form input[type=password] { + + display: block; + position: relative; + border: 1px solid #999; + font-size: .9em; + padding: 3px; + + border-radius: 5px; + -o-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + + } + + #main form input[type=submit] { + + display: block; + position: relative; + border: 1px solid #ccc; + color: #111; + font-size: .9em; + padding: 2px; + + border-radius: 5px; + -o-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + + + } + + #main form span.input { + + display: inline-block; + position: relative; + border: 1px solid #999; + font-size: .9em; + padding: 0px 2px; + background-color: #fff; + border-radius: 5px; + -o-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + + + } + + #main form span.input input[type=text] { + + display: inline-block; + position: relative; + border-width: 0px; + font-size: 1em; + padding: 0px; + background-color: #fff; + + } + + #main form span.input input[type=text].right { + + text-align: right; + + } + + #main form span.input input.size-2 { + + width: 1.5em !important; + + } + + #main form span.input input.size-4 { + + width: 2.5em !important; + + } + + #main form label { + + display: block; + position: relative; + font-size: .75em; + color: #666; + + } + + #main form textarea { + + display: block; + position: relative; + border: 1px solid #999; + font-size: .9em; + font-family: sans-serif; + padding: 3px; + + border-radius: 5px; + -o-border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + + } + + + #main form fieldset { + + border: 1px solid #ccc; + padding: 5px; + margin: 5px 0px; + + } + + #main form fieldset legend { + + font-size: .75em; + color: #666; + + } + + #sidebar {} + + #sidebar h3 { + + display: block; + position: relative; + color: #fff; + font-size: 1.2em; + line-height: 1.4em; + margin: 5px 0px; + + } + + #sidebar .item { + + display: block; + position: relative; + + padding: 0px 10px; + + border-radius: 10px; + -o-border-radius: 10px; + -moz-border-radius: 10px; + -webkit-border-radius: 10px; + + -moz-box-shadow: 0px 0px 20px #eee; + -o-box-shadow: 0px 0px 20px #eee; + -webkit-box-shadow: 0px 0px 20px #eee; + box-shadow: 0px 0px 20px #eee; + + background-color: #333; + margin-bottom: 20px; + font-size: .8em; + + } + + #sidebar .center { + + text-align: center; + + } + + #sidebar .counter-item .content { + + font-size: 3em; + color: #c03; + font-weight: bold; + line-height: 1em; + padding-bottom: 5px; + text-align: center; + + } + + #sidebar .submenu-item { + + background-color: #ddd; + + } + + #sidebar .submenu-item ul {} + + #sidebar .submenu-item ul li {} + + #sidebar .submenu-item ul li+li { + + border-top: 1px dotted #999; + + } + + #sidebar .submenu-item ul a { + + color: #c03; + text-decoration: none; + text-transform: uppercase; + + } + + #sidebar .submenu-item ul a:hover { + + color: #a01; + + } + + #foot-container { + + display: block; + position: relative; + background: #222; + color: #ddd; + + } + + #foot { + + display: block; + position: relative; + width: 960px; + margin: 0px auto; + padding: 20px; + font-size: .8em; + + } + + #foot a { + + text-decoration: none; + color: #c03; + + } + diff -r 4841b443f1fd -r f65edc0382cc web/images/db-schema.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/images/db-schema.svg Wed Apr 25 15:06:28 2012 +0200 @@ -0,0 +1,99 @@ + + + + + + +G + + +message + +message + +- id : INTEGER +- recipient : VARCHAR(100) +- isBilled : BOOLEAN +- date : DATETIME +- price : NUMERIC(8, 4) +- count : INTEGER +- exID : VARCHAR(100) +- job : VARCHAR(40) +- offer : VARCHAR(100) + + +job + +job + +- id : INTEGER +- info : VARCHAR(100) +- status : VARCHAR(7) +- user : VARCHAR(100) + + +message->job + + ++ id ++ job + + +offer + +offer + +- name : VARCHAR(100) +- provider : VARCHAR(100) +- route : VARCHAR(100) +- typ : VARCHAR(100) + + +message->offer + + ++ name ++ offer + + +userright + +userright + +- user : VARCHAR(100) +- offer : VARCHAR(100) +- default : INTEGER + + +apiuser + +apiuser + +- name : VARCHAR(100) +- ng_kunde : INTEGER +- apikey : VARCHAR(50) + + +job->apiuser + + ++ name ++ user + + +apiuser->userright + ++ name ++ user + + +offer->userright + ++ name ++ offer + + + diff -r 4841b443f1fd -r f65edc0382cc web/images/favicon.png Binary file web/images/favicon.png has changed diff -r 4841b443f1fd -r f65edc0382cc web/images/netzguerilla-3.png Binary file web/images/netzguerilla-3.png has changed