From 468c0d38fa0cf99abf9dbe6a2f388806ce51083c Mon Sep 17 00:00:00 2001 From: Matias Aguirre Date: Thu, 26 Jun 2008 14:36:58 +0000 Subject: [PATCH] Django site project. Apps installed: * Article This is a simple "article" application with ReST support. Instances could be marked as "main" and a templatetag retrieve them. * Blog Django blog application, needs a better integration yet. * Download Little application to manage "download" links * Link Little application to manage links (like those displayed on top and in the footer) --HG-- extra : convert_revision : svn%3Ab85faa78-f9eb-468e-a121-7cced6da292c%403 --- sites/scrapy.org/site/README | 4 + sites/scrapy.org/site/__init__.py | 0 sites/scrapy.org/site/apps/__init__.py | 0 .../scrapy.org/site/apps/article/__init__.py | 0 sites/scrapy.org/site/apps/article/models.py | 64 +++++++++++ .../apps/article/templatetags/__init__.py | 0 .../apps/article/templatetags/article_tags.py | 47 ++++++++ sites/scrapy.org/site/apps/article/urls.py | 9 ++ sites/scrapy.org/site/apps/article/views.py | 16 +++ sites/scrapy.org/site/apps/blog/__init__.py | 0 sites/scrapy.org/site/apps/blog/feeds.py | 14 +++ sites/scrapy.org/site/apps/blog/models.py | 25 +++++ .../site/apps/blog/templatetags/__init__.py | 0 .../apps/blog/templatetags/lastblogentry.py | 25 +++++ sites/scrapy.org/site/apps/blog/urls.py | 15 +++ .../scrapy.org/site/apps/download/__init__.py | 0 sites/scrapy.org/site/apps/download/models.py | 48 +++++++++ .../apps/download/templatetags/__init__.py | 0 .../download/templatetags/download_tags.py | 39 +++++++ sites/scrapy.org/site/apps/download/urls.py | 8 ++ sites/scrapy.org/site/apps/download/views.py | 10 ++ sites/scrapy.org/site/apps/link/__init__.py | 0 sites/scrapy.org/site/apps/link/models.py | 61 +++++++++++ .../site/apps/link/templatetags/__init__.py | 0 .../site/apps/link/templatetags/link_tags.py | 32 ++++++ sites/scrapy.org/site/apps/link/views.py | 1 + sites/scrapy.org/site/lib/__init__.py | 0 sites/scrapy.org/site/lib/templatetags.py | 8 ++ .../site/local_settings.py.template | 21 ++++ sites/scrapy.org/site/manage.py | 11 ++ sites/scrapy.org/site/settings.py | 101 ++++++++++++++++++ .../site/static/images/box-borders-bottom.gif | Bin 0 -> 84 bytes .../site/static/images/box-borders-bottom.png | Bin 0 -> 2852 bytes .../site/static/images/box-borders-top.png | Bin 0 -> 181 bytes .../site/static/images/footer-bg.jpg | Bin 0 -> 338 bytes .../site/static/images/icon-arrow.gif | Bin 0 -> 57 bytes .../site/static/images/icon-author.gif | Bin 0 -> 57 bytes sites/scrapy.org/site/static/images/logo.jpg | Bin 0 -> 12564 bytes .../scrapy.org/site/static/images/main-bg.jpg | Bin 0 -> 371 bytes sites/scrapy.org/site/static/style/style.css | 57 ++++++++++ sites/scrapy.org/site/templates/base.html | 33 ++++++ .../scrapy.org/site/templates/base_home.html | 75 +++++++++++++ .../site/templates/base_weblog.html | 6 ++ .../site/templates/blog/entry_archive.html | 15 +++ .../templates/blog/entry_archive_day.html | 16 +++ .../templates/blog/entry_archive_month.html | 16 +++ .../templates/blog/entry_archive_year.html | 15 +++ .../site/templates/blog/entry_detail.html | 34 ++++++ sites/scrapy.org/site/templates/home.html | 19 ++++ sites/scrapy.org/site/urls.py | 19 ++++ 50 files changed, 864 insertions(+) create mode 100644 sites/scrapy.org/site/README create mode 100644 sites/scrapy.org/site/__init__.py create mode 100644 sites/scrapy.org/site/apps/__init__.py create mode 100644 sites/scrapy.org/site/apps/article/__init__.py create mode 100644 sites/scrapy.org/site/apps/article/models.py create mode 100644 sites/scrapy.org/site/apps/article/templatetags/__init__.py create mode 100644 sites/scrapy.org/site/apps/article/templatetags/article_tags.py create mode 100644 sites/scrapy.org/site/apps/article/urls.py create mode 100644 sites/scrapy.org/site/apps/article/views.py create mode 100644 sites/scrapy.org/site/apps/blog/__init__.py create mode 100644 sites/scrapy.org/site/apps/blog/feeds.py create mode 100644 sites/scrapy.org/site/apps/blog/models.py create mode 100644 sites/scrapy.org/site/apps/blog/templatetags/__init__.py create mode 100644 sites/scrapy.org/site/apps/blog/templatetags/lastblogentry.py create mode 100644 sites/scrapy.org/site/apps/blog/urls.py create mode 100644 sites/scrapy.org/site/apps/download/__init__.py create mode 100644 sites/scrapy.org/site/apps/download/models.py create mode 100644 sites/scrapy.org/site/apps/download/templatetags/__init__.py create mode 100644 sites/scrapy.org/site/apps/download/templatetags/download_tags.py create mode 100644 sites/scrapy.org/site/apps/download/urls.py create mode 100644 sites/scrapy.org/site/apps/download/views.py create mode 100644 sites/scrapy.org/site/apps/link/__init__.py create mode 100644 sites/scrapy.org/site/apps/link/models.py create mode 100644 sites/scrapy.org/site/apps/link/templatetags/__init__.py create mode 100644 sites/scrapy.org/site/apps/link/templatetags/link_tags.py create mode 100644 sites/scrapy.org/site/apps/link/views.py create mode 100644 sites/scrapy.org/site/lib/__init__.py create mode 100644 sites/scrapy.org/site/lib/templatetags.py create mode 100644 sites/scrapy.org/site/local_settings.py.template create mode 100755 sites/scrapy.org/site/manage.py create mode 100644 sites/scrapy.org/site/settings.py create mode 100644 sites/scrapy.org/site/static/images/box-borders-bottom.gif create mode 100644 sites/scrapy.org/site/static/images/box-borders-bottom.png create mode 100644 sites/scrapy.org/site/static/images/box-borders-top.png create mode 100644 sites/scrapy.org/site/static/images/footer-bg.jpg create mode 100644 sites/scrapy.org/site/static/images/icon-arrow.gif create mode 100644 sites/scrapy.org/site/static/images/icon-author.gif create mode 100644 sites/scrapy.org/site/static/images/logo.jpg create mode 100644 sites/scrapy.org/site/static/images/main-bg.jpg create mode 100644 sites/scrapy.org/site/static/style/style.css create mode 100644 sites/scrapy.org/site/templates/base.html create mode 100644 sites/scrapy.org/site/templates/base_home.html create mode 100644 sites/scrapy.org/site/templates/base_weblog.html create mode 100644 sites/scrapy.org/site/templates/blog/entry_archive.html create mode 100644 sites/scrapy.org/site/templates/blog/entry_archive_day.html create mode 100644 sites/scrapy.org/site/templates/blog/entry_archive_month.html create mode 100644 sites/scrapy.org/site/templates/blog/entry_archive_year.html create mode 100644 sites/scrapy.org/site/templates/blog/entry_detail.html create mode 100644 sites/scrapy.org/site/templates/home.html create mode 100644 sites/scrapy.org/site/urls.py diff --git a/sites/scrapy.org/site/README b/sites/scrapy.org/site/README new file mode 100644 index 000000000..6299b8a2b --- /dev/null +++ b/sites/scrapy.org/site/README @@ -0,0 +1,4 @@ +Dependencies: + + * python docutils (python-docutils in debian) + Needed for ReST markup diff --git a/sites/scrapy.org/site/__init__.py b/sites/scrapy.org/site/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/__init__.py b/sites/scrapy.org/site/apps/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/article/__init__.py b/sites/scrapy.org/site/apps/article/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/article/models.py b/sites/scrapy.org/site/apps/article/models.py new file mode 100644 index 000000000..7f5c3b544 --- /dev/null +++ b/sites/scrapy.org/site/apps/article/models.py @@ -0,0 +1,64 @@ +from datetime import datetime + +from django.db import models +from django.template.defaultfilters import slugify +from django.utils.translation import ugettext_lazy as _ + + +REST_HELP_TEXT = _("""ReST markup language allowed + + Read more""") + +MAIN_HELP_TEXT = _("Useful to filter articles, like those public on homepage") + + +class Article(models.Model): + title = models.CharField(_("title"), max_length=256, core=True, + blank=False) + slug = models.SlugField(_("slug"), prepopulate_from=("title",), + editable=False) + text = models.TextField(_("text"), core=True, help_text=REST_HELP_TEXT) + main = models.BooleanField(_("main"), core=True, blank=False, + default=False, help_text=MAIN_HELP_TEXT) + order = models.IntegerField(_("order"), core=True, blank=False, default=0) + + + # automatic dates + created = models.DateTimeField(core=True, editable=False) + updated = models.DateTimeField(core=True, editable=False) + + + def order_up(self): + self.order += 1 + self.save() + + def order_down(self): + self.order -= 1 + self.save() + + def save(self): + if not self.id: + self.created = datetime.now() + self.updated = datetime.now() + self.slug = slugify(self.title) + super(Article, self).save() + + def __unicode__(self): + return self.title + + # ugly, but django-admin isn't very versatile right now + def order_link(self): + return _("%(order)s (Up" \ + " | Down)") % \ + { "order": self.order, "id": self.id } + order_link.short_description = u"order" + order_link.allow_tags = True + + class Admin: + list_display = ("title", "main", "order_link", "updated") + list_filter = ("main", "created") + + class Meta: + verbose_name = _("article") + verbose_name_plural = _("articles") + ordering = [ "-order", ] diff --git a/sites/scrapy.org/site/apps/article/templatetags/__init__.py b/sites/scrapy.org/site/apps/article/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/article/templatetags/article_tags.py b/sites/scrapy.org/site/apps/article/templatetags/article_tags.py new file mode 100644 index 000000000..9f10635fe --- /dev/null +++ b/sites/scrapy.org/site/apps/article/templatetags/article_tags.py @@ -0,0 +1,47 @@ +from django import template + +from lib.templatetags import * + +from article.models import Article + + +register = template.Library() + + +@register.tag(name="load_main_articles") +def do_load_main_articles(parser, token): + return do_load(parser, token, True) + + +@register.tag(name="load_last_articles") +def do_load_last_articles(parser, token): + return do_load(parser, token) + + +def do_load(parser, token, only_main=False): + syntax_msg = 'Syntax: %s "COUNT" as "VAR_NAME"' + + try: + tag, count, _as, var_name = token.split_contents() + + if not is_string(count) or not is_string(var_name): + raise_syntax(syntax_msg % tag) + count = int(unquoute(count)) + except: + raise_syntax(syntax_msg % token.split_contents()[0]) + return LoadArticlesNode(count, unquoute(var_name), only_main) + + +class LoadArticlesNode(template.Node): + def __init__(self, count, var_name, only_main=False): + self.only_main = only_main + self.count = count + self.var_name = var_name + + def render(self, context): + articles = Article.objects.all() + if self.only_main: + articles = articles.filter(main=True) + + context[self.var_name] = articles[:self.count] + return '' diff --git a/sites/scrapy.org/site/apps/article/urls.py b/sites/scrapy.org/site/apps/article/urls.py new file mode 100644 index 000000000..6f6e569b5 --- /dev/null +++ b/sites/scrapy.org/site/apps/article/urls.py @@ -0,0 +1,9 @@ +from django.conf.urls.defaults import * + +from article.views import * + + +urlpatterns = patterns('', + (r"^(?P\d+)/order/up/$", order_up), + (r"^(?P\d+)/order/down/$", order_down), +) diff --git a/sites/scrapy.org/site/apps/article/views.py b/sites/scrapy.org/site/apps/article/views.py new file mode 100644 index 000000000..a40a1ff52 --- /dev/null +++ b/sites/scrapy.org/site/apps/article/views.py @@ -0,0 +1,16 @@ +from django.shortcuts import get_object_or_404 +from django.http import HttpResponseRedirect + +from article.models import Article + + +def order_up(request, article_id): + article = get_object_or_404(Article, pk=article_id) + article.order_up() + return HttpResponseRedirect("/admin/article/article/") + + +def order_down(request, article_id): + article = get_object_or_404(Article, pk=article_id) + article.order_down() + return HttpResponseRedirect("/admin/article/article/") diff --git a/sites/scrapy.org/site/apps/blog/__init__.py b/sites/scrapy.org/site/apps/blog/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/blog/feeds.py b/sites/scrapy.org/site/apps/blog/feeds.py new file mode 100644 index 000000000..4f5588412 --- /dev/null +++ b/sites/scrapy.org/site/apps/blog/feeds.py @@ -0,0 +1,14 @@ +from django.contrib.syndication.feeds import Feed +from django_website.apps.blog.models import Entry +import datetime + +class WeblogEntryFeed(Feed): + title = "The Django weblog" + link = "http://www.djangoproject.com/weblog/" + description = "Latest news about Django, the Python Web framework." + + def items(self): + return Entry.objects.filter(pub_date__lte=datetime.datetime.now())[:10] + + def item_pubdate(self, item): + return item.pub_date diff --git a/sites/scrapy.org/site/apps/blog/models.py b/sites/scrapy.org/site/apps/blog/models.py new file mode 100644 index 000000000..6fa253f4c --- /dev/null +++ b/sites/scrapy.org/site/apps/blog/models.py @@ -0,0 +1,25 @@ +import datetime +from django.db import models + + +class Entry(models.Model): + pub_date = models.DateTimeField() + slug = models.SlugField(unique_for_date='pub_date') + headline = models.CharField(max_length=200) + summary = models.TextField(help_text="Use raw HTML.") + body = models.TextField(help_text="Use raw HTML.") + author = models.CharField(max_length=100) + + class Meta: + verbose_name_plural = 'entries' + ordering = ('-pub_date',) + get_latest_by = 'pub_date' + + class Admin: + list_display = ('pub_date', 'headline', 'author') + + def __unicode__(self): + return self.headline + + def get_absolute_url(self): + return "/weblog/%s/%s/" % (self.pub_date.strftime("%Y/%b/%d").lower(), self.slug) diff --git a/sites/scrapy.org/site/apps/blog/templatetags/__init__.py b/sites/scrapy.org/site/apps/blog/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/blog/templatetags/lastblogentry.py b/sites/scrapy.org/site/apps/blog/templatetags/lastblogentry.py new file mode 100644 index 000000000..eae876866 --- /dev/null +++ b/sites/scrapy.org/site/apps/blog/templatetags/lastblogentry.py @@ -0,0 +1,25 @@ +from django import template +from django_website.apps.blog.models import Entry +import datetime + +class LatestBlogEntriesNode(template.Node): + def __init__(self, num, varname): + self.num, self.varname = num, varname + + def render(self, context): + context[self.varname] = list(Entry.objects.filter(pub_date__lte=datetime.datetime.now())[:self.num]) + return '' + +def do_get_latest_blog_entries(parser, token): + """ + {% get_latest_blog_entries 2 as latest_entries %} + """ + bits = token.contents.split() + if len(bits) != 4: + raise template.TemplateSyntaxError, "'%s' tag takes three arguments" % bits[0] + if bits[2] != 'as': + raise template.TemplateSyntaxError, "First argument to '%s' tag must be 'as'" % bits[0] + return LatestBlogEntriesNode(bits[1], bits[3]) + +register = template.Library() +register.tag('get_latest_blog_entries', do_get_latest_blog_entries) diff --git a/sites/scrapy.org/site/apps/blog/urls.py b/sites/scrapy.org/site/apps/blog/urls.py new file mode 100644 index 000000000..e76f67616 --- /dev/null +++ b/sites/scrapy.org/site/apps/blog/urls.py @@ -0,0 +1,15 @@ +from django.conf.urls.defaults import * +from models import Entry # relative import + +info_dict = { + 'queryset': Entry.objects.all(), + 'date_field': 'pub_date', +} + +urlpatterns = patterns('django.views.generic.date_based', + (r'^(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/(?P[\w-]+)/$', 'object_detail', dict(info_dict, slug_field='slug')), + (r'^(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/$', 'archive_day', info_dict), + (r'^(?P\d{4})/(?P[a-z]{3})/$', 'archive_month', info_dict), + (r'^(?P\d{4})/$', 'archive_year', info_dict), + (r'^/?$', 'archive_index', info_dict), +) diff --git a/sites/scrapy.org/site/apps/download/__init__.py b/sites/scrapy.org/site/apps/download/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/download/models.py b/sites/scrapy.org/site/apps/download/models.py new file mode 100644 index 000000000..97102eb9b --- /dev/null +++ b/sites/scrapy.org/site/apps/download/models.py @@ -0,0 +1,48 @@ +from datetime import datetime + +from django.db import models +from django.utils.translation import ugettext_lazy as _ + + +class DownloadLink(models.Model): + description = models.CharField(_("description"), max_length=512, + blank=True, default='') + address = models.CharField(_("address"), max_length=1024, blank=False) + text = models.CharField(_("link text"), max_length=512, blank=False, + default=_("download")) + public = models.BooleanField(_("public"), core=True, blank=False, + default=True) + + # automatic dates + created = models.DateTimeField(_("created"), core=True, editable=False) + updated = models.DateTimeField(_("updated"), core=True, editable=False) + + def toggle_public(self): + self.public = not self.public + self.save() + + def save(self): + if not self.id: + self.created = datetime.now() + self.updated = datetime.now() + super(DownloadLink, self).save() + + def __unicode__(self): + return self.address + + # ugly, but django-admin isn't very versatile right now + def public_link(self): + return _("%(status)s (toggle)") % \ + { 'status': self.public and _("Yes") or _("No"), + 'id': self.id } + public_link.short_description = u"public" + public_link.allow_tags = True + + class Admin: + list_display = ("text", "address", "public_link", "created") + list_filter = ("public", "created") + + class Meta: + verbose_name = _("download link") + verbose_name_plural = _("download links") + ordering = ["-created",] diff --git a/sites/scrapy.org/site/apps/download/templatetags/__init__.py b/sites/scrapy.org/site/apps/download/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/download/templatetags/download_tags.py b/sites/scrapy.org/site/apps/download/templatetags/download_tags.py new file mode 100644 index 000000000..186a240ca --- /dev/null +++ b/sites/scrapy.org/site/apps/download/templatetags/download_tags.py @@ -0,0 +1,39 @@ +from django import template + +from lib.templatetags import * + +from download.models import DownloadLink + + +register = template.Library() + + +@register.tag(name="load_download_links") +def do_load_links(parser, token): + syntax_msg = 'Syntax: %s "COUNT" as "VAR_NAME"' + + try: + splited = token.split_contents() + if len(splited) == 4: + tag, count, _as, var_name = splited + elif len(splited) == 3: + tag, _as, var_name = splited + count = None + + if count and not is_string(count) or not is_string(var_name): + raise_syntax(syntax_msg % tag) + count = count and int(unquoute(count)) or count + except: + raise_syntax(syntax_msg % token.split_contents()[0]) + return LoadLinksNode(count, unquoute(var_name)) + + +class LoadLinksNode(template.Node): + def __init__(self, count, var_name): + self.count = count + self.var_name = var_name + + def render(self, context): + links = DownloadLink.objects.filter(public=True)[:self.count] + context[self.var_name] = links + return '' diff --git a/sites/scrapy.org/site/apps/download/urls.py b/sites/scrapy.org/site/apps/download/urls.py new file mode 100644 index 000000000..731949828 --- /dev/null +++ b/sites/scrapy.org/site/apps/download/urls.py @@ -0,0 +1,8 @@ +from django.conf.urls.defaults import * + +from download.views import * + + +urlpatterns = patterns('', + (r"^(?P\d+)/public/toggle/$", toggle_public), +) diff --git a/sites/scrapy.org/site/apps/download/views.py b/sites/scrapy.org/site/apps/download/views.py new file mode 100644 index 000000000..ea16faaa4 --- /dev/null +++ b/sites/scrapy.org/site/apps/download/views.py @@ -0,0 +1,10 @@ +from django.shortcuts import get_object_or_404 +from django.http import HttpResponseRedirect + +from download.models import DownloadLink + + +def toggle_public(request, link_id): + link = get_object_or_404(DownloadLink, pk=link_id) + link.toggle_public() + return HttpResponseRedirect("/admin/download/downloadlink/") diff --git a/sites/scrapy.org/site/apps/link/__init__.py b/sites/scrapy.org/site/apps/link/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/link/models.py b/sites/scrapy.org/site/apps/link/models.py new file mode 100644 index 000000000..747992185 --- /dev/null +++ b/sites/scrapy.org/site/apps/link/models.py @@ -0,0 +1,61 @@ +from datetime import datetime + +from django.db import models +from django.template.defaultfilters import slugify +from django.utils.translation import ugettext_lazy as _ + + +class Group(models.Model): + name = models.CharField(_("name"), max_length=64, core=True, blank=False) + slug = models.SlugField(_("slug"), editable=False, unique=True, + prepopulate_from=("name",)) + + # automatic dates + created = models.DateTimeField(_("created"), core=True, editable=False) + updated = models.DateTimeField(_("updated"), core=True, editable=False) + + def save(self): + if not self.id: + self.created = datetime.now() + self.updated = datetime.now() + self.slug = slugify(self.name) + super(Group, self).save() + + def __unicode__(self): + return self.name + + class Meta: + verbose_name = _("group") + verbose_name_plural = _("groups") + + class Admin: + list_display = ("name", "slug",) + + +class Link(models.Model): + text = models.CharField(_("text"), max_length=1024, core=True, blank=False) + address = models.CharField(_("address"), max_length=1024, core=True, + blank=False) + group = models.ManyToManyField(Group, verbose_name=_("group"), blank=True, + null=False) + + # automatic dates + created = models.DateTimeField(core=True, editable=False) + updated = models.DateTimeField(core=True, editable=False) + + def save(self): + if not self.id: + self.created = datetime.now() + self.updated = datetime.now() + super(Link, self).save() + + def __unicode__(self): + return self.address + + class Meta: + verbose_name = _("link") + verbose_name_plural = _("links") + + class Admin: + list_display = ("text", "address",) + list_filter = ("group", ) diff --git a/sites/scrapy.org/site/apps/link/templatetags/__init__.py b/sites/scrapy.org/site/apps/link/templatetags/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/apps/link/templatetags/link_tags.py b/sites/scrapy.org/site/apps/link/templatetags/link_tags.py new file mode 100644 index 000000000..c8e89d6ea --- /dev/null +++ b/sites/scrapy.org/site/apps/link/templatetags/link_tags.py @@ -0,0 +1,32 @@ +from django import template + +from lib.templatetags import * + +from link.models import Group + + +register = template.Library() + + +@register.tag(name="load_links") +def do_load_links(parser, token): + syntax_msg = 'Template tag syntax: load_links "SLUG_NAME" as "VAR_NAME"' + + try: + tag, slug, _as, var_name = token.split_contents() + if not is_string(slug) or not is_string(var_name): + raise_syntax(syntax_msg) + except: + raise_syntax(syntax_msg) + return LoadLinksNode(unquoute(slug), unquoute(var_name)) + + +class LoadLinksNode(template.Node): + def __init__(self, slug, var_name): + self.slug = slug + self.var_name = var_name + + def render(self, context): + group = Group.objects.get(slug=self.slug) + context[self.var_name] = group and group.link_set.all() or [] + return '' diff --git a/sites/scrapy.org/site/apps/link/views.py b/sites/scrapy.org/site/apps/link/views.py new file mode 100644 index 000000000..60f00ef0e --- /dev/null +++ b/sites/scrapy.org/site/apps/link/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/sites/scrapy.org/site/lib/__init__.py b/sites/scrapy.org/site/lib/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/sites/scrapy.org/site/lib/templatetags.py b/sites/scrapy.org/site/lib/templatetags.py new file mode 100644 index 000000000..c664b913f --- /dev/null +++ b/sites/scrapy.org/site/lib/templatetags.py @@ -0,0 +1,8 @@ +from django import template + + +is_string = lambda val: val[0] in ("'", '"') and val[0] == val[-1] +unquoute = lambda val: val[1:-1] + +def raise_syntax(msg): + raise template.TemplateSyntaxError, msg diff --git a/sites/scrapy.org/site/local_settings.py.template b/sites/scrapy.org/site/local_settings.py.template new file mode 100644 index 000000000..0991096c9 --- /dev/null +++ b/sites/scrapy.org/site/local_settings.py.template @@ -0,0 +1,21 @@ +import os + + +DATABASE_ENGINE = '' # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'. +DATABASE_NAME = '' # Or path to database file if using sqlite3. +DATABASE_USER = '' # Not used with sqlite3. +DATABASE_PASSWORD = '' # Not used with sqlite3. +DATABASE_HOST = '' # Set to empty string for localhost. Not used with sqlite3. +DATABASE_PORT = '' # Set to empty string for default. Not used with sqlite3. + +SITE_URL = '' + +SITE_MEDIA = os.path.join(os.path.dirname(__file__), 'static') + +EMAIL_HOST = '' +EMAIL_HOST_USER = '' +EMAIL_HOST_PASSWORD = '' + +MOBILE = False + +PRODUCTION = False diff --git a/sites/scrapy.org/site/manage.py b/sites/scrapy.org/site/manage.py new file mode 100755 index 000000000..5e78ea979 --- /dev/null +++ b/sites/scrapy.org/site/manage.py @@ -0,0 +1,11 @@ +#!/usr/bin/env python +from django.core.management import execute_manager +try: + import 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(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.exit(1) + +if __name__ == "__main__": + execute_manager(settings) diff --git a/sites/scrapy.org/site/settings.py b/sites/scrapy.org/site/settings.py new file mode 100644 index 000000000..a5386393b --- /dev/null +++ b/sites/scrapy.org/site/settings.py @@ -0,0 +1,101 @@ +# -*- coding: utf-8 -*- +# Django settings for scrapy project. + +from os.path import abspath, dirname, basename, join +import sys + +PROJECT_ABSOLUTE_DIR = dirname(abspath(__file__)) +PROJECT_NAME = basename(PROJECT_ABSOLUTE_DIR) + +ADMINS = ( + # ('Your Name', 'your_email@domain.com'), +) + +MANAGERS = ADMINS + +DEFAULT_CHARSET = "utf-8" + +# 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 avilable on all operating systems. +# If running in a Windows environment this must be set to the same as your +# system time zone. +TIME_ZONE = 'America/Montevideo' + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = 'en-us' + +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 + +# Absolute path to the directory that holds media. +# Example: "/home/media/media.lawrence.com/" +MEDIA_ROOT = join(PROJECT_ABSOLUTE_DIR, "static") + +# URL that handles the media served from MEDIA_ROOT. Make sure to use a +# trailing slash if there is a path component (optional in other cases). +# Examples: "http://media.lawrence.com", "http://example.com/media/" +MEDIA_URL = '/site-media' + +# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a +# trailing slash. +# Examples: "http://foo.com/media/", "/media/". +ADMIN_MEDIA_PREFIX = '/media/' + +# Make this unique, and don't share it with anybody. +SECRET_KEY = 'fq04ss$#1h=m=39sh4vvph+76i5u716z1-x5$$9xn7sb6y4-di' + +# List of callables that know how to import templates from various sources. +TEMPLATE_LOADERS = ( + 'django.template.loaders.filesystem.load_template_source', + 'django.template.loaders.app_directories.load_template_source', +# 'django.template.loaders.eggs.load_template_source', +) + +MIDDLEWARE_CLASSES = ( + 'django.middleware.common.CommonMiddleware', + 'django.contrib.sessions.middleware.SessionMiddleware', + 'django.contrib.auth.middleware.AuthenticationMiddleware', + 'django.middleware.doc.XViewMiddleware', + #'%s.middleware.threadlocals.ThreadLocals' % PROJECT_NAME, + 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware', +) + +ROOT_URLCONF = '%s.urls' % PROJECT_NAME + +TEMPLATE_DIRS = ( + join(PROJECT_ABSOLUTE_DIR, "templates"), +) + +INSTALLED_APPS = ( + 'django.contrib.auth', + 'django.contrib.contenttypes', + 'django.contrib.sessions', + 'django.contrib.sites', + 'django.contrib.admin', + 'django.contrib.markup', + 'django.contrib.flatpages', + 'link', + 'article', + 'download', + 'blog', +) + +# Add apps/ dir to python path. +sys.path.append(join(PROJECT_ABSOLUTE_DIR, "apps")) + +# Override previous settings with values in local_settings.py settings file. +try: + from local_settings import * +except ImportError: + debug_msg ="Can't find local_settings.py, using default settings." + try: + from mod_python import apache + apache.log_error("%s" % debug_msg, apache.APLOG_NOTICE) + except ImportError: + import sys + sys.stderr.write("%s\n" % debug_msg) diff --git a/sites/scrapy.org/site/static/images/box-borders-bottom.gif b/sites/scrapy.org/site/static/images/box-borders-bottom.gif new file mode 100644 index 0000000000000000000000000000000000000000..721647129ef46498b44ada18d45966e043b5c4d5 GIT binary patch literal 84 zcmZ?wbhEHb6k=p$XkcXc4+e@qSr{1@7#VaJfB+=Jz@**Nzw-23{>5{)-0I$ZF5x$S j+ar%@$`@w7I<@T`_aaT7>)(3gH_iF}k6-647lSnb8(bq$ literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/site/static/images/box-borders-bottom.png b/sites/scrapy.org/site/static/images/box-borders-bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..4cb0dea01561de15aee87243e36ef5484b0c0535 GIT binary patch literal 2852 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 V^){cqP!ys*w``CHf-e)GYk*Yt_@F( zf5UpFm82OY=*7$=FhVSpo^T8z(j)(1lc{P;g7M`)2UOeAZqp@_-Vs^*g#}$a&o36s dI~i~8@4U?S?4*9^?LH2-?hpF6qw8*Z`v!atEm!~m literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/site/static/images/icon-arrow.gif b/sites/scrapy.org/site/static/images/icon-arrow.gif new file mode 100644 index 0000000000000000000000000000000000000000..6326f028753a186421f7e104c7a1d8e98d22dce2 GIT binary patch literal 57 zcmZ?wbhEHbWM|-JXkcL2u5TYLD5&_8g#iR~KmS literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/site/static/images/icon-author.gif b/sites/scrapy.org/site/static/images/icon-author.gif new file mode 100644 index 0000000000000000000000000000000000000000..d72d4847f0b06c8ef9bc3de1c900ee3df80f67d7 GIT binary patch literal 57 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�*;KMH%zO69dmi|d4i2<5aAW(o5dWovu6XO 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 literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/site/static/images/main-bg.jpg b/sites/scrapy.org/site/static/images/main-bg.jpg new file mode 100644 index 0000000000000000000000000000000000000000..523edba791d403229da1c0adf0889dba8f6f5698 GIT binary patch literal 371 zcmY+8zb^zq6vw}B-^`fXY&JW4SE)oqp;XWj!X}6E5{V9b8ih)sm8&EKA)>khg+@=~ z3b}?qz>mfsa8WBHV`j-F`+1Xjlh1oE^X#krM6#4MGf)8JE?@^R3%i@!dmsn^%T9eE zp38SO+Q@s(ko`ah9C+N#l9{Cx%t9*ZQCbZ-l-9K{3~M?nh&@ROu@FkBNb4w#qd0B& zO2ZU&^OutURL)c$wg;o}2xc+}46z~mgjJBkZCN6~x^P@7AONvciT9P}dP?i2s@#;Z z?}(V(FKjT2!R5pB)%DB%`Aq%jVl-?W$cZ-Y&%)Nv$jwUU_V{En-I~va``_bJ&x?0! N{ln(iX>q#t?HB9KIjR5v literal 0 HcmV?d00001 diff --git a/sites/scrapy.org/site/static/style/style.css b/sites/scrapy.org/site/static/style/style.css new file mode 100644 index 000000000..70f3c5317 --- /dev/null +++ b/sites/scrapy.org/site/static/style/style.css @@ -0,0 +1,57 @@ +/* Scrapy.org style sheet *******************************/ + +/* main elements */ + +body { margin:0; padding:0; background:url('/site-media/images/main-bg.jpg') repeat-x left top ; font-family:"Lucida Sans", Verdana, Helvetica, sans-serif; font-size:small; color:#333; background-color:#FFF; } +a { color:#6e0909; text-decoration:none; border-bottom:1px solid #d78888;} +a:hover { color:#f99800; border-bottom:1px solid #f7b7b7; } +.clear { clear:both; overflow:hidden; } +h1 { background:url('/site-media/images/logo.jpg') no-repeat left top ; text-indent: -5000px; width:545px; height:65px } +h2 { font-size:200%; color:#331f0a; margin:0.6em 0pt; font-weight:normal;} +blockquote { padding:0px 15px; color:#5b1111; font-size:125%; margin:0;} +p { line-height:1.5em; } + +/* structure */ +#container { width:820px; margin:42px auto 0; } +#content { clear:left; margin-top:10px; } +#left-column { float:left; width:525px; margin-right:20px} +#right-column { float:left; width:274px; margin-top:25px} + +ul#navigation { list-style-type:none; margin:0 0 18px -12px; padding:0;} +ul#navigation li { float:left; padding:0 10px; font-size:130%; border-right:1px solid #e57919; } +ul#navigation li a { text-decoration:none; border-bottom:1px solid #ffca9b; color:#e57919;} +ul#navigation li a:hover { color:#c35012; border-bottom:1px solid #ef994c} + +.box { margin-bottom:15px; background:url('/site-media/images/box-borders-bottom.gif') no-repeat left bottom #4d271c; padding-bottom:5px; } +.box.download {background-color:#5b1111; } +.box.download p { color:#d18c59; } +.box.download a.download { color:#d18c59; background:url('/site-media/images/icon-arrow.gif') no-repeat 2px 2px; padding-left:15px; border-bottom:1px solid #a0595d } +.box.download a:hover.download { color:#FFF;} + +.box h3 { padding:10px 10px 0; font-weight:normal; font-size:160%; margin:0.3em 0pt; color:#ffebd2; background:url('/site-media/images/box-borders-top.png') no-repeat left top ;} +.box p { padding:0 10px; font-size:90%; line-height:1.2em} + +.box .post { color:#FFF; margin:0pt 13px 5px; +padding:0pt 0px 5px; border-bottom:4px solid #462217;} +.box .post.last { border-bottom:none; } +.box .post p.abstract { padding:0; margin:0; font-size:0.8em; height:1%; line-height:1.3em} +.box .post p.author { color:#ffbc97; padding:0 0 0 15px; margin:5px 0px; font-size:0.8em; background:url('/site-media/images/icon-author.gif') no-repeat 2px 3px;} +.box .post p.author a { color:#FFF; border-bottom:none } +.box .post h4 { display:inline;font-size:1em; font-weight:bold; } +.box .post h4 a {color:#ffe114; border-bottom:1px solid #957020; font-size:0.9em} +.box .post a.more { font-size:0.8em; color:#ffe114; border-bottom:none;} +.box .post a:hover.more { color:#FFF;} + +#footer { margin:45px auto 0; text-align:center; color:#FFF; padding:15px 10px ; background:url('/site-media/images/footer-bg.jpg') repeat-x left top #5b2a16; border-top:1px solid #b5331a;} +#footer ul { list-style-type:none; width:41%; margin:0 auto; padding-left:75px; } +#footer ul li { float:left; padding:0 10px; font-size:110%; border-right:1px solid #b2c0c9; } +ul li.last { border-right:none !important;} +#footer li a { text-decoration:none; border-bottom:1px solid #884a2b; color:#FFF;} +#footer li a:hover, #footer p a:hover { color:#ffe114; } +#footer p {line-height:1.1em; font-size:90%;} +#footer p a { color:#fff; } + + + + + diff --git a/sites/scrapy.org/site/templates/base.html b/sites/scrapy.org/site/templates/base.html new file mode 100644 index 000000000..c51b04f93 --- /dev/null +++ b/sites/scrapy.org/site/templates/base.html @@ -0,0 +1,33 @@ + + + + {% block title %}Scrapy.org. Scraping framework{% endblock %} + + + {% block extrastyles %}{% endblock %} + + + + {% block extrascripts %}{% endblock %} + + +
+ {% block content %}{% endblock %} +
+ +
+ + + + diff --git a/sites/scrapy.org/site/templates/base_home.html b/sites/scrapy.org/site/templates/base_home.html new file mode 100644 index 000000000..28ad220a2 --- /dev/null +++ b/sites/scrapy.org/site/templates/base_home.html @@ -0,0 +1,75 @@ +{% extends "base.html" %} + +{% block content %} +

Scrapy - an opensource screen scraping framework for python

+ +{% load link_tags %} +{% load_links "nav-links" as "nav_links" %} + +{% if nav_links %} + +{% endif %} + +
+ +
+
+ {% block main-content %}{% endblock %} +
+ +
+ {% load download_tags %} + {% load_download_links as "download_links" %} + + {% if download_links %} +
+

Download Scrapy

+ + {% for link in download_links %} +

{{ link.description }} {{ link.text }}

+ {% endfor %} +
+ {% endif %} + +
+

Scrapy Weblog

+ +
+

post title

+

by Molvo on May 14, 2008

+

+ Nullam ullamcorper, sem quis interdum imperdiet, velit leo convallis ante, eget fringilla lacus + interdum imperdiet, velit leo convallis ante, eget fringilla... +

+ » Read More +
+ +
+

post title

+

by Molvo on May 14, 2008

+

+ Nullam ullamcorper, sem quis interdum imperdiet, velit leo convallis ante, eget fringilla lacus + interdum imperdiet, velit leo convallis ante, eget fringilla... +

+ » Read More +
+
+
+
+{% endblock %} + +{% block footer %} + {% load_links "footer-links" as "footer_links" %} + {% if footer_links %} +
    +
  • Scrapy :
  • + {% for link in footer_links %} + {{ link.text }} + {% endfor %} +
+ {% endif %} +{% endblock %} diff --git a/sites/scrapy.org/site/templates/base_weblog.html b/sites/scrapy.org/site/templates/base_weblog.html new file mode 100644 index 000000000..d03d640ff --- /dev/null +++ b/sites/scrapy.org/site/templates/base_weblog.html @@ -0,0 +1,6 @@ +{% extends "base_home.html" %} + +{% block title %}{{ block.super }} - Weblog{% endblock %} + +{% block main-content %} +{% endblock %} diff --git a/sites/scrapy.org/site/templates/blog/entry_archive.html b/sites/scrapy.org/site/templates/blog/entry_archive.html new file mode 100644 index 000000000..4adeff722 --- /dev/null +++ b/sites/scrapy.org/site/templates/blog/entry_archive.html @@ -0,0 +1,15 @@ +{% extends "base_weblog.html" %} + +{% block main-content %} + +{% load comments comment_utils %} + +

Latest entries

+ +{% for object in latest %} +

{{ object.headline }}

+ {{ object.body }} +

Posted by {{ object.author }} on {{ object.pub_date|date:"F j, Y" }}

+{% endfor %} + +{% endblock %} diff --git a/sites/scrapy.org/site/templates/blog/entry_archive_day.html b/sites/scrapy.org/site/templates/blog/entry_archive_day.html new file mode 100644 index 000000000..5d7ada069 --- /dev/null +++ b/sites/scrapy.org/site/templates/blog/entry_archive_day.html @@ -0,0 +1,16 @@ +{% extends "base_weblog.html" %} + +{% block title %}Weblog | {{ day|date:"F j" }}{% endblock %} + +{% block main-content %} + +

{{ day|date:"F j" }} archive

+ +{% for object in object_list %} +

{{ object.headline }}

+

{{ object.pub_date|date:"F j, Y" }}

+{{ object.body }} + +{% endfor %} + +{% endblock %} diff --git a/sites/scrapy.org/site/templates/blog/entry_archive_month.html b/sites/scrapy.org/site/templates/blog/entry_archive_month.html new file mode 100644 index 000000000..388ce67eb --- /dev/null +++ b/sites/scrapy.org/site/templates/blog/entry_archive_month.html @@ -0,0 +1,16 @@ +{% extends "base_weblog.html" %} + +{% block title %}Weblog | {{ month|date:"F" }}{% endblock %} + +{% block main-content %} + +

{{ month|date:"F" }} archive

+ +{% for object in object_list %} +

{{ object.headline }}

+

{{ object.pub_date|date:"F j, Y" }}

+{{ object.body }} + +{% endfor %} + +{% endblock %} diff --git a/sites/scrapy.org/site/templates/blog/entry_archive_year.html b/sites/scrapy.org/site/templates/blog/entry_archive_year.html new file mode 100644 index 000000000..d58ff781a --- /dev/null +++ b/sites/scrapy.org/site/templates/blog/entry_archive_year.html @@ -0,0 +1,15 @@ +{% extends "base_weblog.html" %} + +{% block title %}Weblog | {{ year }}{% endblock %} + +{% block main-content %} + +

{{ year }} archive

+ + + +{% endblock %} diff --git a/sites/scrapy.org/site/templates/blog/entry_detail.html b/sites/scrapy.org/site/templates/blog/entry_detail.html new file mode 100644 index 000000000..99ca4694e --- /dev/null +++ b/sites/scrapy.org/site/templates/blog/entry_detail.html @@ -0,0 +1,34 @@ +{% extends "base_weblog.html" %} + +{% block title %}Weblog | {{ object.headline|escape }}{% endblock %} + +{% block main-content %} + +

{{ object.headline }}

+{{ object.body }} +

Posted by {{ object.author }} on {{ object.pub_date|date:"F j, Y" }}

+ +{% comment %} +{% load comments comment_utils %} +{% get_public_free_comment_list for blog.entry object.id as comment_list %} + +
+

Comments

+ +{% for comment in comment_list %} +
+

{{ comment.person_name|escape }} {{ comment.submit_date|date:"F j, Y" }} at {{ comment.submit_date|date:"P" }}

+ {{ comment.comment|escape|urlizetrunc:"40"|linebreaks }} +
+{% endfor %} + +{% if object.comments_enabled %} +

Post a comment

+{% free_comment_form for blog.entry object.id %} +{% else %} +

Comments are closed

+

To prevent spam, comments are no longer allowed after sixty days.

+{% endif %} +
+{% endcomment %} +{% endblock %} diff --git a/sites/scrapy.org/site/templates/home.html b/sites/scrapy.org/site/templates/home.html new file mode 100644 index 000000000..d28031f4b --- /dev/null +++ b/sites/scrapy.org/site/templates/home.html @@ -0,0 +1,19 @@ +{% extends "base_home.html" %} + +{% block content %} + {% block main-content %} + {% load markup %} + {% load article_tags %} + + {% load_main_articles "2" as "articles" %} + {% if not articles %} + {% load_last_articles "2" as "articles" %} + {% endif %} + + {% for article in articles %} +

{{ article.title }}

+ + {{ article.text|restructuredtext }} + {% endfor %} + {% endblock %} +{% endblock %} diff --git a/sites/scrapy.org/site/urls.py b/sites/scrapy.org/site/urls.py new file mode 100644 index 000000000..70f0ecfb5 --- /dev/null +++ b/sites/scrapy.org/site/urls.py @@ -0,0 +1,19 @@ +from django.conf.urls.defaults import * +from django.views.generic.simple import direct_to_template +from django.conf import settings + + +urlpatterns = patterns('', + (r"^$", direct_to_template, { "template": "home.html" }), + (r"^article/", include("article.urls")), + (r"^download/", include("download.urls")), + (r"^weblog/", include("blog.urls")), + + (r"^admin/", include("django.contrib.admin.urls")), +) + + +if settings.DEBUG: # devel + urlpatterns += patterns('', + (r"^site-media/(?P.*)$", "django.views.static.serve", { "document_root": settings.MEDIA_ROOT }), + )