From 3dbaa20d66d533211dc34746150cbb31f5afd5d3 Mon Sep 17 00:00:00 2001 From: Radek Czajka Date: Tue, 15 Nov 2011 12:23:04 +0100 Subject: [PATCH] initial commit --- .gitignore | 23 +++ apps/poetry/__init__.py | 0 apps/poetry/migrations/0001_initial.py | 78 ++++++++++ apps/poetry/migrations/__init__.py | 0 apps/poetry/models.py | 73 +++++++++ apps/poetry/static/poetry/poem.css | 137 ++++++++++++++++ apps/poetry/templates/poetry/main.html | 62 ++++++++ apps/poetry/templates/poetry/poem.html | 86 ++++++++++ apps/poetry/templates/poetry/poet.html | 44 ++++++ apps/poetry/urls.py | 11 ++ apps/poetry/utils.py | 10 ++ apps/poetry/views.py | 29 ++++ fabfile.py | 200 ++++++++++++++++++++++++ lib/git-archive-all.sh | 208 +++++++++++++++++++++++++ requirements-dev.txt | 1 + requirements.txt | 5 + turniej.vhost.template | 31 ++++ turniej.wsgi.template | 26 ++++ turniej/__init__.py | 0 turniej/localsettings.py.template | 27 ++++ turniej/manage.py | 26 ++++ turniej/settings.py | 158 +++++++++++++++++++ turniej/static/img/cc.png | Bin 0 -> 5982 bytes turniej/static/img/di.png | Bin 0 -> 5354 bytes turniej/static/img/favicon.ico | Bin 0 -> 1086 bytes turniej/static/img/fnp.png | Bin 0 -> 7662 bytes turniej/static/img/koed.png | Bin 0 -> 7158 bytes turniej/static/img/lempl.png | Bin 0 -> 2331 bytes turniej/static/img/turniej-maly.png | Bin 0 -> 4933 bytes turniej/static/img/turniej.png | Bin 0 -> 33174 bytes turniej/static/img/wl.png | Bin 0 -> 7491 bytes turniej/static/style.css | 148 ++++++++++++++++++ turniej/templates/404.html | 8 + turniej/templates/500.html | 8 + turniej/templates/base.html | 36 +++++ turniej/templates/home.html | 97 ++++++++++++ turniej/templates/pages/more.html | 65 ++++++++ turniej/templates/pages/rules.html | 74 +++++++++ turniej/templates/pages/technical.html | 115 ++++++++++++++ turniej/urls.py | 21 +++ turniej/views.py | 6 + 41 files changed, 1813 insertions(+) create mode 100644 .gitignore create mode 100644 apps/poetry/__init__.py create mode 100644 apps/poetry/migrations/0001_initial.py create mode 100644 apps/poetry/migrations/__init__.py create mode 100644 apps/poetry/models.py create mode 100644 apps/poetry/static/poetry/poem.css create mode 100644 apps/poetry/templates/poetry/main.html create mode 100644 apps/poetry/templates/poetry/poem.html create mode 100644 apps/poetry/templates/poetry/poet.html create mode 100644 apps/poetry/urls.py create mode 100644 apps/poetry/utils.py create mode 100644 apps/poetry/views.py create mode 100644 fabfile.py create mode 100644 lib/git-archive-all.sh create mode 100644 requirements-dev.txt create mode 100644 requirements.txt create mode 100644 turniej.vhost.template create mode 100644 turniej.wsgi.template create mode 100644 turniej/__init__.py create mode 100644 turniej/localsettings.py.template create mode 100755 turniej/manage.py create mode 100644 turniej/settings.py create mode 100644 turniej/static/img/cc.png create mode 100644 turniej/static/img/di.png create mode 100644 turniej/static/img/favicon.ico create mode 100644 turniej/static/img/fnp.png create mode 100644 turniej/static/img/koed.png create mode 100644 turniej/static/img/lempl.png create mode 100644 turniej/static/img/turniej-maly.png create mode 100644 turniej/static/img/turniej.png create mode 100644 turniej/static/img/wl.png create mode 100644 turniej/static/style.css create mode 100644 turniej/templates/404.html create mode 100644 turniej/templates/500.html create mode 100644 turniej/templates/base.html create mode 100644 turniej/templates/home.html create mode 100644 turniej/templates/pages/more.html create mode 100644 turniej/templates/pages/rules.html create mode 100644 turniej/templates/pages/technical.html create mode 100644 turniej/urls.py create mode 100644 turniej/views.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d1146e9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +localsettings.py +*.db +*.db-journal +*~ + +# Python garbage +*.pyc +.coverage +pip-log.txt +nosetests.xml + +# Mac OS X garbage +.DS_Store + +# Windows garbage +thumbs.db + +# Eclipse +.project +.settings +.pydevproject +.tmp_* + diff --git a/apps/poetry/__init__.py b/apps/poetry/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/poetry/migrations/0001_initial.py b/apps/poetry/migrations/0001_initial.py new file mode 100644 index 0000000..c6bfda3 --- /dev/null +++ b/apps/poetry/migrations/0001_initial.py @@ -0,0 +1,78 @@ +# encoding: utf-8 +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + +class Migration(SchemaMigration): + + def forwards(self, orm): + + # Adding model 'Poet' + db.create_table('poetry_poet', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('name', self.gf('django.db.models.fields.CharField')(max_length=50)), + ('path', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('slug', self.gf('django.db.models.fields.SlugField')(unique=True, max_length=50, db_index=True)), + ('author', self.gf('django.db.models.fields.CharField')(max_length=128, blank=True)), + ('url', self.gf('django.db.models.fields.CharField')(max_length=255, blank=True)), + ('description', self.gf('django.db.models.fields.TextField')(blank=True)), + ('first_line_title', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('skip_first_lines', self.gf('django.db.models.fields.IntegerField')(default=0)), + )) + db.send_create_signal('poetry', ['Poet']) + + # Adding model 'Poem' + db.create_table('poetry_poem', ( + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)), + ('title', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True)), + ('text', self.gf('django.db.models.fields.TextField')()), + ('poet', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['poetry.Poet'])), + ('created_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, db_index=True, blank=True)), + ('seen_at', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('view_count', self.gf('django.db.models.fields.IntegerField')(default=1)), + ('for_contest', self.gf('django.db.models.fields.BooleanField')(default=False)), + ('in_contest', self.gf('django.db.models.fields.BooleanField')(default=False)), + )) + db.send_create_signal('poetry', ['Poem']) + + + def backwards(self, orm): + + # Deleting model 'Poet' + db.delete_table('poetry_poet') + + # Deleting model 'Poem' + db.delete_table('poetry_poem') + + + models = { + 'poetry.poem': { + 'Meta': {'object_name': 'Poem'}, + 'created_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'for_contest': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'in_contest': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'poet': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['poetry.Poet']"}), + 'seen_at': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}), + 'text': ('django.db.models.fields.TextField', [], {}), + 'title': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'view_count': ('django.db.models.fields.IntegerField', [], {'default': '1'}) + }, + 'poetry.poet': { + 'Meta': {'object_name': 'Poet'}, + 'author': ('django.db.models.fields.CharField', [], {'max_length': '128', 'blank': 'True'}), + 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'first_line_title': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}), + 'path': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'skip_first_lines': ('django.db.models.fields.IntegerField', [], {'default': '0'}), + 'slug': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50', 'db_index': 'True'}), + 'url': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}) + } + } + + complete_apps = ['poetry'] diff --git a/apps/poetry/migrations/__init__.py b/apps/poetry/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/poetry/models.py b/apps/poetry/models.py new file mode 100644 index 0000000..39f3e05 --- /dev/null +++ b/apps/poetry/models.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +import os +import subprocess +from django.db import models +from django.core.urlresolvers import reverse +from poetry.utils import get_hash + + +class Poet(models.Model): + name = models.CharField(max_length=50) + path = models.CharField(max_length=255) + slug = models.SlugField(max_length=50, unique=True, db_index=True) + author = models.CharField(max_length=128, blank=True) + url = models.CharField(max_length=255, blank=True) + description = models.TextField(blank=True) + first_line_title = models.BooleanField(default=False) + skip_first_lines = models.IntegerField(default=0) + + def __unicode__(self): + return self.name + + def get_absolute_url(self): + return reverse('poetry_poet', kwargs={'slug': self.slug}) + + def write(self): + curdir = os.getcwd() + os.chdir(os.path.dirname(self.path)) + text = subprocess.check_output(self.path).decode("utf-8") + os.chdir(curdir) + text = text[:1000] + slug = get_hash(text) + title = '' + if self.first_line_title: + title, text = text.split('\n', 1) + if self.skip_first_lines: + text = text.split('\n', self.skip_first_lines)[-1] + text = text.strip('\n') + poem = self.poem_set.create( + slug=slug, + text=text, + title=title + ) + return poem + + +class Poem(models.Model): + slug = models.SlugField(max_length=50, db_index=True) + title = models.CharField(max_length=255, null=True, blank=True) + text = models.TextField() + poet = models.ForeignKey(Poet) + created_at = models.DateTimeField(auto_now_add=True, editable=False, db_index=True) + seen_at = models.DateTimeField(auto_now_add=True, editable=False) + view_count = models.IntegerField(default=1) + + for_contest = models.BooleanField(default=False) + in_contest = models.BooleanField(default=False) + + def __unicode__(self): + oneliner = u"%s, %s" % (self.poet.name, self.pretty_title()) + if not self.title: + oneliner += u" [%s…]" % self.text[:20] + return oneliner + + def get_absolute_url(self): + return reverse('poetry_poem', kwargs={'slug': self.slug}) + + def pretty_title(self): + return self.title or "***" + + def visit(self): + self.view_count += 1 + self.seen_at = datetime.now() + self.save() diff --git a/apps/poetry/static/poetry/poem.css b/apps/poetry/static/poetry/poem.css new file mode 100644 index 0000000..e2f6f01 --- /dev/null +++ b/apps/poetry/static/poetry/poem.css @@ -0,0 +1,137 @@ +body { + font-size: 16px; + font: Georgia, "Times New Roman", serif; + line-height: 1.5em; + margin: 0; +} + +a { + color: blue; + text-decoration: none; +} + +a:hover { + border-bottom: 1px dotted; +} + +#book-text { + margin: 3em; + max-width: 36em; +} + +/* ================================== */ +/* = Header with logo and menu = */ +/* ================================== */ +#header { + margin: 3.4em 0 0 1.4em; +} + +img { + border: none; +} + + +#menu { + position: fixed; + left: 0em; + top: 0em; + width: 100%; + height: 1.5em; + background: #333; + color: #FFF; + opacity: 0.9; + z-index: 99; +} + +#menu a.menu-link { + display: block; + float: left; + height: 1.5em; + margin-left: 0.5em; + text-align: center; + color: #FFF; +} +#menu span { + color: #888; + font-style: italic; + font-size: .75em; + margin-right: 0.5em; +} + + +/* =================================================== */ +/* = Common elements: headings, paragraphs and lines = */ +/* =================================================== */ +h1 { + font-size: 3em; + margin: 1.5em 0; + text-align: center; + line-height: 1.5em; + font-weight: bold; +} + +h2 { + font-size: 2em; + margin: 1.5em 0 0; + font-weight: bold; + line-height: 1.5em; +} + +h3 { + font-size: 1.5em; + margin: 1.5em 0 0; + font-weight: normal; + line-height: 1.5em; +} + +h4 { + font-size: 1em; + margin: 1.5em 0 0; + line-height: 1.5em; +} + +p { + margin: 0; +} + + +#footnotes { + margin-top: 3em; + margin-left: 2.5em; + font-size: 0.875em; +} + +#footnotes p, #footnotes ul { + margin: 1.5em 0; +} + +#footnotes .permalink { + font-size: .75em; +} + +/* =================== */ +/* = Custom elements = */ +/* =================== */ +span.author { + font-size: 0.5em; + display: block; + line-height: 1.5em; + margin-bottom: 0.25em; +} + +span.author a { + color: inherit; +} + +span.author a { + color: inherit; +} + + +/* =================================== */ +/* = Hide some elements for printing = */ +/* =================================== */ + +@media print { + #menu {display: none;} +} diff --git a/apps/poetry/templates/poetry/main.html b/apps/poetry/templates/poetry/main.html new file mode 100644 index 0000000..76fdf09 --- /dev/null +++ b/apps/poetry/templates/poetry/main.html @@ -0,0 +1,62 @@ +{% extends "base.html" %} +{% load url from future %} + +{% block "body" %} + +

+ +Turniej Elektrybałtów

+{% comment %} +
+ +
+
+ + +
+{% endcomment %} +

Uczestnicy:

+ + +
+ +Twórz-że się! + +

Ostatnio opublikowane utwory:

+ + +{% endblock %} diff --git a/apps/poetry/templates/poetry/poem.html b/apps/poetry/templates/poetry/poem.html new file mode 100644 index 0000000..55bf749 --- /dev/null +++ b/apps/poetry/templates/poetry/poem.html @@ -0,0 +1,86 @@ +{% load url from future %} + + + + Turniej Elektrybałtów: {{ poem.poet.name }} + + + + + + + + +
+ + + + + + + +
+

+ {{ poem.poet.name }} + {% if poem.title %}{{ poem.title }}{% else %}***{% endif %} +

+ {{ poem.text|linebreaksbr }} +
+

O utworze

+

Autor: {{ poem.poet.name }} (wszyscy autorzy). +
Zobacz nowy wiersz tego autora, + albo nowy wiersz dowolnego autora.

+ + + +
+

Podziel się wierszem!

+ +
+
+ + + +
+ albo użyj linku:
+ +
+ + + + +
+ + + + + + + + diff --git a/apps/poetry/templates/poetry/poet.html b/apps/poetry/templates/poetry/poet.html new file mode 100644 index 0000000..053dce5 --- /dev/null +++ b/apps/poetry/templates/poetry/poet.html @@ -0,0 +1,44 @@ +{% extends "base.html" %} +{% load url from future %} + +{% block "body" %} + +

+ +{{ poet.name }}

+ +
+ +
+
+ + +
+ +

Zobacz wszystkich autorów.

+ +

Autor programu: {{ poet.author }}

+ +

{{ poet.description }}

+ +

Kod źródłowy: {{ poet.url }}

+ +Twórz-że! + +

Ostatnio opublikowane utwory:

+ + +{% endblock %} diff --git a/apps/poetry/urls.py b/apps/poetry/urls.py new file mode 100644 index 0000000..8d0baeb --- /dev/null +++ b/apps/poetry/urls.py @@ -0,0 +1,11 @@ +from django.conf.urls.defaults import * + +urlpatterns = patterns('poetry.views', + url(r'^wiersz/(?P[a-zA-Z0-9-]+)/$', 'poem', name='poetry_poem'), + + url(r"^$", "main", name="poetry_main"), + url(r"^nowy/$", 'new', name="poetry_new"), + url(r"^(?P[a-zA-Z0-9-]+)/$", "poet", name="poetry_poet"), + url(r"^(?P[a-zA-Z0-9-]+)/nowy/$", 'new', name="poetry_new"), + +) diff --git a/apps/poetry/utils.py b/apps/poetry/utils.py new file mode 100644 index 0000000..76dce25 --- /dev/null +++ b/apps/poetry/utils.py @@ -0,0 +1,10 @@ +import time + +from base64 import urlsafe_b64encode +from django.utils.hashcompat import sha_constructor + + +def get_hash(seed): + sha_digest = sha_constructor('%s%s' % + (time.time(), unicode(seed).encode('utf-8', 'replace'))).digest() + return urlsafe_b64encode(sha_digest).replace('=', '').replace('_', '-').lower() diff --git a/apps/poetry/views.py b/apps/poetry/views.py new file mode 100644 index 0000000..06c95a2 --- /dev/null +++ b/apps/poetry/views.py @@ -0,0 +1,29 @@ +from django.shortcuts import render, get_object_or_404 +from poetry.models import Poet, Poem + + +def new(request, slug=None): + if slug is not None: + poet = get_object_or_404(Poet, slug=slug) + else: + poet = Poet.objects.order_by('?')[0] + + poem = poet.write() + return render(request, "poetry/poem.html", locals()) + + +def poem(request, slug): + poem = get_object_or_404(Poem, slug=slug) + return render(request, "poetry/poem.html", locals()) + + +def poet(request, slug): + poet = get_object_or_404(Poet, slug=slug) + last = poet.poem_set.order_by('-created_at')[:20] + return render(request, "poetry/poet.html", locals()) + + +def main(request): + poets = Poet.objects.all().order_by('?') + last = Poem.objects.all().order_by('-created_at')[:20] + return render(request, "poetry/main.html", locals()) diff --git a/fabfile.py b/fabfile.py new file mode 100644 index 0000000..eb30a2f --- /dev/null +++ b/fabfile.py @@ -0,0 +1,200 @@ +from __future__ import with_statement # needed for python 2.5 +from fabric.api import * +from fabric.contrib import files + +import os + + +# ========== +# = Config = +# ========== +# Globals +env.project_name = 'turniej' +env.use_south = True + +# Servers +def giewont(): + env.hosts = ['giewont.icm.edu.pl'] + env.user = 'lektury' + env.path = '/srv/turniej.wolnelektury.pl' + env.virtualenv = '/usr/bin/virtualenv' + # This goes to VHost configuration + env.server_name = 'turniej.wolnelektury.pl' + env.server_admin = 'Radoslaw Czajka ' + # /var/log/apache2/* logs + env.access_log = 'turniej.log' + env.error_log = 'turniej-errors.log' + + +servers = [giewont] + +# ========= +# = Tasks = +# ========= +def test(): + "Run the test suite and bail out if it fails" + require('hosts', 'path', provided_by=servers) + require('python', provided_by=[find_python]) + result = run('cd %(path)s/%(project_name)s; %(python)s manage.py test' % env) + +def setup(): + """ + Setup a fresh virtualenv as well as a few useful directories, then run + a full deployment. virtualenv with pip should be already installed. + """ + require('hosts', 'path', 'virtualenv', provided_by=servers) + + run('mkdir -p %(path)s; cd %(path)s; %(virtualenv)s ve;' % env, pty=True) + run('cd %(path)s; mkdir releases; mkdir packages;' % env, pty=True) + run('cd %(path)s/releases; ln -s . current; ln -s . previous' % env, pty=True) + upload_default_localsettings() + deploy() + +def deploy(): + """ + Deploy the latest version of the site to the servers, + install any required third party modules, + install the virtual host and then restart the webserver + """ + + import time + env.release = time.strftime('%Y-%m-%dT%H%M') + + upload_tar_from_git() + find_python() + upload_wsgi_script() + upload_vhost_sample() + install_requirements() + copy_localsettings() + symlink_current_release() + collectstatic() + migrate() + restart_webserver() + +def deploy_version(version): + "Specify a specific version to be made live" + require('hosts', 'path', provided_by=servers) + env.version = version + with cd(env.path): + run('rm releases/previous; mv releases/current releases/previous;', pty=True) + run('ln -s %(version)s releases/current' % env, pty=True) + restart_webserver() + +def rollback(): + """ + Limited rollback capability. Simple loads the previously current + version of the code. Rolling back again will swap between the two. + """ + require('hosts', 'path', provided_by=servers) + with cd(env.path): + run('mv releases/current releases/_previous;', pty=True) + run('mv releases/previous releases/current;', pty=True) + run('mv releases/_previous releases/previous;', pty=True) + restart_webserver() + + +# ===================================================================== +# = Helpers. These are called by other functions rather than directly = +# ===================================================================== +def upload_tar_from_git(): + "Create an archive from the current Git branch and upload it" + print '>>> upload tar from git' + require('path', provided_by=servers) + require('release', provided_by=[deploy]) + local('/bin/bash lib/git-archive-all.sh --format tar %(release)s.tar' % env) + local('gzip %(release)s.tar' % env) + run('mkdir -p %(path)s/releases/%(release)s' % env, pty=True) + run('mkdir -p %(path)s/packages' % env, pty=True) + put('%(release)s.tar.gz' % env, '%(path)s/packages/' % env) + run('cd %(path)s/releases/%(release)s && tar zxf ../../packages/%(release)s.tar.gz' % env, pty=True) + local('rm %(release)s.tar.gz' % env) + +def find_python(): + "Finds where virtualenv Python stuff is" + print ">>> find Python paths" + require('path', provided_by=servers) + env.python = '%(path)s/ve/bin/python' % env + env.pip = '%(path)s/ve/bin/pip' % env + env.site_packages = run('%(python)s -c "from distutils.sysconfig import get_python_lib; print get_python_lib()"' % env) + +def upload_vhost_sample(): + "Create and upload Apache virtual host configuration sample" + print ">>> upload vhost sample" + require('path', 'project_name', 'user', provided_by=servers) + require('access_log', 'error_log', 'server_admin', 'server_name', provided_by=servers) + require('site_packages', provided_by=[find_python]) + files.upload_template('%(project_name)s.vhost.template' % env, '%(path)s/%(project_name)s.vhost' % env, context=env) + +def upload_wsgi_script(): + "Create and upload a wsgi script sample" + print ">>> upload wsgi script sample" + require('path', 'project_name', provided_by=servers) + require('python', 'site_packages', provided_by=[find_python]) + files.upload_template('%(project_name)s.wsgi.template' % env, '%(path)s/%(project_name)s.wsgi' % env, context=env) + run('chmod ug+x %(path)s/%(project_name)s.wsgi' % env) + +def install_requirements(): + "Install the required packages from the requirements file using pip" + print '>>> install requirements' + require('path', provided_by=servers) + require('release', provided_by=[deploy]) + require('pip', provided_by=[find_python]) + run('%(pip)s install -r %(path)s/releases/%(release)s/requirements.txt' % env, pty=True) + +def secret_key(): + """Generates a new SECRET_KEY.""" + from random import Random + import string + + r = Random() + return "".join(r.choice(string.printable) for i in range(64)) + +def upload_default_localsettings(): + "Uploads localsettings.py with media paths and stuff" + print ">>> upload default localsettings.py" + require('path', provided_by=servers) + + env.secret_key = secret_key() + files.upload_template('%(project_name)s/localsettings.py.template' % env, '%(path)s/localsettings.py' % env, context=env) + +def copy_localsettings(): + "Copy localsettings.py from root directory to release directory (if this file exists)" + print ">>> copy localsettings" + require('path', 'project_name', provided_by=servers) + require('release', provided_by=[deploy]) + + with settings(warn_only=True): + run('cp %(path)s/localsettings.py %(path)s/releases/%(release)s/%(project_name)s' % env) + +def symlink_current_release(): + "Symlink our current release" + print '>>> symlink current release' + require('path', provided_by=servers) + require('release', provided_by=[deploy]) + with cd(env.path): + run('rm releases/previous; mv releases/current releases/previous') + run('ln -s %(release)s releases/current' % env) + +def collectstatic(): + """Runs collectstatic management command from Django staticfiles.""" + print '>>> collectstatic' + require('path', 'project_name', provided_by=servers) + require('python', provided_by=[find_python]) + with cd('%(path)s/releases/current/%(project_name)s' % env): + run('%(python)s manage.py collectstatic --noinput' % env, pty=True) + +def migrate(): + "Update the database" + print '>>> migrate' + require('path', 'project_name', provided_by=servers) + require('python', provided_by=[find_python]) + with cd('%(path)s/releases/current/%(project_name)s' % env): + run('%(python)s manage.py syncdb --noinput' % env, pty=True) + if env.use_south: + run('%(python)s manage.py migrate' % env, pty=True) + +def restart_webserver(): + "Restart the web server" + print '>>> restart webserver' + require('path', 'project_name', provided_by=servers) + run('touch %(path)s/%(project_name)s.wsgi' % env) diff --git a/lib/git-archive-all.sh b/lib/git-archive-all.sh new file mode 100644 index 0000000..95e8582 --- /dev/null +++ b/lib/git-archive-all.sh @@ -0,0 +1,208 @@ +#!/bin/bash - +# +# File: git-archive-all.sh +# +# Description: A utility script that builds an archive file(s) of all +# git repositories and submodules in the current path. +# Useful for creating a single tarfile of a git super- +# project that contains other submodules. +# +# Examples: Use git-archive-all.sh to create archive distributions +# from git repositories. To use, simply do: +# +# cd $GIT_DIR; git-archive-all.sh +# +# where $GIT_DIR is the root of your git superproject. +# +# License: GPL3 +# +############################################################################### +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +# +############################################################################### + +# DEBUGGING +set -e +set -C # noclobber + +# TRAP SIGNALS +trap 'cleanup' QUIT EXIT + +# For security reasons, explicitly set the internal field separator +# to newline, space, tab +OLD_IFS=$IFS +IFS=' + ' + +function cleanup () { + rm -f $TMPFILE + rm -f $TOARCHIVE + IFS="$OLD_IFS" +} + +function usage () { + echo "Usage is as follows:" + echo + echo "$PROGRAM <--version>" + echo " Prints the program version number on a line by itself and exits." + echo + echo "$PROGRAM <--usage|--help|-?>" + echo " Prints this usage output and exits." + echo + echo "$PROGRAM [--format ] [--prefix ] [--separate|-s] [output_file]" + echo " Creates an archive for the entire git superproject, and its submodules" + echo " using the passed parameters, described below." + echo + echo " If '--format' is specified, the archive is created with the named" + echo " git archiver backend. Obviously, this must be a backend that git archive" + echo " understands. The format defaults to 'tar' if not specified." + echo + echo " If '--prefix' is specified, the archive's superproject and all submodules" + echo " are created with the prefix named. The default is to not use one." + echo + echo " If '--separate' or '-s' is specified, individual archives will be created" + echo " for each of the superproject itself and its submodules. The default is to" + echo " concatenate individual archives into one larger archive." + echo + echo " If 'output_file' is specified, the resulting archive is created as the" + echo " file named. This parameter is essentially a path that must be writeable." + echo " When combined with '--separate' ('-s') this path must refer to a directory." + echo " Without this parameter or when combined with '--separate' the resulting" + echo " archive(s) are named with a dot-separated path of the archived directory and" + echo " a file extension equal to their format (e.g., 'superdir.submodule1dir.tar')." +} + +function version () { + echo "$PROGRAM version $VERSION" +} + +# Internal variables and initializations. +readonly PROGRAM=`basename "$0"` +readonly VERSION=0.2 + +OLD_PWD="`pwd`" +TMPDIR=${TMPDIR:-/tmp} +TMPFILE=`mktemp "$TMPDIR/$PROGRAM.XXXXXX"` # Create a place to store our work's progress +TOARCHIVE=`mktemp "$TMPDIR/$PROGRAM.toarchive.XXXXXX"` +OUT_FILE=$OLD_PWD # assume "this directory" without a name change by default +SEPARATE=0 + +FORMAT=tar +PREFIX= +TREEISH=HEAD + +# RETURN VALUES/EXIT STATUS CODES +readonly E_BAD_OPTION=254 +readonly E_UNKNOWN=255 + +# Process command-line arguments. +while test $# -gt 0; do + case $1 in + --format ) + shift + FORMAT="$1" + shift + ;; + + --prefix ) + shift + PREFIX="$1" + shift + ;; + + --separate | -s ) + shift + SEPARATE=1 + ;; + + --version ) + version + exit + ;; + + -? | --usage | --help ) + usage + exit + ;; + + -* ) + echo "Unrecognized option: $1" >&2 + usage + exit $E_BAD_OPTION + ;; + + * ) + break + ;; + esac +done + +if [ ! -z "$1" ]; then + OUT_FILE="$1" + shift +fi + +# Validate parameters; error early, error often. +if [ $SEPARATE -eq 1 -a ! -d $OUT_FILE ]; then + echo "When creating multiple archives, your destination must be a directory." + echo "If it's not, you risk being surprised when your files are overwritten." + exit +elif [ `git config -l | grep -q '^core\.bare=false'; echo $?` -ne 0 ]; then + echo "$PROGRAM must be run from a git working copy (i.e., not a bare repository)." + exit +fi + +# Create the superproject's git archive +git archive --format=$FORMAT --prefix="$PREFIX" $TREEISH > $TMPDIR/$(basename $(pwd)).$FORMAT +echo $TMPDIR/$(basename $(pwd)).$FORMAT >| $TMPFILE # clobber on purpose +superfile=`head -n 1 $TMPFILE` + +# find all '.git' dirs, these show us the remaining to-be-archived dirs +find . -name '.git' -type d -print | sed -e 's/^\.\///' -e 's/\.git$//' | (grep -v '^$' || echo -n) >> $TOARCHIVE + +while read path; do + TREEISH=$(git submodule | grep "^ .*${path%/} " | cut -d ' ' -f 2) # git submodule does not list trailing slashes in $path + cd "$path" + git archive --format=$FORMAT --prefix="${PREFIX}$path" ${TREEISH:-HEAD} > "$TMPDIR"/"$(echo "$path" | sed -e 's/\//./g')"$FORMAT + if [ $FORMAT == 'zip' ]; then + # delete the empty directory entry; zipped submodules won't unzip if we don't do this + zip -d "$(tail -n 1 $TMPFILE)" "${PREFIX}${path%/}" >/dev/null # remove trailing '/' + fi + echo "$TMPDIR"/"$(echo "$path" | sed -e 's/\//./g')"$FORMAT >> $TMPFILE + cd "$OLD_PWD" +done < $TOARCHIVE + +# Concatenate archives into a super-archive. +if [ $SEPARATE -eq 0 ]; then + if [ $FORMAT == 'tar' ]; then + sed -e '1d' $TMPFILE | while read file; do + tar --concatenate -f "$superfile" "$file" && rm -f "$file" + done + elif [ $FORMAT == 'zip' ]; then + sed -e '1d' $TMPFILE | while read file; do + # zip incorrectly stores the full path, so cd and then grow + cd `dirname "$file"` + zip -g "$superfile" `basename "$file"` && rm -f "$file" + done + cd "$OLD_PWD" + fi + + echo "$superfile" >| $TMPFILE # clobber on purpose +fi + +while read file; do + mv "$file" "$OUT_FILE" +done < $TMPFILE diff --git a/requirements-dev.txt b/requirements-dev.txt new file mode 100644 index 0000000..aec394f --- /dev/null +++ b/requirements-dev.txt @@ -0,0 +1 @@ +django-debug-toolbar diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..2e16d22 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,5 @@ +# Django basics +django>=1.3,<1.4 +South>=0.7 + +piwik diff --git a/turniej.vhost.template b/turniej.vhost.template new file mode 100644 index 0000000..3caae7f --- /dev/null +++ b/turniej.vhost.template @@ -0,0 +1,31 @@ + + ServerName "%(server_name)s" + ServerAdmin "%(server_admin)s" + + WSGIDaemonProcess %(project_name)s user=%(user)s group=%(user)s processes=2 threads=15 display-name=%%{GROUP} python-path=%(site_packages)s + WSGIProcessGroup %(project_name)s + + WSGIScriptAlias / %(path)s/%(project_name)s.wsgi + + Order allow,deny + allow from all + + + Alias /media %(path)s/media + + Options Indexes + Order allow,deny + Allow from all + + + Alias /static %(path)s/releases/current/%(project_name)s/static + + Options Indexes + Order allow,deny + Allow from all + + + LogLevel warn + ErrorLog /var/log/apache2/%(error_log)s + CustomLog /var/log/apache2/%(access_log)s combined + diff --git a/turniej.wsgi.template b/turniej.wsgi.template new file mode 100644 index 0000000..af1781c --- /dev/null +++ b/turniej.wsgi.template @@ -0,0 +1,26 @@ +#!%(python)s +import site +site.addsitedir('%(site_packages)s') + +import os +from os.path import abspath, dirname, join +import sys + +# Redirect sys.stdout to sys.stderr for bad libraries like geopy that use +# print statements for optional import exceptions. +sys.stdout = sys.stderr + +# Add apps and lib directories to PYTHONPATH +sys.path = [ + '%(path)s/releases/current/%(project_name)s', + '%(path)s/releases/current', + '%(path)s/releases/current/apps', + '%(path)s/releases/current/lib', + # add paths to submodules here +] + sys.path + +# Run Django +os.environ['DJANGO_SETTINGS_MODULE'] = 'settings' + +from django.core.handlers.wsgi import WSGIHandler +application = WSGIHandler() diff --git a/turniej/__init__.py b/turniej/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/turniej/localsettings.py.template b/turniej/localsettings.py.template new file mode 100644 index 0000000..3765080 --- /dev/null +++ b/turniej/localsettings.py.template @@ -0,0 +1,27 @@ +# This template is uploaded by `fab setup`. +# You should fill out the details in the version deployed on the server. + + +ADMINS = ( + #('Name', 'E-mail'), +) + +MANAGERS = ( + #('Name', 'E-mail'), +) + +# on +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': '', # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + + +SECRET_KEY = %(secret_key)r +MEDIA_ROOT = '%(path)s/media/' diff --git a/turniej/manage.py b/turniej/manage.py new file mode 100755 index 0000000..eb91c2d --- /dev/null +++ b/turniej/manage.py @@ -0,0 +1,26 @@ +#!/usr/bin/env python +import os.path +import sys + +ROOT = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) + +# Add apps and lib directories to PYTHONPATH +sys.path = [ + os.path.join(ROOT, 'apps'), + os.path.join(ROOT, 'lib'), + # add /lib/* paths here for submodules +] + sys.path + +from django.core.management import execute_manager +import imp +try: + imp.find_module('settings') # Assumed to be in the same directory. +except ImportError: + import sys + sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n" % __file__) + sys.exit(1) + +import settings + +if __name__ == "__main__": + execute_manager(settings) diff --git a/turniej/settings.py b/turniej/settings.py new file mode 100644 index 0000000..62a66e5 --- /dev/null +++ b/turniej/settings.py @@ -0,0 +1,158 @@ +# -*- coding: utf-8 -*- +# Django settings for turniej project. +import os.path + +PROJECT_DIR = os.path.abspath(os.path.dirname(__file__)) + +DEBUG = False +TEMPLATE_DEBUG = DEBUG + +ADMINS = [ + # ('Your Name', 'your_email@domain.com'), +] + +MANAGERS = ADMINS + +DATABASES = { + 'default': { + 'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. + 'NAME': os.path.join(PROJECT_DIR, 'dev.db'), # Or path to database file if using sqlite3. + 'USER': '', # Not used with sqlite3. + 'PASSWORD': '', # Not used with sqlite3. + 'HOST': '', # Set to empty string for localhost. Not used with sqlite3. + 'PORT': '', # Set to empty string for default. Not used with sqlite3. + } +} + +# Local time zone for this installation. Choices can be found here: +# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name +# although not all choices may be available on all operating systems. +# On Unix systems, a value of None will cause Django to use the same +# timezone as the operating system. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = None + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +#LANGUAGE_CODE = 'pl' + +SITE_ID = 1 + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +#USE_I18N = True + +# If you set this to False, Django will not format dates, numbers and +# calendars according to the current locale +#USE_L10N = True + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/home/media/media.lawrence.com/media/" +MEDIA_ROOT = os.path.join(PROJECT_DIR, '../media') + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash. +# Examples: "http://media.lawrence.com/media/", "http://example.com/media/" +MEDIA_URL = '/media/' + +# Absolute path to the directory static files should be collected to. +# Don't put anything in this directory yourself; store your static files +# in apps' "static/" subdirectories and in STATICFILES_DIRS. +# Example: "/home/media/media.lawrence.com/static/" +STATIC_ROOT = os.path.join(PROJECT_DIR, '../static') + +# URL prefix for static files. +# Example: "http://media.lawrence.com/static/" +STATIC_URL = '/static/' + +# URL prefix for admin static files -- CSS, JavaScript and images. +# Make sure to use a trailing slash. +# Examples: "http://foo.com/static/admin/", "/static/admin/". +ADMIN_MEDIA_PREFIX = '/static/admin/' + +# Additional locations of static files +STATICFILES_DIRS = ( + # Put strings here, like "/home/html/static" or "C:/www/django/static". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + + os.path.join(PROJECT_DIR, 'static'), +) + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', +# 'django.contrib.staticfiles.finders.DefaultStorageFinder', +) + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = [ + 'django.template.loaders.filesystem.Loader', + 'django.template.loaders.app_directories.Loader', +# 'django.template.loaders.eggs.Loader', +] + +MIDDLEWARE_CLASSES = [ + 'django.middleware.common.CommonMiddleware', + #'django.contrib.sessions.middleware.SessionMiddleware', + #'django.middleware.csrf.CsrfViewMiddleware', + #'django.contrib.auth.middleware.AuthenticationMiddleware', + #'django.contrib.messages.middleware.MessageMiddleware', +] + +ROOT_URLCONF = 'turniej.urls' + +TEMPLATE_DIRS = [ + # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates". + # Always use forward slashes, even on Windows. + # Don't forget to use absolute paths, not relative paths. + os.path.join(PROJECT_DIR, 'templates'), +] + +INSTALLED_APPS = [ + #'django.contrib.auth', + #'django.contrib.contenttypes', + #'django.contrib.sessions', + #'django.contrib.sites', + #'django.contrib.messages', + 'django.contrib.staticfiles', + + # 'django.contrib.admin', + # 'django.contrib.admindocs', + + 'south', + + 'poetry', +] + +# A sample logging configuration. The only tangible logging +# performed by this configuration is to send an email to +# the site admins on every HTTP 500 error. +# See http://docs.djangoproject.com/en/dev/topics/logging for +# more details on how to customize your logging configuration. +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + 'handlers': { + 'mail_admins': { + 'level': 'ERROR', + 'class': 'django.utils.log.AdminEmailHandler' + } + }, + 'loggers': { + 'django.request': { + 'handlers': ['mail_admins'], + 'level': 'ERROR', + 'propagate': True, + }, + } +} + +# Load localsettings, if they exist +try: + from localsettings import * +except ImportError: + pass diff --git a/turniej/static/img/cc.png b/turniej/static/img/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..1de9d629d00317825095a7c90991478b60da8263 GIT binary patch literal 5982 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 MK~ug))-3e@0UMY~B>(^b literal 0 HcmV?d00001 diff --git a/turniej/static/img/di.png b/turniej/static/img/di.png new file mode 100644 index 0000000000000000000000000000000000000000..8136626202e2ed925bdcec443c52d8b6af7db5a8 GIT binary patch literal 5354 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 M@wWR2dx?bn1Hg?ytN;K2 literal 0 HcmV?d00001 diff --git a/turniej/static/img/fnp.png b/turniej/static/img/fnp.png new file mode 100644 index 0000000000000000000000000000000000000000..fe75e2d5edbfd48dd40c9705ee47c4e5807e8d57 GIT binary patch literal 7662 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 HO+x+$^+WIJ literal 0 HcmV?d00001 diff --git a/turniej/static/img/koed.png b/turniej/static/img/koed.png new file mode 100644 index 0000000000000000000000000000000000000000..6bcce1761a5ac64e952e4b322f8566686ba3a4c8 GIT binary patch literal 7158 zcmZ`;byQScw7-NfATc1y5R!`cF{Cs|j6>%jNH-2$l1d{XFv3SS2*@BPCDKR;3^51_ z(lLaTbW6Ycy?@?c@2qv_tb1qntaZ-ad;j9Z=xVD_Q!-Nm06?v#iqr#VfAA895QCq2 zs54G*qVP~P_5y&LxBk0`fUF$Ye-C{<6z#$Je}4^#UWqXR0E@61Qc>T3YB}(wi~0D= zRlmVT{IuV`C*4EO+e+$%@afM#o zHCNkyt+@z{uo1hkRXYqZ;qvp)rJ(AAlbSi6NmEIIw1YE-Et{W1O^(zd_fcgnuPr2q z=HMdaf%WX_bBMLV8$JF+=6IYN&(qGyi%(@d)J5$u{$pfBZ{gbK>Hf#tXYbnh*9ZcT z`11)STX>@C-^(i__=<<5i#Q7~@csMpi$<+%@yxZ=7gCt&@93rcd%4>9&u}&RkO6cJ z%(i)!28b=x)YME#O+CE~mP^yi(k}UGAsC`>U@#(DGIDwjFo!tN(r_Ufbd6ek&L`w8 zPZw0iukb(CopP%dG%els120FUNTiDncXwBux(q&$~dxxY*6H0?5 z#<460eBP$AzQ?7A)%TjMgg;lX1_`}9)KqF@bU3&{Q1+=-29T< zeEhajL5c`Y2#04BVZW{PQ*^5!nr(4bU3xcUX-^Wc6JbinA2r5(G6+MrLji<8di$DY z?ySef&4j~O?GVsSz7cEs)$fVMPKGr@;2aOa1%vu%XZgSy^C*+*y4yvV>b0IaWPv|9 zIXN{oHOg93N5|06Fg?_i_&#TZp3@Cx&IssY1`j<&gszv@!NkPG@z%7w%A0ZGtS3b* zkzor($$o=YTV3?pZo@11LTS<~2< zNmA}ORg@sdOhpD}!Y5uz#%KB51@s+5sKMpc3XAIvZ?qZ1ES~cYX)|G*nPzMMyiRiS z_I>3W#ZCp#xA)KXBO`H5ohO{4V;lmt>c3qmJQH1G8Tpu^tm_`(KIyHUXx&$M1nBG9 z7|LCFNc4q3Lg)rXlN_F6hVlU)c{55fp> zCWX(niq}^}=cZRS;0p1U<#mNt;o(q=H^&&AJcb+fk*10g``Ikl@2j_k7@b)qBcQg* zB9HIHonS@k!Oftiw&v21tM@7*v~{n}YE}(I&q!DbGBQ_5(+ap>|4O@EVzQ_4spGFR zf#QIlJc~2p;b@c!!K&(B?>k=MEap7NPcj2Av2?qEjLc?HHmO|ASrLpZ(8?zrD(o9( z)wleqyi~5L;7_Q+=1H`eyq!S$5?Ll3k2NgkrNqHFyN>c^!Pmca8py`k_1H&y(&ZV0 zl3LP0nkJ8J{d6O-C>3}9P_vo9MqzB>?-x=)I}E&;OBPPkF7Yv6RnK_6^r8`o`sMRD zxo`IlE(4Cg&(_jN-XS~u`&U5B@2ZDcQvEDtY|a%SQAGn^yIkCw+}B1UyFWtc5Oyf< z$~Pz;nMs+yCyDE{Q(2Z&f2X%;H%ZE+KAHJs}vp7sssz4|9r2V zgx0Ldd%crZ{?K3cf_rp)oLw$(qMx_zY_#&v#>UAGLD0i@?Cr(xU(K+%DuzjgsDcJ_ zmU>Zn%ilIpP!Ji+b}qBS>2E7ZFy6#>u@Wm2!8qwT>%7s6`#m9}b*J4~f8vj9zhBmG zZ*LC{4%+7j`Ho<<#w#u5U+&v+Kpk9MF8&y{sY4olHpcprALIue8|M!_03jBHfTP1h zyBg!cr(RxOBO@c)C0>NqpulKuZtkWEa$=&^{`vX&&CSiVwYB)WG6PSMML%7q>wLVu z87L#cqHj4GGbNnQoqSu^9nq0@t)Cvsm64E?{F}QI7;VW7sNSRRu-cs_T-8-*Z$=UWR)fc0H`$9H-HPb_1go`b&tl2rla8R`WQ{wqxcvQ~EN#VXD9l!K{0jzK zEcUp>k;y=VNna5{LV}|Tn}B|kAiHvV@rO#HbDTs}{-C|ReXQIxJ3IS^;zX^pp@G5Z z{5(fnjX*kn%hwhYB$q$Fv25?=;9!MO;-Zu5o0x#vx>#FtCaUi8$;-;NcrGb#$JmKv zs@_{XdUcw^Q^^s*N)tWnc5)h+Ab-_>UuI@zCI%9EI&Y+KK;-g=c22xBg>gyu8o|_U zkll|KUir9G+&*DevYcZyeo&wgpmfUEFc}IRWL&8{x#TbYhf~Cs%;dB3aMJIOrP~h9 zr`z%6@)KicjMUk!%f7C|M>&dO@ox|O z{dl~TK#sMki3zD9jD>|H6j1<;L1txVpHBb$i83FjWs{W@7f6l#Pq#~ej`VGM)tXk!Ax6ZSZv+Bca*ur)4(9rGsk|G~stAEVw&fu~h-2dq+ zw!}NKy3!o&_B9VbMENa=NA$y#eBj|t+H1kEiE;M>WBxk&j~}}lR)(>qrR%u2EIgfT za)E!r0(<@XwT$03SXjCSwFL!XwCfuiH={e7eYd0oj=|h<2nYy>2@4b6-r2D|2{yOdBQ(gxlJ-05y=dCc5U3uyW+H=%F?7zolzo5VYr6MCzK&61iE`PRGlyuL) z(D3B=xURnbfXU9dHSl!5w--_`O2aDoV`8EKr%kG8WM(ECd?9J8X)yXAKk##Htxq=z zCGf8*b#@^Wv{0X#Y>FaLE7@&-kckYNA5QgTwqZe+_lH~cDXE;-o*UC=)``X~dEb+Z z)xh9*t4yL!WW45AOVdl0@G1+eMF^1RUQ|}rzuc!C8uw+XHH?CHqSDUGxC_?z0 zxDr|WS68732oWN}D@bE0-|3b1s9si@aww&`XeOJne0YAJJQ_n0-maBWU0n^*J`x2< zRvJ=bb93`PyU(SiF(iGWtvX3ACOITrHVF?NQ+XQD9 zJt(Pjpi^VOLzr^GyDlNFs)!;^2u=D&ve@cteYQ<>hTxN0rZwSE?w(e}H3hl8GkT+1Z)soh~mXA;Bx)$%yE-4HXsDm%2I=VJ9ai z%1FfQ?5ySW*|?#pC$*c9d_tqE;z&(Xn$jB~0O-mPP?J;JCuVE});Hgaov4>8mm=P1 zF_>ejz0tCn%$!JNRjUD5LJn4cw)!Z#MM4=w?%lJ-VM^nmpv&$!#u6;HtgP(p>zwO*{i(SA2mBV8c( zaX?znyYl?wL=`qEua$u?67n4F63190ncX|);|2!H{r}2@fida$NJK$vYinj^=4*1= z7xB-i$^?{z0A5>SPe_E!XIW}GC5=7mPaBQ>yKE&z|A<@$7gY5oM@RH_|K|MMcQtvs zt^aCZsX~x>YAmkIRn*|p|NlJ{}b#-(+-R-0;DJcPI`rj`t_5lIsrw6O# zb8Qadb3G)7&Jk{{S z%J=X>M-*0%mn_DwR;gp1*9O zDk!5;?`eXB#bR<_FkO>}f^&>RS(MqQd3L5-wO9`$T+9@D^ zsY$gFD8{5%X|6JcRu4{F)=h~+%gXlrXHw{Wn{&rSK>cJV;y7Cu3Jtq22^C^vTC`w) zxS#HTZKC7Q8UjM$r{bfs#s+(-Ay;eUvCKV2q9g&Zo8nSm*eHmA$(dY-!gQ7AbX;X= zzrOq$Hi10CT?ES$Ud0?Ul5#SbyiBEs5`~)jEp)h5oV4Bv12APpC@XO_MR+dMn8B=Y&E)KlQtCIyx9xlT$Inlt>Tssc(Mk2r zhw#iQq&=Jq~^lvD@ZpP9lXy#7N_}i@$bF?(> zscuC*cyY>POxch#s-$D*THFKtTgc-TX^cVQV1AM}Y-%R^2M#`^wHUd%WNh)t&8h5n zPqi|4-KPt$J(48@(!E}b6@Sa1)1b-F(N-xYOnr{1`n zHXo$k%-b&>wMJ6`dZj2OEh|j`hG@@lt4Z~I5S(S_?Y%OTE0FcMbg}evX}Hw# z#{Sw0W2I18wnV7j>{7+*7>&DTu^veB4wUo^ZiB?n+{kF2KN8XLhq=o}cw|tFiu+F7 zo*~F;Qq_&q>yCeC;Fdg{m*2+Nf>`Ob8ehnZFBq^BX-T657WW#kj?S!U7k_)?dAh_O z2ZZU}<)msCy0ahofiS)3t?y~!B`yAb*tYZ#R=M-d=*QvAX5a%{VNWfEZDO3u)sxb) z4{C~4m91-fj|ua=^19fAgtyQ_&5xCrO+Du13UuEh5esWSi_!%x*)jE%Z z0oE`wTtiLG!B#yXcBiF%*H6;b$e4KLVchC5V0UaG3+uLsG zcmov5y4=|Re5>AlwrO;1>=`eE#mnVX1rA*ci@^tG!DymTsZHzrl9zI?v=~@57U?lD zrG9t>EinQ^ga9Gw6zPOCcp9OKK_QTxKhB~pa&ykijXg?w%pb(Kb?VkMW=@_8AY7W+ zFZ!IGk=NfXK@Y9&*T~xSPEPWWzb3MXiXkl;rg0^-KF%LHm@)%YOGcKLmjzpP z!z(rtReyh%AbgqLYWCY16V*a7B=c!SzqKR|W`S^$kdU-pZn?k2b)}GjR6Z^)4kSJN z{QOuesi3n%(4>hIY+XBgCG)?-)YMc7C90AM*L=8qzs=d>OZ#d$)lQ~mixV*?wCCGm z?P>SN<$`FKE-s_f;^*9Px?$yYgx+o2OkomEcx;84n=kx;g%oB@jL}0w;lv7}!Q2cJ z)k#C&pj@%c>hKqeg@a6zrq`AO@?3tC|NAehSM8N9n>rc%VrzHe8a;V9;a?#QCfe%65VW%QnnmFgrC5eiVE7}$)`h* zZ=Q@ig3!(NQj4IxDUDW^uZTT$on|uSocCA0ZVmuecAJKcGXv)5xx$#@tUs^$HrVA-Zzj+)BFq#2Os1sk)MC%f znTR?RR#Z6useJpL?5rUs602AAn)@2?iz{_7_E=?PJ7ZV8_SMo@S1y1x&+qYm`NAcn zST)3Nre5rRfJ&Q%K^96U50anSN7zV0IX|&9ex4^GvNVm!ehrO9a@D&N*jQO}a&q94 zXZGqh*P5=zOx;V%oZjL*y`!R{Ae;%Z`>H~)&5aFH*C?NgTCyJ+HNRZeb{jURx!rB} zV=MYf32(Jn1<}_~+h5C{CTkDc>fA5G#%C2uv5t;fLoe+0#t*XcM!%#e8mR4moO&Fa zCo@@%3?a<(!HoId^LD&=GFxwzc~b?lzP>Ky^XC_+jlHfeUe=hL)Fi?2VCI1hM;CKu zy0Edewai(vva$klSFI5_F|r``E?SI#U1{S&qjUa+-v;W&B8>I)J_2FB#qLFBhp|SA z>&rd6J(sOYqr4ba4^W7fvTYMV~}?5?d^ed>>HTnKw|9$k7-(6bVtKQ#*T7^MrO>eML)fG zJpQ5gOdmdgDk~cs8zUnQ`xZ3L?p9^S z8Ph%e$X%nI(qZzufg#8BY(yUozq2EVwP6D2Nzd2*%HP-HHqFXEX<|t;NVbW9B8cIa zF*&ta4137&-ihr0%td(C^Q0Dt7DMiI-G!9Se1!u|#oD}y*n4Z(m^zWO#8orVQ z4*+)oOyucmTk?b=8Y(K#YL1M&p@c%Bs3H+XMMY*##+?@sPOTBmkDWP$FZN^0Oj*%3 z7&@EjpT{I%xmB#jChFl}x0DRwbK^lrDnU;w?Yu@>Hp8z0Vw}JJ8)DmTUkvnF?cr8m zvUz%lB;9Gbf{RjRf+fdm;kvI!_bW?0#Zn#?w+sv9YL|>S)^s5ZMiB-7;+M}rU-<0o zFFO!{;LIQL1N(HKT>f`7=r=G@k$pERrkG@G`>Pb)xz|C?4k(CZvfjPBwYKKJl4&2$ zDz!i3H57D^O)xVuY6vkI=4!#EpDT~7YL!(Kz~U!smG14rcY6A zpB|1vJD4=RLmosbDa8n*pGCML4C3&E% zo@Hi@OEJIYiU{xEz)cKb)|$3`o3*wzc#`Gvbw<9J34kQ{Qyg~05%DI|Af{*OG*FI# zGSkOr(nUN`)&Hx7^YDX2Rmt2zu_}wn_=VN+Lrt*fJbh$OQEd(9=i4L4QK^gdubDSu zpv0K!&}!YBnX||bSo^>{tZVso$A;VA^b~E=x>pHV;iDVFJGSTzs*QwC!DR2^Y5*Ws z^Q(mHF}k&igOVnKl+Q0)xkKHwWtEnW$+jtx+o-Jks%Rz3e*8x;K7sN?;Ms7iZ-)Qd zw9&<0{Oc*c!Mdr4e5SQUk0_`B@6VrmAz67+l@4m*&k^rafv=3oi}ERdqEPKd@SAc! zjQl26X9G_J@z?*ZjhMf)nPu!>!E!y_84~bbeKC^41f#*O6=Bcz-i7d;V8+<1uIiB+`(owSVG(Y>mtwBEC*ImQ-OJB6tQ9T(r+pX>fg-|r zrCnb1ZcQ;9x`XCJoLaIxQdxZck>nAU!bR>Mrxsl!{a+2(=Tv3ZNbn#^LoS=&A^8a` zj*sS|^Zhk>u21B$G5^EA;7QtjZzUsdJ8SRf(zY+2gA*VkBrMD?B*iZ*qAx5YE&53M tktCmxh_sN9P0sv(2X_A#;OcJYh<^G12i)o~ssjT6H6?9i1;Q%)e*hao{LBCV literal 0 HcmV?d00001 diff --git a/turniej/static/img/lempl.png b/turniej/static/img/lempl.png new file mode 100644 index 0000000000000000000000000000000000000000..51c9b9ee3625d51c2bc837598fc6621589e3ac75 GIT binary patch literal 2331 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 bIwG9KynS7Bc9c1Rk3hPbhS19U4pILDI*+Rv literal 0 HcmV?d00001 diff --git a/turniej/static/img/turniej.png b/turniej/static/img/turniej.png new file mode 100644 index 0000000000000000000000000000000000000000..dbcbda4152b2242b38fde6c3bbdbf5c7bf6f92f9 GIT binary patch literal 33174 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 x8;O4xeCxTdP`pswDeepucPZ|!0~B|6yZugX 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 znaleziono strony + +

Nie ma tu żadnej strony. Przejdź do strony głównej.

+ +{% endblock %} diff --git a/turniej/templates/500.html b/turniej/templates/500.html new file mode 100644 index 0000000..0940a22 --- /dev/null +++ b/turniej/templates/500.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block "body" %} +

Błąd

+ +

Wystąpił błąd serwera. Przepraszamy!

+ +{% endblock %} diff --git a/turniej/templates/base.html b/turniej/templates/base.html new file mode 100644 index 0000000..4b28f18 --- /dev/null +++ b/turniej/templates/base.html @@ -0,0 +1,36 @@ + + + + Turniej Elektrybałtów + + + + + + + + +
+ + + +
+{% block "body" %}{% endblock %} +
+ + + + + + + diff --git a/turniej/templates/home.html b/turniej/templates/home.html new file mode 100644 index 0000000..d0eb78e --- /dev/null +++ b/turniej/templates/home.html @@ -0,0 +1,97 @@ +{% extends "base.html" %} +{% load url from future %} + +{% block "body" %} + +
+logo Turnieju Elektrybałtów: frontalny widok maszynki do mielenia mięsa +

Ostatnie wiersze:

+
    +{% for poem in last %} +
  • {{ poem }}
  • +{% endfor %} +
+ +
+ +
+

Turniej Elektrybałtów

+

Konkurs automatycznej poezji

+ + + + +

Znacie Leśmianatora? +To niewielki skrypt miksujący na życzenie wiersze z +Wolnych Lektur. +Powstał jako żart, a niechcący + +„odciął się od dosłownie rozumianego dziedzictwa dadaizmu i surrealizmu”. +Idziemy dalej – ogłaszamy otwarty konkurs na najlepszego automatycznego poetę!

+ +

Konkurs wystartował 12 września 2011 roku – z okazji 90 rocznicy urodzin +Stanisława Lema. Termin nadsyłania prac upłynął +10 listopada 2011 roku. +Prezentujemy nadesłane prace w akcji. +Kliknij przycisk, a jeden +z programów-uczestników napisze dla Ciebie wiersz:

+ +Twórz-że się! + +

Zobacz wszystkie programy. Ich kod źródłowy +jest dostępny na wolnej licencji +– nic więc nie stoi na przeszkodzie, by rozwijać je dalej.

+ +

Do zabawy zapraszamy wszystkich – i tych, którzy świetnie programują, i tych, którzy +programować dopiero się uczą. Tych, którzy nie rozstają się z tomikiem +wierszy, i tych, którzy na ten widok dostają gęsiej skórki. Chcemy wybrać +program, który będzie w najciekawszy i najbardziej twórczy sposób miksował +dostępną w Wolnych Lekturach literaturę. W tej konkurencji liczy się przede +wszystkim wyobraźnia, pomysł i chęć do twórczej zabawy.

+ +

Więcej informacji:

+ +
    +
  • Przebieg konkursu – czyli jakie będą kolejne etapy + i co jest nagrodą?
  • + +
  • Technikalia – czyli co i jak trzeba zrobić, + żeby wziąć udział.
  • + +
  • Regulamin – czyli trochę koniecznych formalności.
  • +
+ +

Wszelkiego rodzaju pytania i wątpliwości proszę kierować na adres +radoslaw.czajka@nowoczesnapolska.org.pl

+ +
+
+ + + + + +{% endblock %} diff --git a/turniej/templates/pages/more.html b/turniej/templates/pages/more.html new file mode 100644 index 0000000..c60db14 --- /dev/null +++ b/turniej/templates/pages/more.html @@ -0,0 +1,65 @@ +{% extends "base.html" %} + +{% block "body" %} + +

+ +Turniej Elektrybałtów

+

+Konkurs automatycznej poezji

+ +
+

Gdy wskaźniki amplifikacyjne pokazały, że moc liryczna dochodzi + do maksimum, Trurl nieznacznie tylko drżącą ręką przerzucił wielki + wyłącznik i niemal natychmiast głosem lekko ochrypłym, lecz emanującym + dziwnie sugestywnym czarem, maszyna rzekła:

+ +

– Chrzęskrzyboczek pacionkociewiczarokrzysztofoniczmy.

+

– Czy to już wszystko? – spytał po dłuższej chwili niezwykle uprzejmy + Klapaucjusz.

+

(Stanisław Lem, „Cyberiada”, „Wyprawa pierwsza A, czyli Elektrybałt Trurla”)

+
+ + + +

Konkurs startuje 12 września 2011 roku – z okazji 90 rocznicy urodzin +Stanisława Lema. Termin nadsyłania prac upływa z końcem października 10 listopada 2011 roku. +Powinno być dość czasu na dopracowanie swoich pomysłów.

+ +

Konkurs będzie wyglądał następująco:

+ +
    +
  • Do końca października 10 listopada czekamy na zgłoszenia w postaci programów. + Warunkiem dopuszczalności jest udostępnienie kodu źródłowego na wolnej + licencji GNU AGPL + (jak to zrobić?). + Szerzej o tym, czym powinno być złoszenie – + w dziale Technikalia.
  • + +
  • Użycie wolnej licencji nie oznacza, że kod źródłowy musi być + od razu publicznie dostępny. Programy zostaną przez nas + upublicznione – ale dopiero po upłynięciu terminu nadsyłania zgłoszeń. + Uczestnik może oczywiście samodzielnie upublicznić swoje zgłoszenie + wcześniej – odradzamy to jednak ze względu na komplikacje w przypadku + plagiatu.
  • + +
  • Po uruchomieniu nadesłanych przez uczestników programów dla każdego + uczestnika wygenerujemy 20 wierszy, które odeślemy autorowi + programu. Wybierze on 3 z nich, które następnie zostaną + poddane ocenie jury. W składzie jury znajdą się zarówno osoby związane + z programowaniem, jak i przedstawiciele świata kultury.
  • + +
  • Główną nagrodą jest 16-tomowa kolekcja książek Stanisława Lema. + W ramach dodatkowej nagrody podczas zakończenia konkursu + odbędzie się próba odczytania zwycięskich wierszy na głos.
  • + +
+ +

Programy biorące udział w konkursie zostaną też uruchomione +na stronie Turnieju – +internauci będą więc mieli możliwość samodzielnego „wyklikania” sobie własnego +wiersza przy użyciu każdego z nich.

+ +

Powrót do strony głównej

+ +{% endblock %} diff --git a/turniej/templates/pages/rules.html b/turniej/templates/pages/rules.html new file mode 100644 index 0000000..8dce0f5 --- /dev/null +++ b/turniej/templates/pages/rules.html @@ -0,0 +1,74 @@ +{% extends "base.html" %} + +{% block "body" %} + + +

+ +Turniej Elektrybałtów

+

Konkurs automatycznej poezji

+ +
+

Ustaliwszy, w czym rzecz, zwierzchność żeglugi kosmicznej zwróciła się + oficjalnie do Trurla z żądaniem natychmiastowej likwidacji należącego doń + urządzenia, które zakłócało liryką spokój publiczny i zagrażało zdrowiu + pasażerów.

+ +

(Stanisław Lem, „Cyberiada”, „Wyprawa pierwsza A, czyli Elektrybałt Trurla”)

+
+ + + +

Regulamin konkursu

+ + + + +
    +
  • Organizatorem konkursu jest fundacja Nowoczesna Polska.
  • + +
  • Przedmiotem konkursu jest program komputerowy tworzący remiksy literackie + na podstawie utworów znajdujących się w bilbiotece internetowej Wolne Lektury. + Program biorący udział w konkursie musi być udostępniony na wolnej + licencji GNU AGPL + (jak to zrobić?).
  • + +
  • Konkurs trwa od 12 września do 31 października 10 listopada 2011 roku. + Konkurs ma charakter otwarty. Aby wziąć w nim udział udział, + należy wysłać gotowy program na adres + radoslaw.czajka@nowoczesnapolska.org.pl + + z klauzulą: + Zgłaszam się do konkursu „Turniej Elektrybałtów” i oświadczam, że + znam i akceptuję jego regulamin.
  • + +
  • Nagrodą główną jest 16-tomowa kolekcja dzieł Stanisława Lema. Nie ma + możliwości zamiany nagrody na jej równowartość pieniężną.
  • + +
  • Organizator może odwołać konkurs w każdym czasie, bez podawania + przyczyny. W takim przypadku uczestnikom konkursu nie przysługuje żadna + rekompensata. Uczestnicy zgłaszając swój udział w konkursie automatycznie + wyrażają zgodę na publikację ich twórczości w internecie oraz wyrażają + zgodę na wykorzystanie wizerunku w materiałach promocyjnych konkursu + oraz materiałach promocyjnych Fundacji Nowoczesna Polska.
  • + +
  • Organizator zastrzega sobie prawo do odrzucenia zgłoszenia programu, + którego działanie może zagrażać stabilności, responsywności albo bezpieczeństwu + serwera, a także takich, których poprawne uruchomienie okaże się niemożliwe + lub poważnie utrudnione.
  • + +
  • Organizator konkursu nie ponosi odpowiedzialności za wszelkie + roszczenia osób trzecich wynikające z tytułu wykorzystania materiałów + zgłoszonych przez uczestników konkursu jako własnych. Prace naruszające + prawa autorskie będą dyskwalifikowane.
  • + +
  • Organizator zatrzega sobie prawo wprowadzenia zmian w regulaminie + konkursu.
  • +
+ + + + +

Powrót do strony głównej

+ +{% endblock %} diff --git a/turniej/templates/pages/technical.html b/turniej/templates/pages/technical.html new file mode 100644 index 0000000..d236dcf --- /dev/null +++ b/turniej/templates/pages/technical.html @@ -0,0 +1,115 @@ +{% extends "base.html" %} + +{% block "body" %} + +

+ +Turniej Elektrybałtów

+

Konkurs automatycznej poezji

+ +
+

Gdy atoli, z lekka kulejąc, zbliżył się do maszyny, ta, + na widok obcęgów w jego dłoni i błysków desperacji w oku, buchnęła taką + namiętną liryką błagając o łaskę, że rozszlochany Trurl cisnął narzędzia + i wrócił do siebie, brnąc po kolana w nowych utworach elektroducha, które + sięgały mu do pół piersi, zaścielając szemrzącym oceanem papieru całą halę.

+ +

(Stanisław Lem, „Cyberiada”, „Wyprawa pierwsza A, czyli Elektrybałt Trurla”)

+
+ + + +

Wymogi wobec zgłaszanych programów

+ +
    +
  • Nie nakładamy ograniczeń na wybór języka programowania. Program + powinien dać się jednak uruchomić w środowisku GNU/Linux przy użyciu + wolnodostępnych narzędzi.
  • + +
  • Warunkiem dopuszczalności jest udostępnienie kodu źródłowego na wolnej + licencji GNU AGPL + + (jak to zrobić?) + Programy zostaną upublicznione – ale dopiero po upłynięciu terminu + nadsyłania zgłoszeń. Warunek ten oznacza w szczególności, że zgłoszenie + musi zawierać kod źródłowy. Nie wchodzą w grę żadne skompilowane, pośrednie, + zaciemnione wersje – kod powinien zostać udostępniony w takiej postaci, + nad jaką normalnie pracuje programista.
  • + +
  • Program przy tworzeniu wierszy musi w istotny sposób korzystać + z zasobów Wolnych Lektur. Elementy wynikowych tekstów nie mogą być + zaszyte w treści samego programu. Program nie może też korzystać + podczas pracy z innych źródeł informacji – musi być jasne, że program + naprawdę miksuje dostarczoną mu literaturę, a nie odtwarza nagraną + uprzednio taśmę. Nie jest wymagane korzystanie z wszystkich utworów – + program może miksować np. tylko poezję romantyczną albo tylko fragmenty + oznaczone wybranymi motywami literackimi.
  • + +
  • Generowanie wiersza nie powinno trwać więcej niż kilka sekund. + W ramach procesu instalacji programu dopuszczalne (i wskazane!) jest + natomiast uprzednie zgromadzenie niezbędnych informacji wynikających + z analizy tekstów źródłowych. Najlepiej więc dostarczyć dwa programy + (albo jeden z różnymi opcjami uruchomienia) – jeden pobierający utwory, + analizujący je i zapisujący efekty tej analizy, a drugi generujący + wiersze na podstawie zgromadzonej uprzednio informacji. Sądzimy, że + ok. 10MiB powinno wystarczyć każdemu + [sic!], + ale w razie potrzeby będziemy się starali być elastyczni.
  • + +
  • Program powinien wypisać wiersz na standardowe wyjście w postaci + czystego tekstu, najlepiej używając kodowania UTF-8 (czyli tego samego, + które jest używane w plikach źródłowych).
  • + +
  • Maksymalna długość wiersza wynosi 1000 znaków – dalsze znaki zostaną + odcięte. Poza tym ograniczeniem długość i forma wiersza pozostaje w gestii + autora i jego programu.
  • + +
  • Odrzucone zostana programy, które będą usiłowały w jakikolwiek + sposób zagrozić stabilności lub bezpieczeństwu serwera.
  • +
+ + +

W jaki sposób pobierać utwory?

+ +

Źródłowe utwory można pobierać na kilka sposobów:

+ + + +

Wszystkie pliki źródłowe są zapisane przy użyciu kodowania UTF-8.

+ +

Przykładowy program (napisany w Pythonie), obrazujący wykorzystanie +każdego z tych sposobów, można znaleźć +w naszym repozytorium na GitHubie. +Jest to po prostu Leśmianator – w wersji przygotowanej zgodnie z warunkami +turnieju.

+ + +

Gdzie wysyłać zgłoszenia?

+ +

Zgłoszenia, a także wszelkiego rodzaju pytania i wątpliwości prosimy kierować na adres +radoslaw.czajka@nowoczesnapolska.org.pl. +Prosimy też o dołączenie do każdego zgłoszenia klauzuli o treści: +Zgłaszam się do konkursu „Turniej Elektrybałtów” i oświadczam, że +znam i akceptuję jego regulamin. + +

+ + + + +

Powrót do strony głównej

+ + +{% endblock %} + diff --git a/turniej/urls.py b/turniej/urls.py new file mode 100644 index 0000000..2a2a2f1 --- /dev/null +++ b/turniej/urls.py @@ -0,0 +1,21 @@ +from django.conf.urls.defaults import patterns, include, url +from django.views.generic.simple import direct_to_template + +# from django.contrib import admin +# admin.autodiscover() + +urlpatterns = patterns('', + url(r'^$', 'turniej.views.home', name='main_page'), + + url(r'^regulamin/$', direct_to_template, {'template': 'pages/rules.html'}, + name='rules_page'), + url(r'^wiecej/$', direct_to_template, {'template': 'pages/more.html'}, + name='more_page'), + url(r'^technikalia/$', direct_to_template, {'template': 'pages/technical.html'}, + name='technical_page'), + + url(r'^poezja/', include('poetry.urls')), + + # url(r'^admin/doc/', include('django.contrib.admindocs.urls')), + # url(r'^admin/', include(admin.site.urls)), +) diff --git a/turniej/views.py b/turniej/views.py new file mode 100644 index 0000000..3fe0a87 --- /dev/null +++ b/turniej/views.py @@ -0,0 +1,6 @@ +from django.shortcuts import render +from poetry.models import Poem + +def home(request): + last = Poem.objects.all().order_by('-created_at')[:10] + return render(request, "home.html", locals()) -- 2.20.1