diff --git a/.gitignore b/.gitignore index 86d4059..f7d6736 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,4 @@ sessions .project .settings __pycache__/ +/uploads/ diff --git a/controllers/default.py b/controllers/default.py index 389e806..d7ee4aa 100644 --- a/controllers/default.py +++ b/controllers/default.py @@ -6,7 +6,12 @@ # ---- example index page ---- def index(): - return dict(u1="Überschrift 1", u2="Überschrift 2") + images = db().select(db.image.ALL, orderby=db.image.title) + return dict(images=images) + +def manage(): + grid = SQLFORM.smartgrid(db.image, linked_tables=['post']) + return dict(grid=grid) # ---- API (example) ----- @auth.requires_login() diff --git a/languages/de.py b/languages/de.py index 095cfcc..46d453c 100644 --- a/languages/de.py +++ b/languages/de.py @@ -1,76 +1,103 @@ # -*- coding: utf-8 -*- { +'!=': '!=', '!langcode!': 'de', '!langname!': 'Deutsch (DE)', '"update" is an optional expression like "field1=\'newvalue\'". You cannot update or delete the results of a JOIN': '"Update" ist ein optionaler Ausdruck wie "feld1=\'newvalue\'". JOIN Ergebnisse können nicht aktualisiert oder gelöscht werden', -'%Y-%m-%d': '%Y-%m-%d', -'%Y-%m-%d %H:%M:%S': '%Y-%m-%d\xa0%H:%M:%S', +'%(nrows)s records found': '%(nrows)s records found', '%s %%{row} deleted': '%s %%{row} gelöscht', '%s %%{row} updated': '%s %%{row} aktualisiert', '%s selected': '%s ausgewählt', +'%Y-%m-%d': '%Y-%m-%d', +'%Y-%m-%d %H:%M:%S': '%Y-%m-%d\xa0%H:%M:%S', '(**%.0d MB**)': '(**%.0d\xa0MB**)', '**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{Item(Items)}, **%(bytes)s** %%{Byte(Bytes)}', '**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** Items, **%(bytes)s** %%{Byte(Bytes)}', '**not available** (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '**nicht verfügbar** (benötigt die Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] Bibliothek)', +'+ And': '+ And', +'+ Or': '+ Or', +'<': '<', +'<=': '<=', +'=': '=', +'>': '>', +'>=': '>=', '?': '?', '@markmin\x01(**%.0d MB**)': '(**%.0d\xa0MB**)', '@markmin\x01**%(items)s** %%{item(items)}, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** %%{Item(items)}, **%(bytes)s** %%{Byte(bytes)}', '@markmin\x01**%(items)s** items, **%(bytes)s** %%{byte(bytes)}': '**%(items)s** items, **%(bytes)s** %%{Byte(bytes)}', '@markmin\x01**not available** (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)': '**nicht verfügbar** (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)', +'@markmin\x01``**not available**``:red (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)': '``**nicht verfügbar**``:red (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)', '@markmin\x01An error occured, please [[reload %s]] the page': 'Hi ha hagut un error, si us plau [[recarregui %s]] la pàgina', '@markmin\x01Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache geleert enthält Artikel bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', '@markmin\x01DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK enthält Artikel bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', '@markmin\x01Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Trefferquote:**%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})', '@markmin\x01Number of entries: **%s**': "Nombre d'entrades: **%s**", '@markmin\x01RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM enthält Elemente bis zu\xa0**%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.', -'@markmin\x01``**not available**``:red (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)': '``**nicht verfügbar**``:red (requires the Python [[Pympler https://pypi.python.org/pypi/Pympler popup]] library)', +'``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**nicht verfügbar**``:rot (benötigt die Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] Bibliothek)', 'A new password was emailed to you': 'Ein neues Passwort wurde per E-Mail an Sie gesendet', -'API Example': 'API Beispiel', 'About': 'Über', 'Access Control': 'Zugangskontrolle', +'Add this to the search as an AND term': 'Add this to the search as an AND term', +'Add this to the search as an OR term': 'Add this to the search as an OR term', +'admin': 'admin', 'Ajax Recipes': 'Ajax Rezepte', 'An error occured, please [[reload %s]] the page': 'Ein Fehler ist aufgetreten, bitte [[laden %s]] Sie die Seite neu', +'API Example': 'API Beispiel', +'appadmin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals', 'Apply changes': 'Aplicar canvis', 'Are you sure you want to delete this object?': 'Sind Sie sich sicher, dass Sie dieses Objekt löschen wollen?', 'Authentication code': 'Authentifizierungs code', 'Available Databases and Tables': 'Verfügbare Datenbanken und Tabellen', +'Back': 'Back', "Buy web2py's book": "web2py's Buch kaufen", 'Cache': 'Zwischenspeicher', +'cache': 'zwischenspeicher', 'Cache Cleared': 'Cache geleert', -'Cache Keys': 'Cache Schlüssel', 'Cache contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'Cache enthält items die bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} alt sind.', +'Cache Keys': 'Cache Schlüssel', 'Cannot be empty': 'Darf nicht leer sein', 'Change Password': 'Canviï la Contrasenya', 'Change password': 'Canviï la contrasenya', 'Check to delete': 'Auswählen um zu löschen', +'Clear': 'Clear', 'Clear CACHE?': 'CACHE löschen?', 'Clear DISK': 'DISK löschen', 'Clear RAM': 'RAM löschen', -'Click on the link %(link)s to reset your password': "Klicke auf den Link %(link)s um das Passwort zurückzusetzen", +'Click on the link %(link)s to reset your password': 'Klicke auf den Link %(link)s um das Passwort zurückzusetzen', 'Client IP': 'Client IP', +'Close': 'Close', +'Comma-separated export including columns not shown; fields from other tables are exported as raw values for faster export': 'Comma-separated export including columns not shown; fields from other tables are exported as raw values for faster export', +'Comma-separated export of visible columns. Fields from other tables are exported as they appear on-screen but this may be slow for many rows': 'Comma-separated export of visible columns. Fields from other tables are exported as they appear on-screen but this may be slow for many rows', 'Community': 'Community', 'Components and Plugins': 'Komponenten und Plugins', 'Config.ini': 'Config.ini', +'contains': 'contains', 'Controller': 'Controller', 'Copyright': 'Urheberrechte', +'CSV': 'CSV', +'CSV (hidden cols)': 'CSV (hidden cols)', 'Current request': 'Derzeitiger Request', 'Current response': 'Derzeitige Response', 'Current session': 'Derzeitige Session', -'DB Model': 'Muster-DB', -'DISK': 'DISK', -'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK enthält items die bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} alt sind.', +'data uploaded': 'Datei hochgeladen', 'Database': 'Datenbank', 'Database %s select': 'Datenbank %s ausgewählt', 'Database Administration (appadmin)': 'Datenbankadministration (appadmin)', +'db': 'db', +'DB Model': 'Muster-DB', 'Delete:': 'Lösche:', 'Demo': 'Demo', 'Deployment Recipes': 'Entwicklungsrezepte', 'Description': 'Beschreibung', 'Design': 'Design', +'design': 'Design', +'DISK': 'DISK', 'Disk Cache Keys': 'Festplatten-Cache-Schlüssel', 'Disk Cleared': 'Disk gelöscht', +'DISK contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'DISK enthält items die bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} alt sind.', 'Documentation': 'Dokumentation', "Don't know what to do?": 'Wissen Sie nicht weiter?', +'done!': 'Fertig!', 'Download': 'Download', 'E-mail': 'Correu electrònic', 'Edit current record': 'Diesen Eintrag editieren', @@ -79,7 +106,11 @@ 'Email verification': 'Email-Verifizierung', 'Email verified': 'Email-Verifiziert', 'Errors': 'Fehlermeldungen', +'export as csv file': 'als csv Datei exportieren', +'Export:': 'Export:', 'FAQ': 'FAQ', +'file': 'file', +'file ## download': 'file ', 'First name': 'Nom', 'Forms and Validators': 'Forms und Validators', 'Free Applications': 'Kostenlose Anwendungen', @@ -96,20 +127,29 @@ 'Hit Ratio: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} and **%(misses)s** %%{miss(misses)})': 'Trefferquote: **%(ratio)s%%** (**%(hits)s** %%{hit(hits)} und **%(misses)s** %%{miss(misses)})', 'Home': 'Startseite', 'How did you get here?': 'Wie sind Sie hier her gelangt?', +'HTML': 'HTML', +'HTML export of visible columns': 'HTML export of visible columns', +'Id': 'Id', +'Images': 'Images', +'import': 'Importieren', 'Import/Export': 'Importieren/Exportieren', +'in': 'in', 'Incorrect code. {0} more attempt(s) remaining.': 'Falscher Code. {0} weitere Versuche verbleiben.', 'Insufficient privileges': 'Privilegis insuficients', 'Internal State': 'Innerer Zustand', 'Introduction': 'Einführung', -'Invalid Query': 'Ungültige Query', 'Invalid email': 'Ungültige Email', 'Invalid key': 'Ungültiger Schlüssel', 'Invalid login': 'Ungültige Anmeldung', 'Invalid password': 'Ungültiges Passwort', +'Invalid Query': 'Ungültige Query', +'invalid request': 'Ungültiger Request', 'Invalid reset password': 'Ungültiges Passwort zurücksetzen', 'Invalid user': 'Ungültiger Benutzer', 'Invalid username': 'Ungültiger Benutzername', 'Invitation to join %(site)s': 'Einladung um %(site)s zujoinen', +'JSON': 'JSON', +'JSON export of visible columns': 'JSON export of visible columns', 'Key': 'Schlüssel', 'Key verified': 'Schlüssel verifiziert', 'Last name': 'Cognom', @@ -130,14 +170,20 @@ 'Menu Model': 'Menü-Muster', 'My Sites': 'Meine Seiten', 'Name': 'Nombre', -'New Record': 'Neuer Eintrag', 'New password': 'Contrasenya nova', +'New Record': 'Neuer Eintrag', +'new record inserted': 'neuer Eintrag hinzugefügt', +'New Search': 'New Search', +'next %s rows': 'nächste %s Reihen', 'No databases in this application': 'Keine Datenbank in dieser Anwendung', +'not authorized': 'not authorized', +'not in': 'not in', 'Number of entries: **%s**': 'Nummer der Einträge: **%s**', 'Object or table name': 'Objekt oder Tabellenname', 'Old password': 'Altes Passwort', 'Online book': 'Online Buch', 'Online examples': 'Online Beispiele', +'or import from csv file': 'oder von csv Datei importieren', 'Origin': 'Urprung', 'Other Recipes': 'Andere Rezepte', 'Overview': 'Überblick', @@ -148,18 +194,22 @@ 'Password retrieve': 'Passwort abrufen', 'Permission': 'Erlaubnis', 'Permissions': 'Erlaubnisse', +'please input your password again': 'si us plau, entri un altre cop la seva contrasenya', 'Plugins': 'Plugins', +'Posts': 'Posts', 'Powered by': 'Unterstützt von', 'Preface': 'Allgemeines', +'previous %s rows': 'vorherige %s Reihen', 'Profile': 'Perfil', 'Profile updated': 'Profil aktualisiert', +'pygraphviz library not found': 'pygraphviz Bibliothek wurde nicht gefunden', 'Python': 'Python', 'Query:': 'Abfrage:', 'Quick Examples': 'Kurze Beispiele', 'RAM': 'RAM', 'RAM Cache Keys': 'RAM Cache-Schlüssel', -'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM enthält items die bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} alt sind.', 'Ram Cleared': 'Ram gelöscht', +'RAM contains items up to **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} old.': 'RAM enthält items die bis zu **%(hours)02d** %%{hour(hours)} **%(min)02d** %%{minute(min)} **%(sec)02d** %%{second(sec)} alt sind.', 'Recipes': 'Rezepte', 'Record': 'Eintrag', 'Record %(id)s created': 'Registre %(id)s creat', @@ -168,16 +218,17 @@ 'Record %(id)s updated': 'Eintrag %(id)s aktualisiert', 'Record Created': 'Eintrag erstellt', 'Record Deleted': 'Eintrag gelöscht', +'record does not exist': 'Eintrag existiert nicht', 'Record ID': 'ID des Eintrags', -'Record Updated': 'Eintrag Aktualisiert', 'Record id': 'id des Eintrags', -'Register': "Registrieren", +'Record Updated': 'Eintrag Aktualisiert', +'Register': 'Registrieren', 'Registration identifier': 'Kennung für die Registrierung', 'Registration is pending approval': 'Die Registrierung steht noch aus', 'Registration key': 'Registrierungsschlüssel', 'Registration needs verification': 'Registrierung muss überprüft werden', 'Registration successful': 'Registrierung erfolgreich', -'Remember me (for 30 days)': "Erinnere mich (durant 30 dies)", +'Remember me (for 30 days)': 'Erinnere mich (durant 30 dies)', 'Request reset password': 'Passort zurücksetzen', 'Reset Password key': 'Reset Password key', 'Role': 'Rolle', @@ -185,31 +236,43 @@ 'Rows in Table': 'Tabellenreihen', 'Rows selected': 'Reihen ausgewählt', 'Save model as...': 'Speichere Vorlage als...', +'Search': 'Search', 'Services': 'Dienste', 'Sign Up': 'Registrieren', 'Sign up': 'Anmelden', 'Size of cache:': 'Cachegröße:', +'Spreadsheet-optimised export of tab-separated content including hidden columns. May be slow': 'Spreadsheet-optimised export of tab-separated content including hidden columns. May be slow', +'Spreadsheet-optimised export of tab-separated content, visible columns only. May be slow.': 'Spreadsheet-optimised export of tab-separated content, visible columns only. May be slow.', +'Start building a new search': 'Start building a new search', +'starts with': 'starts with', +'state': 'Status', 'Statistics': 'Statistik', 'Stylesheet': 'Stylesheet', 'Submit': 'Absenden', +'submit': 'Submit', 'Support': 'Support', 'Table': 'Tabelle', 'The "query" is a condition like "db.table1.field1==\'value\'". Something like "db.table1.field1==db.table2.field2" results in a SQL JOIN.': 'Die "query" ist eine Bedingung wie "db.tabelle1.feld1==\'wert\'". So etwas wie "db.tabelle1.feld1==db.tabelle2.feld2" resultiert in einem SQL JOIN.', 'The Core': 'Der Core', -'The Views': 'Die Views', 'The output of the file is a dictionary that was rendered by the view %s': 'Die Ausgabe der Datei ist ein "dictionary", welches vom "view" %s gerendert wurde', +'The Views': 'Die Views', 'This App': 'Diese App', 'This code was emailed to you and is required for login.': 'Dieser Code wurde per E-Mail an Sie gesendet und ist für die Anmeldung erforderlich.', 'This email already has an account': 'Zu dieser Email gehört bereits ein Account', 'Time in Cache (h:m:s)': 'Zeit im Cache (h:m:s)', 'Timestamp': 'Zeitstempel', +'Title': 'Title', 'Traceback': 'Zurückverfolgen', +'TSV (Spreadsheets)': 'TSV (Spreadsheets)', +'TSV (Spreadsheets, hidden cols)': 'TSV (Spreadsheets, hidden cols)', 'Twitter': 'Twitter', 'Two-step Login Authentication Code': 'Zweistufiger Login-Authentifizierungscode', +'unable to parse csv file': 'csv Datei konnte nicht geparst werden', 'Unable to send email': 'Email kann nicht gesendet werden', 'Update:': 'Update:', 'Use (...)&(...) for AND, (...)|(...) for OR, and ~(...) for NOT to build more complex queries.': 'Benutze (...)&(...) für AND, (...)|(...) für OR, und ~(...) für NOT um komplexere Queries zu erstellen.', 'User': 'Benutzer', +'User %(id)s is impersonating %(other_id)s': 'El usuari %(id)s està suplantant %(other_id)s', 'User %(id)s Logged-in': 'Benutzer %(id)s eingeloggt', 'User %(id)s Logged-out': 'Benutzer %(id)s ausgeloggt', 'User %(id)s Password changed': 'Benutzer %(id)s Passwort geändert', @@ -219,21 +282,24 @@ 'User %(id)s Registered': 'Usuari %(id)s Registrat', 'User %(id)s Username retrieved': 'Se ha recuperat el nom de usuari del usuari %(id)s', 'User %(id)s Verification email sent': 'Benutzer %(id)s Bestätigungs-Email gesendet', -'User %(id)s is impersonating %(other_id)s': 'El usuari %(id)s està suplantant %(other_id)s', 'User %(id)s verified registration key': 'Benutzer %(id)s verifizierter Registrierungsschlüssel', 'User ID': 'ID de Usuari', 'Username': 'Nom de usuari', 'Username already taken': 'Benutzername schon vergeben', 'Username retrieve': 'Recuperar nom de usuari', 'Users': 'Benutzer', +'Value already in database or empty': 'Value already in database or empty', 'Verify Password': 'Verificar Contrasenya', 'Videos': 'Videos', 'View': 'Ansicht', +'View %(entity)s': 'View %(entity)s', 'Welcome %(username)s! Click on the link %(link)s to verify your email': 'Willkommen %(username)s! Klicken Sie auf den Link %(link)s, um Ihre Email zu bestätigen', 'Welcome to web2py!': 'Willkommen bei web2py!', 'Which called the function %s located in the file %s': 'Welche die Funktion %s in der Datei %s aufrief', 'Wiki Example': 'Wiki Beispiel', 'Working...': 'Arbeite...', +'XML': 'XML', +'XML export of columns shown': 'XML export of columns shown', 'You are successfully running web2py': 'web2py wird erfolgreich ausgeführt', 'You can modify this application and adapt it to your needs': 'Sie können diese Anwendung verändern und Ihren Bedürfnissen anpassen', 'You have been invited to join %(site)s, click %(link)s to complete the process': 'Sie wurden eingeladen,%(site)s beizutreten. Klicken Sie auf %(link)s, um den Vorgang abzuschließen', @@ -242,25 +308,4 @@ 'Your temporary login code is {0}': 'Ihr temporärer Login-Code lautet {0}', 'Your username is: %(username)s': 'El seu nom de usuari és: %(username)s', 'Your username was emailed to you': 'Ihr Benutzername wurde per E-Mail an Sie gesendet', -'``**not available**``:red (requires the Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] library)': '``**nicht verfügbar**``:rot (benötigt die Python [[guppy http://pypi.python.org/pypi/guppy/ popup]] Bibliothek)', -'admin': 'admin', -'appadmin is disabled because insecure channel': 'Appadmin ist deaktiviert, wegen der Benutzung eines unsicheren Kanals', -'cache': 'zwischenspeicher', -'data uploaded': 'Datei hochgeladen', -'db': 'db', -'design': 'Design', -'done!': 'Fertig!', -'export as csv file': 'als csv Datei exportieren', -'import': 'Importieren', -'invalid request': 'Ungültiger Request', -'new record inserted': 'neuer Eintrag hinzugefügt', -'next %s rows': 'nächste %s Reihen', -'or import from csv file': 'oder von csv Datei importieren', -'please input your password again': 'si us plau, entri un altre cop la seva contrasenya', -'previous %s rows': 'vorherige %s Reihen', -'pygraphviz library not found': 'pygraphviz Bibliothek wurde nicht gefunden', -'record does not exist': 'Eintrag existiert nicht', -'state': 'Status', -'submit': 'Submit', -'unable to parse csv file': 'csv Datei konnte nicht geparst werden', } diff --git a/views/default/index.html b/views/default/index.html index 2d75a0c..838b8b0 100644 --- a/views/default/index.html +++ b/views/default/index.html @@ -2,7 +2,11 @@
-

{{=u1}}

-

{{=u2}}

+

Current Images

+
diff --git a/views/default/manage.html b/views/default/manage.html new file mode 100644 index 0000000..ff5f5df --- /dev/null +++ b/views/default/manage.html @@ -0,0 +1,3 @@ +{{extend 'layout.html'}} +

Management Interface

+{{=grid}} \ No newline at end of file