Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial refactor of django_website; moving things around.

  • Loading branch information...
commit d5c2cc56595de74ac020432e87350a90ba39a823 1 parent 1608660
@jacobian jacobian authored
Showing with 186 additions and 1,236 deletions.
  1. 0  django_website/{apps/docs → accounts}/__init__.py
  2. 0  django_website/{apps → }/accounts/forms.py
  3. 0  django_website/{apps → }/accounts/urls.py
  4. 0  django_website/{apps/contact → aggregator}/__init__.py
  5. +3 −1 django_website/{apps → }/aggregator/admin.py
  6. +75 −0 django_website/aggregator/bin/update_feeds.py
  7. +3 −1 django_website/{apps → }/aggregator/feeds.py
  8. 0  django_website/{apps → }/aggregator/models.py
  9. 0  django_website/{apps/blog → aggregator}/templatetags/__init__.py
  10. +26 −0 django_website/aggregator/templatetags/aggregator.py
  11. 0  django_website/apps/__init__.py
  12. +0 −180 django_website/apps/docs/builder.py
  13. +0 −19 django_website/apps/docs/models.py
  14. +0 −879 django_website/apps/docs/smartypants.py
  15. +0 −12 django_website/apps/docs/urls.py
  16. +0 −121 django_website/apps/docs/views.py
  17. 0  django_website/{apps → }/blog/__init__.py
  18. +3 −1 django_website/{apps → }/blog/admin.py
  19. +4 −2 django_website/{apps → }/blog/feeds.py
  20. 0  django_website/{apps → }/blog/models.py
  21. 0  django_website/{apps/aggregator/management/commands → blog/templatetags}/__init__.py
  22. +3 −1 django_website/{apps → }/blog/templatetags/weblog.py
  23. +3 −1 django_website/{apps → }/blog/urls.py
  24. 0  django_website/{apps/aggregator → contact}/__init__.py
  25. 0  django_website/{apps → }/contact/forms.py
  26. +3 −1 django_website/{apps → }/contact/urls.py
  27. 0  django_website/{apps/accounts/__init__.py → legacy/__init_.py}
  28. +18 −0 django_website/legacy/docurls.py
  29. +10 −0 django_website/legacy/views.py
  30. +16 −0 django_website/middleware.py
  31. +4 −10 django_website/settings.py
  32. +4 −2 django_website/sitemaps.py
  33. +7 −5 django_website/urls.py
  34. +4 −0 requirements.txt
View
0  django_website/apps/docs/__init__.py → django_website/accounts/__init__.py
File renamed without changes
View
0  django_website/apps/accounts/forms.py → django_website/accounts/forms.py
File renamed without changes
View
0  django_website/apps/accounts/urls.py → django_website/accounts/urls.py
File renamed without changes
View
0  django_website/apps/contact/__init__.py → django_website/aggregator/__init__.py
File renamed without changes
View
4 django_website/apps/aggregator/admin.py → django_website/aggregator/admin.py
@@ -1,5 +1,7 @@
+from __future__ import absolute_import
+
from django.contrib import admin
-from django_website.apps.aggregator.models import Feed, FeedItem, FeedType
+from .models import Feed, FeedItem, FeedType
admin.site.register(Feed,
list_display = ["title", "public_url", "is_defunct"],
View
75 django_website/aggregator/bin/update_feeds.py
@@ -0,0 +1,75 @@
+"""
+Update feeds for Django community page. Requires Mark Pilgrim's excellent
+Universal Feed Parser (http://feedparser.org)
+"""
+
+import os
+import sys
+import time
+import socket
+import optparse
+import datetime
+import feedparser
+
+LOCKFILE = "/tmp/update_feeds.lock"
+def update_feeds(verbose=False):
+ from django_website.apps.aggregator.models import Feed, FeedItem
+ for feed in Feed.objects.filter(is_defunct=False):
+ if verbose:
+ print feed
+ parsed_feed = feedparser.parse(feed.feed_url)
+ for entry in parsed_feed.entries:
+ title = entry.title.encode(parsed_feed.encoding, "xmlcharrefreplace")
+ guid = entry.get("id", entry.link).encode(parsed_feed.encoding, "xmlcharrefreplace")
+ link = entry.link.encode(parsed_feed.encoding, "xmlcharrefreplace")
+
+ if not guid:
+ guid = link
+
+ if hasattr(entry, "summary"):
+ content = entry.summary
+ elif hasattr(entry, "content"):
+ content = entry.content[0].value
+ elif hasattr(entry, "description"):
+ content = entry.description
+ else:
+ content = u""
+ content = content.encode(parsed_feed.encoding, "xmlcharrefreplace")
+
+ try:
+ if entry.has_key('modified_parsed'):
+ date_modified = datetime.datetime.fromtimestamp(time.mktime(entry.modified_parsed))
+ elif parsed_feed.feed.has_key('modified_parsed'):
+ date_modified = datetime.datetime.fromtimestamp(time.mktime(parsed_feed.feed.modified_parsed))
+ elif parsed_feed.has_key('modified'):
+ date_modified = datetime.datetime.fromtimestamp(time.mktime(parsed_feed.modified))
+ else:
+ date_modified = datetime.datetime.now()
+ except TypeError:
+ date_modified = datetime.datetime.now()
+
+ try:
+ feed.feeditem_set.get(guid=guid)
+ except FeedItem.DoesNotExist:
+ feed.feeditem_set.create(title=title, link=link, summary=content, guid=guid, date_modified=date_modified)
+
+def main(argv):
+ socket.setdefaulttimeout(15)
+ parser = optparse.OptionParser()
+ parser.add_option('--settings')
+ parser.add_option('-v', '--verbose', action="store_true")
+ options, args = parser.parse_args(argv)
+ if options.settings:
+ os.environ["DJANGO_SETTINGS_MODULE"] = options.settings
+ update_feeds(options.verbose)
+
+if __name__ == '__main__':
+ try:
+ lockfile = os.open(LOCKFILE, os.O_CREAT | os.O_EXCL)
+ except OSError:
+ sys.exit(0)
+ try:
+ sys.exit(main(sys.argv))
+ finally:
+ os.close(lockfile)
+ os.unlink(LOCKFILE)
View
4 django_website/apps/aggregator/feeds.py → django_website/aggregator/feeds.py
@@ -1,5 +1,7 @@
+from __future__ import absolute_import
+
from django.contrib.syndication.feeds import Feed
-from django_website.apps.aggregator.models import FeedItem
+from .models import FeedItem
class CommunityAggregatorFeed(Feed):
title = "The Django community aggregator"
View
0  django_website/apps/aggregator/models.py → django_website/aggregator/models.py
File renamed without changes
View
0  django_website/apps/blog/templatetags/__init__.py → django_website/aggregator/templatetags/__init__.py
File renamed without changes
View
26 django_website/aggregator/templatetags/aggregator.py
@@ -0,0 +1,26 @@
+from __future__ import absolute_import
+
+from django import template
+from .models import Feed
+
+class FeedListNode(template.Node):
+ def __init__(self, varname):
+ self.varname = varname
+
+ def render(self, context):
+ context[self.varname] = Feed.objects.filter(is_defunct=False)
+ return ''
+
+def do_get_feed_list(parser, token):
+ """
+ {% get_feed_list as feed_list %}
+ """
+ bits = token.contents.split()
+ if len(bits) != 3:
+ raise template.TemplateSyntaxError, "'%s' tag takes two arguments" % bits[0]
+ if bits[1] != "as":
+ raise template.TemplateSyntaxError, "First argument to '%s' tag must be 'as'" % bits[0]
+ return FeedListNode(bits[2])
+
+register = template.Library()
+register.tag('get_feed_list', do_get_feed_list)
View
0  django_website/apps/__init__.py
No changes.
View
180 django_website/apps/docs/builder.py
@@ -1,180 +0,0 @@
-"""
-Code to do the ReST --> HTML generation for the docs.
-"""
-
-import re
-import compiler
-import smartypants
-from docutils import nodes
-from docutils.core import publish_parts
-from docutils.writers import html4css1
-
-def build_document(text):
- """
- Build a doc file into a dict of HTML bits.
- """
- return publish_parts(text, writer=DjangoHTMLWriter(), settings_overrides={'initial_header_level': 2})
-
-docstring_re = re.compile(r"([\"']{3})(.*?)(\1)", re.DOTALL|re.MULTILINE)
-def build_model_document(text):
- """
- Build a test example into a dict of HTML bits.
- """
- # We need to parse the model file without actually executing it.
- tree = compiler.parse(text)
-
- # Get the title and blurb from the module's docstring
- title, blurb = tree.doc.strip().split('\n', 1)
- parts = publish_parts(blurb, writer=DjangoHTMLWriter(), settings_overrides={'initial_header_level': 2})
- parts["title"] = title
-
- # Walk the tree and parse out the bits we care about.
- visitor = compiler.walk(tree, ModelSourceVistor())
- parts["api_usage"] = visitor.doctest
- parts["models"] = visitor.models
-
- # Parse out the model source.
- try:
- model_source = text[:text.index("__test__")]
- except ValueError:
- model_source = text
- parts["model_source"] = model_source.replace(tree.doc, "").replace('""""""\n', '\n').strip()
-
- return parts
-
-class ModelSourceVistor:
- """AST visitor for a model module."""
-
- def __init__(self):
- self.doctest = ""
- self.models = []
-
- def visitAssign(self, node):
- assname, valtree = node.getChildren()
- if assname.name == "__test__":
- self.doctest = valtree.getChildren()[1].value
-
- def visitClass(self, node):
- if node.bases and isinstance(node.bases[0], compiler.ast.Getattr) and node.bases[0].attrname == "Model":
- self.models.append(node.name)
-
-class DjangoHTMLWriter(html4css1.Writer):
- """
- HTML writer that adds a "toc" key to the set of doc parts.
- """
- def __init__(self):
- html4css1.Writer.__init__(self)
- self.translator_class = DjangoHTMLTranslator
-
- def translate(self):
- # build the document
- html4css1.Writer.translate(self)
-
- # build the contents
- contents = self.build_contents(self.document)
- contents_doc = self.document.copy()
- contents_doc.children = contents
- contents_visitor = self.translator_class(contents_doc)
- contents_doc.walkabout(contents_visitor)
- self.parts['toc'] = "<ul class='toc'>%s</ul>" % ''.join(contents_visitor.fragment)
-
- def build_contents(self, node, level=0):
- level += 1
- sections = []
- i = len(node) - 1
- while i >= 0 and isinstance(node[i], nodes.section):
- sections.append(node[i])
- i -= 1
- sections.reverse()
- entries = []
- autonum = 0
- depth = 4 # XXX FIXME
- for section in sections:
- title = section[0]
- entrytext = title
- try:
- reference = nodes.reference('', '', refid=section['ids'][0], *entrytext)
- except IndexError:
- continue
- ref_id = self.document.set_id(reference)
- entry = nodes.paragraph('', '', reference)
- item = nodes.list_item('', entry)
- if level < depth:
- subsects = self.build_contents(section, level)
- item += subsects
- entries.append(item)
- if entries:
- contents = nodes.bullet_list('', *entries)
- return contents
- else:
- return []
-
-class DjangoHTMLTranslator(html4css1.HTMLTranslator):
- """
- reST -> HTML translator subclass that fixes up the parts of docutils I don't like.
- """
-
- # Prevent name attributes from being generated
- named_tags = []
-
- def __init__(self, document):
- html4css1.HTMLTranslator.__init__(self, document)
- self._in_literal = 0
-
- # Remove the default border=1 from <table>
- def visit_table(self, node):
- self.body.append(self.starttag(node, 'table', CLASS='docutils'))
-
- # Prevent <h3> from becoming <h3><a id>
- #def visit_title(self, node, move_ids=1):
- # if isinstance(node.parent, nodes.Admonition):
- # self.body.append(self.starttag(node, 'p', '', CLASS='admonition-title'))
- # self.context.append("</p>\n")
- # else:
- # html4css1.HTMLTranslator.visit_title(self, node, move_ids=0)
-
- #
- # Apply smartypants to content when not inside literals
- #
- def visit_literal_block(self, node):
- self._in_literal += 1
- html4css1.HTMLTranslator.visit_literal_block(self, node)
-
- def depart_literal_block(self, node):
- html4css1.HTMLTranslator.depart_literal_block(self, node)
- self._in_literal -= 1
-
- def visit_literal(self, node):
- self._in_literal += 1
- try:
- html4css1.HTMLTranslator.visit_literal(self, node)
- finally:
- self._in_literal -= 1
-
- def encode(self, text):
- text = html4css1.HTMLTranslator.encode(self, text)
- if self._in_literal <= 0:
- text = smartypants.smartyPants(text, "qde")
- return text
-
- #
- # Avoid <blockquote>s around merely indented nodes.
- # Adapted from http://thread.gmane.org/gmane.text.docutils.user/742/focus=804
- #
-
- _suppress_blockquote_child_nodes = (
- nodes.bullet_list, nodes.enumerated_list, nodes.definition_list,
- nodes.literal_block, nodes.doctest_block, nodes.line_block, nodes.table
- )
- def _bq_is_valid(self, node):
- return len(node.children) != 1 or not isinstance(node.children[0], self._suppress_blockquote_child_nodes)
-
- def visit_block_quote(self, node):
- if self._bq_is_valid(node):
- html4css1.HTMLTranslator.visit_block_quote(self, node)
-
- def depart_block_quote(self, node):
- if self._bq_is_valid(node):
- html4css1.HTMLTranslator.depart_block_quote(self, node)
-
-
View
19 django_website/apps/docs/models.py
@@ -1,19 +0,0 @@
-from django.db import models
-
-class DocumentRelease(models.Model):
- version = models.CharField(max_length=20, unique=True)
- repository_path = models.CharField(max_length=50, help_text="(i.e. 'tags/releases/0.95' or 'branches/0.95-bugfixes')")
- release_date = models.DateField()
-
- class Meta:
- ordering = ('-release_date',)
-
- class Admin:
- list_display = ("version", "repository_path", "release_date")
-
- def __unicode__(self):
- return self.version
-
- def get_absolute_url(self):
- return "/documentation/%s/" % (self.version)
-
View
879 django_website/apps/docs/smartypants.py
@@ -1,879 +0,0 @@
-r"""
-==============
-smartypants.py
-==============
-
-----------------------------
-SmartyPants ported to Python
-----------------------------
-
-Ported by `Chad Miller`_
-Copyright (c) 2004 Chad Miller
-
-original `SmartyPants`_ by `John Gruber`_
-Copyright (c) 2003 John Gruber
-
-
-Synopsis
-========
-
-A smart-quotes plugin for Pyblosxom_.
-
-The priginal "SmartyPants" is a free web publishing plug-in for Movable Type,
-Blosxom, and BBEdit that easily translates plain ASCII punctuation characters
-into "smart" typographic punctuation HTML entities.
-
-This software, *smartypants.py*, endeavours to be a functional port of
-SmartyPants to Python, for use with Pyblosxom_.
-
-
-Description
-===========
-
-SmartyPants can perform the following transformations:
-
-- Straight quotes ( " and ' ) into "curly" quote HTML entities
-- Backticks-style quotes (\`\`like this'') into "curly" quote HTML entities
-- Dashes (``--`` and ``---``) into en- and em-dash entities
-- Three consecutive dots (``...`` or ``. . .``) into an ellipsis entity
-
-This means you can write, edit, and save your posts using plain old
-ASCII straight quotes, plain dashes, and plain dots, but your published
-posts (and final HTML output) will appear with smart quotes, em-dashes,
-and proper ellipses.
-
-SmartyPants does not modify characters within ``<pre>``, ``<code>``, ``<kbd>``,
-``<math>`` or ``<script>`` tag blocks. Typically, these tags are used to
-display text where smart quotes and other "smart punctuation" would not be
-appropriate, such as source code or example markup.
-
-
-Backslash Escapes
-=================
-
-If you need to use literal straight quotes (or plain hyphens and
-periods), SmartyPants accepts the following backslash escape sequences
-to force non-smart punctuation. It does so by transforming the escape
-sequence into a decimal-encoded HTML entity:
-
-(FIXME: table here.)
-
-.. comment It sucks that there's a disconnect between the visual layout and table markup when special characters are involved.
-.. comment ====== ===== =========
-.. comment Escape Value Character
-.. comment ====== ===== =========
-.. comment \\\\\\\\ &#92; \\\\
-.. comment \\\\" &#34; "
-.. comment \\\\' &#39; '
-.. comment \\\\. &#46; .
-.. comment \\\\- &#45; \-
-.. comment \\\\` &#96; \`
-.. comment ====== ===== =========
-
-This is useful, for example, when you want to use straight quotes as
-foot and inch marks: 6'2" tall; a 17" iMac.
-
-Options
-=======
-
-For Pyblosxom users, the ``smartypants_attributes`` attribute is where you
-specify configuration options.
-
-Numeric values are the easiest way to configure SmartyPants' behavior:
-
-"0"
- Suppress all transformations. (Do nothing.)
-"1"
- Performs default SmartyPants transformations: quotes (including
- \`\`backticks'' -style), em-dashes, and ellipses. "``--``" (dash dash)
- is used to signify an em-dash; there is no support for en-dashes.
-
-"2"
- Same as smarty_pants="1", except that it uses the old-school typewriter
- shorthand for dashes: "``--``" (dash dash) for en-dashes, "``---``"
- (dash dash dash)
- for em-dashes.
-
-"3"
- Same as smarty_pants="2", but inverts the shorthand for dashes:
- "``--``" (dash dash) for em-dashes, and "``---``" (dash dash dash) for
- en-dashes.
-
-"-1"
- Stupefy mode. Reverses the SmartyPants transformation process, turning
- the HTML entities produced by SmartyPants into their ASCII equivalents.
- E.g. "&#8220;" is turned into a simple double-quote ("), "&#8212;" is
- turned into two dashes, etc.
-
-
-The following single-character attribute values can be combined to toggle
-individual transformations from within the smarty_pants attribute. For
-example, to educate normal quotes and em-dashes, but not ellipses or
-\`\`backticks'' -style quotes:
-
-``py['smartypants_attributes'] = "1"``
-
-"q"
- Educates normal quote characters: (") and (').
-
-"b"
- Educates \`\`backticks'' -style double quotes.
-
-"B"
- Educates \`\`backticks'' -style double quotes and \`single' quotes.
-
-"d"
- Educates em-dashes.
-
-"D"
- Educates em-dashes and en-dashes, using old-school typewriter shorthand:
- (dash dash) for en-dashes, (dash dash dash) for em-dashes.
-
-"i"
- Educates em-dashes and en-dashes, using inverted old-school typewriter
- shorthand: (dash dash) for em-dashes, (dash dash dash) for en-dashes.
-
-"e"
- Educates ellipses.
-
-"w"
- Translates any instance of ``&quot;`` into a normal double-quote character.
- This should be of no interest to most people, but of particular interest
- to anyone who writes their posts using Dreamweaver, as Dreamweaver
- inexplicably uses this entity to represent a literal double-quote
- character. SmartyPants only educates normal quotes, not entities (because
- ordinarily, entities are used for the explicit purpose of representing the
- specific character they represent). The "w" option must be used in
- conjunction with one (or both) of the other quote options ("q" or "b").
- Thus, if you wish to apply all SmartyPants transformations (quotes, en-
- and em-dashes, and ellipses) and also translate ``&quot;`` entities into
- regular quotes so SmartyPants can educate them, you should pass the
- following to the smarty_pants attribute:
-
-The ``smartypants_forbidden_flavours`` list contains pyblosxom flavours for
-which no Smarty Pants rendering will occur.
-
-
-Caveats
-=======
-
-Why You Might Not Want to Use Smart Quotes in Your Weblog
----------------------------------------------------------
-
-For one thing, you might not care.
-
-Most normal, mentally stable individuals do not take notice of proper
-typographic punctuation. Many design and typography nerds, however, break
-out in a nasty rash when they encounter, say, a restaurant sign that uses
-a straight apostrophe to spell "Joe's".
-
-If you're the sort of person who just doesn't care, you might well want to
-continue not caring. Using straight quotes -- and sticking to the 7-bit
-ASCII character set in general -- is certainly a simpler way to live.
-
-Even if you I *do* care about accurate typography, you still might want to
-think twice before educating the quote characters in your weblog. One side
-effect of publishing curly quote HTML entities is that it makes your
-weblog a bit harder for others to quote from using copy-and-paste. What
-happens is that when someone copies text from your blog, the copied text
-contains the 8-bit curly quote characters (as well as the 8-bit characters
-for em-dashes and ellipses, if you use these options). These characters
-are not standard across different text encoding methods, which is why they
-need to be encoded as HTML entities.
-
-People copying text from your weblog, however, may not notice that you're
-using curly quotes, and they'll go ahead and paste the unencoded 8-bit
-characters copied from their browser into an email message or their own
-weblog. When pasted as raw "smart quotes", these characters are likely to
-get mangled beyond recognition.
-
-That said, my own opinion is that any decent text editor or email client
-makes it easy to stupefy smart quote characters into their 7-bit
-equivalents, and I don't consider it my problem if you're using an
-indecent text editor or email client.
-
-
-Algorithmic Shortcomings
-------------------------
-
-One situation in which quotes will get curled the wrong way is when
-apostrophes are used at the start of leading contractions. For example:
-
-``'Twas the night before Christmas.``
-
-In the case above, SmartyPants will turn the apostrophe into an opening
-single-quote, when in fact it should be a closing one. I don't think
-this problem can be solved in the general case -- every word processor
-I've tried gets this wrong as well. In such cases, it's best to use the
-proper HTML entity for closing single-quotes (``&#8217;``) by hand.
-
-
-Bugs
-====
-
-To file bug reports or feature requests (other than topics listed in the
-Caveats section above) please send email to: mailto:smartypantspy@chad.org
-
-If the bug involves quotes being curled the wrong way, please send example
-text to illustrate.
-
-To Do list
-----------
-
-- Provide a function for use within templates to quote anything at all.
-
-
-Version History
-===============
-
-1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400
- - Fix bogus magical quotation when there is no hint that the
- user wants it, e.g., in "21st century". Thanks to Nathan Hamblen.
- - Be smarter about quotes before terminating numbers in an en-dash'ed
- range.
-
-1.5_1.4: Thu, 10 Feb 2005 20:24:36 -0500
- - Fix a date-processing bug, as reported by jacob childress.
- - Begin a test-suite for ensuring correct output.
- - Removed import of "string", since I didn't really need it.
- (This was my first every Python program. Sue me!)
-
-1.5_1.3: Wed, 15 Sep 2004 18:25:58 -0400
- - Abort processing if the flavour is in forbidden-list. Default of
- [ "rss" ] (Idea of Wolfgang SCHNERRING.)
- - Remove stray virgules from en-dashes. Patch by Wolfgang SCHNERRING.
-
-1.5_1.2: Mon, 24 May 2004 08:14:54 -0400
- - Some single quotes weren't replaced properly. Diff-tesuji played
- by Benjamin GEIGER.
-
-1.5_1.1: Sun, 14 Mar 2004 14:38:28 -0500
- - Support upcoming pyblosxom 0.9 plugin verification feature.
-
-1.5_1.0: Tue, 09 Mar 2004 08:08:35 -0500
- - Initial release
-
-Version Information
--------------------
-
-Version numbers will track the SmartyPants_ version numbers, with the addition
-of an underscore and the smartypants.py version on the end.
-
-New versions will be available at `http://wiki.chad.org/SmartyPantsPy`_
-
-.. _http://wiki.chad.org/SmartyPantsPy: http://wiki.chad.org/SmartyPantsPy
-
-Authors
-=======
-
-`John Gruber`_ did all of the hard work of writing this software in Perl for
-`Movable Type`_ and almost all of this useful documentation. `Chad Miller`_
-ported it to Python to use with Pyblosxom_.
-
-
-Additional Credits
-==================
-
-Portions of the SmartyPants original work are based on Brad Choate's nifty
-MTRegex plug-in. `Brad Choate`_ also contributed a few bits of source code to
-this plug-in. Brad Choate is a fine hacker indeed.
-
-`Jeremy Hedley`_ and `Charles Wiltgen`_ deserve mention for exemplary beta
-testing of the original SmartyPants.
-
-`Rael Dornfest`_ ported SmartyPants to Blosxom.
-
-.. _Brad Choate: http://bradchoate.com/
-.. _Jeremy Hedley: http://antipixel.com/
-.. _Charles Wiltgen: http://playbacktime.com/
-.. _Rael Dornfest: http://raelity.org/
-
-
-Copyright and License
-=====================
-
-SmartyPants_ license::
-
- Copyright (c) 2003 John Gruber
- (http://daringfireball.net/)
- All rights reserved.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- * Neither the name "SmartyPants" nor the names of its contributors
- may be used to endorse or promote products derived from this
- software without specific prior written permission.
-
- This software is provided by the copyright holders and contributors "as
- is" and any express or implied warranties, including, but not limited
- to, the implied warranties of merchantability and fitness for a
- particular purpose are disclaimed. In no event shall the copyright
- owner or contributors be liable for any direct, indirect, incidental,
- special, exemplary, or consequential damages (including, but not
- limited to, procurement of substitute goods or services; loss of use,
- data, or profits; or business interruption) however caused and on any
- theory of liability, whether in contract, strict liability, or tort
- (including negligence or otherwise) arising in any way out of the use
- of this software, even if advised of the possibility of such damage.
-
-
-smartypants.py license::
-
- smartypants.py is a derivative work of SmartyPants.
-
- Redistribution and use in source and binary forms, with or without
- modification, are permitted provided that the following conditions are
- met:
-
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
-
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in
- the documentation and/or other materials provided with the
- distribution.
-
- This software is provided by the copyright holders and contributors "as
- is" and any express or implied warranties, including, but not limited
- to, the implied warranties of merchantability and fitness for a
- particular purpose are disclaimed. In no event shall the copyright
- owner or contributors be liable for any direct, indirect, incidental,
- special, exemplary, or consequential damages (including, but not
- limited to, procurement of substitute goods or services; loss of use,
- data, or profits; or business interruption) however caused and on any
- theory of liability, whether in contract, strict liability, or tort
- (including negligence or otherwise) arising in any way out of the use
- of this software, even if advised of the possibility of such damage.
-
-
-
-.. _John Gruber: http://daringfireball.net/
-.. _Chad Miller: http://web.chad.org/
-
-.. _Pyblosxom: http://roughingit.subtlehints.net/pyblosxom
-.. _SmartyPants: http://daringfireball.net/projects/smartypants/
-.. _Movable Type: http://www.movabletype.org/
-
-"""
-
-default_smartypants_attr = "1"
-
-import re
-
-tags_to_skip_regex = re.compile("<(/)?(?:pre|code|kbd|script|math)[^>]*>")
-
-
-def verify_installation(request):
- return 1
- # assert the plugin is functional
-
-
-def cb_story(args):
- global default_smartypants_attr
-
- try:
- forbidden_flavours = args["entry"]["smartypants_forbidden_flavours"]
- except KeyError:
- forbidden_flavours = [ "rss" ]
-
- try:
- attributes = args["entry"]["smartypants_attributes"]
- except KeyError:
- attributes = default_smartypants_attr
-
- if attributes is None:
- attributes = default_smartypants_attr
-
- entryData = args["entry"].getData()
-
- try:
- if args["request"]["flavour"] in forbidden_flavours:
- return
- except KeyError:
- if "&lt;" in args["entry"]["body"][0:15]: # sniff the stream
- return # abort if it looks like escaped HTML. FIXME
-
- # FIXME: make these configurable, perhaps?
- args["entry"]["body"] = smartyPants(entryData, attributes)
- args["entry"]["title"] = smartyPants(args["entry"]["title"], attributes)
-
-
-### interal functions below here
-
-def smartyPants(text, attr=default_smartypants_attr):
- convert_quot = False # should we translate &quot; entities into normal quotes?
-
- # Parse attributes:
- # 0 : do nothing
- # 1 : set all
- # 2 : set all, using old school en- and em- dash shortcuts
- # 3 : set all, using inverted old school en and em- dash shortcuts
- #
- # q : quotes
- # b : backtick quotes (``double'' only)
- # B : backtick quotes (``double'' and `single')
- # d : dashes
- # D : old school dashes
- # i : inverted old school dashes
- # e : ellipses
- # w : convert &quot; entities to " for Dreamweaver users
-
- do_dashes = "0"
- do_backticks = "0"
- do_quotes = "0"
- do_ellipses = "0"
- do_stupefy = "0"
-
- if attr == "0":
- # Do nothing.
- return text
- elif attr == "1":
- do_quotes = "1"
- do_backticks = "1"
- do_dashes = "1"
- do_ellipses = "1"
- elif attr == "2":
- # Do everything, turn all options on, use old school dash shorthand.
- do_quotes = "1"
- do_backticks = "1"
- do_dashes = "2"
- do_ellipses = "1"
- elif attr == "3":
- # Do everything, turn all options on, use inverted old school dash shorthand.
- do_quotes = "1"
- do_backticks = "1"
- do_dashes = "3"
- do_ellipses = "1"
- elif attr == "-1":
- # Special "stupefy" mode.
- do_stupefy = "1"
- else:
- for c in attr:
- if c == "q": do_quotes = "1"
- elif c == "b": do_backticks = "1"
- elif c == "B": do_backticks = "2"
- elif c == "d": do_dashes = "1"
- elif c == "D": do_dashes = "2"
- elif c == "i": do_dashes = "3"
- elif c == "e": do_ellipses = "1"
- elif c == "w": convert_quot = "1"
- else:
- pass
- # ignore unknown option
-
- tokens = _tokenize(text)
- result = []
- in_pre = False
-
- prev_token_last_char = ""
- # This is a cheat, used to get some context
- # for one-character tokens that consist of
- # just a quote char. What we do is remember
- # the last character of the previous text
- # token, to use as context to curl single-
- # character quote tokens correctly.
-
- for cur_token in tokens:
- if cur_token[0] == "tag":
- # Don't mess with quotes inside tags.
- result.append(cur_token[1])
- close_match = tags_to_skip_regex.match(cur_token[1])
- # if close_match is not None and close_match.group(1) == "":
- if close_match is not None:
- in_pre = True
- else:
- in_pre = False
- else:
- t = cur_token[1]
- last_char = t[-1:] # Remember last char of this token before processing.
- if not in_pre:
- oldstr = t
- t = processEscapes(t)
-
- if convert_quot != "0":
- t = re.sub('&quot;', '"', t)
-
- if do_dashes != "0":
- if do_dashes == "1":
- t = educateDashes(t)
- if do_dashes == "2":
- t = educateDashesOldSchool(t)
- if do_dashes == "3":
- t = educateDashesOldSchoolInverted(t)
-
- if do_ellipses != "0":
- t = educateEllipses(t)
-
- # Note: backticks need to be processed before quotes.
- if do_backticks != "0":
- t = educateBackticks(t)
-
- if do_backticks == "2":
- t = educateSingleBackticks(t)
-
- if do_quotes != "0":
- if t == "'":
- # Special case: single-character ' token
- if re.match("\S", prev_token_last_char):
- t = "&#8217;"
- else:
- t = "&#8216;"
- elif t == '"':
- # Special case: single-character " token
- if re.match("\S", prev_token_last_char):
- t = "&#8221;"
- else:
- t = "&#8220;"
-
- else:
- # Normal case:
- t = educateQuotes(t)
-
- if do_stupefy == "1":
- t = stupefyEntities(t)
-
- prev_token_last_char = last_char
- result.append(t)
-
- return "".join(result)
-
-
-def educateQuotes(str):
- """
- Parameter: String.
-
- Returns: The string, with "educated" curly quote HTML entities.
-
- Example input: "Isn't this fun?"
- Example output: &#8220;Isn&#8217;t this fun?&#8221;
- """
-
- oldstr = str
- punct_class = r"""[!"#\$\%'()*+,-.\/:;<=>?\@\[\\\]\^_`{|}~]"""
-
- # Special case if the very first character is a quote
- # followed by punctuation at a non-word-break. Close the quotes by brute force:
- str = re.sub(r"""^'(?=%s\\B)""" % (punct_class,), r"""&#8217;""", str)
- str = re.sub(r"""^"(?=%s\\B)""" % (punct_class,), r"""&#8221;""", str)
-
- # Special case for double sets of quotes, e.g.:
- # <p>He said, "'Quoted' words in a larger quote."</p>
- str = re.sub(r""""'(?=\w)""", """&#8220;&#8216;""", str)
- str = re.sub(r"""'"(?=\w)""", """&#8216;&#8220;""", str)
-
- # Special case for decade abbreviations (the '80s):
- str = re.sub(r"""\b'(?=\d{2}s)""", r"""&#8217;""", str)
-
- close_class = r"""[^\ \t\r\n\[\{\(\-]"""
- dec_dashes = r"""&#8211;|&#8212;"""
-
- # Get most opening single quotes:
- opening_single_quotes_regex = re.compile(r"""
- (
- \s | # a whitespace char, or
- &nbsp; | # a non-breaking space entity, or
- -- | # dashes, or
- &[mn]dash; | # named dash entities
- %s | # or decimal entities
- &\#x201[34]; # or hex
- )
- ' # the quote
- (?=\w) # followed by a word character
- """ % (dec_dashes,), re.VERBOSE)
- str = opening_single_quotes_regex.sub(r"""\1&#8216;""", str)
-
- closing_single_quotes_regex = re.compile(r"""
- (%s)
- '
- (?!\s | s\b | \d)
- """ % (close_class,), re.VERBOSE)
- str = closing_single_quotes_regex.sub(r"""\1&#8217;""", str)
-
- closing_single_quotes_regex = re.compile(r"""
- (%s)
- '
- (\s | s\b)
- """ % (close_class,), re.VERBOSE)
- str = closing_single_quotes_regex.sub(r"""\1&#8217;\2""", str)
-
- # Any remaining single quotes should be opening ones:
- str = re.sub(r"""'""", r"""&#8216;""", str)
-
- # Get most opening double quotes:
- opening_double_quotes_regex = re.compile(r"""
- (
- \s | # a whitespace char, or
- &nbsp; | # a non-breaking space entity, or
- -- | # dashes, or
- &[mn]dash; | # named dash entities
- %s | # or decimal entities
- &\#x201[34]; # or hex
- )
- " # the quote
- (?=\w) # followed by a word character
- """ % (dec_dashes,), re.VERBOSE)
- str = opening_double_quotes_regex.sub(r"""\1&#8220;""", str)
-
- # Double closing quotes:
- closing_double_quotes_regex = re.compile(r"""
- #(%s)? # character that indicates the quote should be closing
- "
- (?=\s)
- """ % (close_class,), re.VERBOSE)
- str = closing_double_quotes_regex.sub(r"""&#8221;""", str)
-
- closing_double_quotes_regex = re.compile(r"""
- (%s) # character that indicates the quote should be closing
- "
- """ % (close_class,), re.VERBOSE)
- str = closing_double_quotes_regex.sub(r"""\1&#8221;""", str)
-
- # Any remaining quotes should be opening ones.
- str = re.sub(r'"', r"""&#8220;""", str)
-
- return str
-
-
-def educateBackticks(str):
- """
- Parameter: String.
- Returns: The string, with ``backticks'' -style double quotes
- translated into HTML curly quote entities.
- Example input: ``Isn't this fun?''
- Example output: &#8220;Isn't this fun?&#8221;
- """
-
- str = re.sub(r"""``""", r"""&#8220;""", str)
- str = re.sub(r"""''""", r"""&#8221;""", str)
- return str
-
-
-def educateSingleBackticks(str):
- """
- Parameter: String.
- Returns: The string, with `backticks' -style single quotes
- translated into HTML curly quote entities.
-
- Example input: `Isn't this fun?'
- Example output: &#8216;Isn&#8217;t this fun?&#8217;
- """
-
- str = re.sub(r"""`""", r"""&#8216;""", str)
- str = re.sub(r"""'""", r"""&#8217;""", str)
- return str
-
-
-def educateDashes(str):
- """
- Parameter: String.
-
- Returns: The string, with each instance of "--" translated to
- an em-dash HTML entity.
- """
-
- str = re.sub(r"""---""", r"""&#8211;""", str) # en (yes, backwards)
- str = re.sub(r"""--""", r"""&#8212;""", str) # em (yes, backwards)
- return str
-
-
-def educateDashesOldSchool(str):
- """
- Parameter: String.
-
- Returns: The string, with each instance of "--" translated to
- an en-dash HTML entity, and each "---" translated to
- an em-dash HTML entity.
- """
-
- str = re.sub(r"""---""", r"""&#8212;""", str) # em (yes, backwards)
- str = re.sub(r"""--""", r"""&#8211;""", str) # en (yes, backwards)
- return str
-
-
-def educateDashesOldSchoolInverted(str):
- """
- Parameter: String.
-
- Returns: The string, with each instance of "--" translated to
- an em-dash HTML entity, and each "---" translated to
- an en-dash HTML entity. Two reasons why: First, unlike the
- en- and em-dash syntax supported by
- EducateDashesOldSchool(), it's compatible with existing
- entries written before SmartyPants 1.1, back when "--" was
- only used for em-dashes. Second, em-dashes are more
- common than en-dashes, and so it sort of makes sense that
- the shortcut should be shorter to type. (Thanks to Aaron
- Swartz for the idea.)
- """
- str = re.sub(r"""---""", r"""&#8211;""", str) # em
- str = re.sub(r"""--""", r"""&#8212;""", str) # en
- return str
-
-
-
-def educateEllipses(str):
- """
- Parameter: String.
- Returns: The string, with each instance of "..." translated to
- an ellipsis HTML entity.
-
- Example input: Huh...?
- Example output: Huh&#8230;?
- """
-
- str = re.sub(r"""\.\.\.""", r"""&#8230;""", str)
- str = re.sub(r"""\. \. \.""", r"""&#8230;""", str)
- return str
-
-
-def stupefyEntities(str):
- """
- Parameter: String.
- Returns: The string, with each SmartyPants HTML entity translated to
- its ASCII counterpart.
-
- Example input: &#8220;Hello &#8212; world.&#8221;
- Example output: "Hello -- world."
- """
-
- str = re.sub(r"""&#8211;""", r"""-""", str) # en-dash
- str = re.sub(r"""&#8212;""", r"""--""", str) # em-dash
-
- str = re.sub(r"""&#8216;""", r"""'""", str) # open single quote
- str = re.sub(r"""&#8217;""", r"""'""", str) # close single quote
-
- str = re.sub(r"""&#8220;""", r'''"''', str) # open double quote
- str = re.sub(r"""&#8221;""", r'''"''', str) # close double quote
-
- str = re.sub(r"""&#8230;""", r"""...""", str)# ellipsis
-
- return str
-
-
-def processEscapes(str):
- r"""
- Parameter: String.
- Returns: The string, with after processing the following backslash
- escape sequences. This is useful if you want to force a "dumb"
- quote or other character to appear.
-
- Escape Value
- ------ -----
- \\ &#92;
- \" &#34;
- \' &#39;
- \. &#46;
- \- &#45;
- \` &#96;
- """
- str = re.sub(r"""\\\\""", r"""&#92;""", str)
- str = re.sub(r'''\\"''', r"""&#34;""", str)
- str = re.sub(r"""\\'""", r"""&#39;""", str)
- str = re.sub(r"""\\\.""", r"""&#46;""", str)
- str = re.sub(r"""\\-""", r"""&#45;""", str)
- str = re.sub(r"""\\`""", r"""&#96;""", str)
-
- return str
-
-
-def _tokenize(str):
- """
- Parameter: String containing HTML markup.
- Returns: Reference to an array of the tokens comprising the input
- string. Each token is either a tag (possibly with nested,
- tags contained therein, such as <a href="<MTFoo>">, or a
- run of text between tags. Each element of the array is a
- two-element array; the first is either 'tag' or 'text';
- the second is the actual value.
-
- Based on the _tokenize() subroutine from Brad Choate's MTRegex plugin.
- <http://www.bradchoate.com/past/mtregex.php>
- """
-
- pos = 0
- length = len(str)
- tokens = []
-
- depth = 6
- nested_tags = "|".join(['(?:<(?:[^<>]',] * depth) + (')*>)' * depth)
- #match = r"""(?: <! ( -- .*? -- \s* )+ > ) | # comments
- # (?: <\? .*? \?> ) | # directives
- # %s # nested tags """ % (nested_tags,)
- tag_soup = re.compile(r"""([^<]*)(<[^>]*>)""")
-
- token_match = tag_soup.search(str)
-
- previous_end = 0
- while token_match is not None:
- if token_match.group(1) != "":
- tokens.append(['text', token_match.group(1)])
-
- tokens.append(['tag', token_match.group(2)])
-
- previous_end = token_match.end()
- token_match = tag_soup.search(str, token_match.end())
-
- if previous_end < len(str):
- tokens.append(['text', str[previous_end:]])
-
- return tokens
-
-
-
-if __name__ == "__main__":
-
- import locale
-
- try:
- locale.setlocale(locale.LC_ALL, '')
- except:
- pass
-
- from docutils.core import publish_string
- docstring_html = publish_string(__doc__, writer_name='html')
-
- print docstring_html
-
-
- # Unit test output goes out stderr. No worries.
- import unittest
- sp = smartyPants
-
- class TestSmartypantsAllAttributes(unittest.TestCase):
- # the default attribute is "1", which means "all".
-
- def test_dates(self):
- self.assertEqual(sp("1440-80's"), "1440-80&#8217;s")
- self.assertEqual(sp("1440-'80s"), "1440-&#8216;80s")
- self.assertEqual(sp("1440---'80s"), "1440&#8211;&#8216;80s")
- self.assertEqual(sp("1960s"), "1960s") # no effect.
- self.assertEqual(sp("1960's"), "1960&#8217;s")
- self.assertEqual(sp("one two '60s"), "one two &#8216;60s")
- self.assertEqual(sp("'60s"), "&#8216;60s")
-
- def test_ordinal_numbers(self):
- self.assertEqual(sp("21st century"), "21st century") # no effect.
- self.assertEqual(sp("3rd"), "3rd") # no effect.
-
- def test_educated_quotes(self):
- self.assertEqual(sp('''"Isn't this fun?"'''), '''&#8220;Isn&#8217;t this fun?&#8221;''')
-
- unittest.main()
-
-
-
-
-__author__ = "Chad Miller <smartypantspy@chad.org>"
-__version__ = "1.5_1.5: Sat, 13 Aug 2005 15:50:24 -0400"
-__url__ = "http://wiki.chad.org/SmartyPantsPy"
-__description__ = "Smart-quotes, smart-ellipses, and smart-dashes for weblog entries in pyblosxom"
View
12 django_website/apps/docs/urls.py
@@ -1,12 +0,0 @@
-from django.conf.urls.defaults import *
-
-urlpatterns = patterns('django_website.apps.docs.views',
- url(r'^$', 'doc_index', name="doc_index"),
- (r'^(?P<version>[\d.]+)/$', 'doc_index'),
- (r'^models/$', 'model_index'),
- (r'^models/(?P<slug>\w+)/$', 'model_detail'),
- (r'^(?P<version>[\d.]+)/models/$', 'model_index'),
- (r'^(?P<version>[\d.]+)/models/(?P<slug>\w+)/$', 'model_detail'),
- #(r'^(?P<slug>[\w\.-]+)/$', 'doc_detail'),
- (r'^(?P<version>[\d.]+)/(?P<slug>[\w\.-]+)/$', 'doc_detail'),
-)
View
121 django_website/apps/docs/views.py
@@ -1,121 +0,0 @@
-import os
-import re
-import datetime
-import urlparse
-from django.conf import settings
-from django.core.cache import cache
-from django.http import Http404, HttpResponseRedirect
-from django.shortcuts import get_object_or_404, render_to_response
-from django.template import RequestContext
-from django_website.apps.docs.models import DocumentRelease
-from django_website.apps.docs import builder
-import pysvn
-
-REVISION = pysvn.Revision(pysvn.opt_revision_kind.number, 8503)
-
-def doc_index(request, version=None):
- client, version, docroot = _get_svnroot(version, "docs/")
- doclist = client.ls(docroot, recurse=False, revision=REVISION)
-
- # Convert list of URLs to list of document slugs.
- doclist = [os.path.splitext(os.path.basename(doc.name))[0] for doc in doclist]
- doclist.sort()
-
- return render_to_response(
- ["docs/%s_index.html" % version, "docs/index.html"],
- {"version" : version, "document_list" : doclist, "all_versions" : DocumentRelease.objects.all()},
- RequestContext(request, {})
- )
-
-def doc_detail(request, slug, version=None):
- client, version, docroot = _get_svnroot(version, "docs/")
-
- docpath = urlparse.urljoin(docroot, slug+".txt")
- try:
- name, info = client.info2(docpath, revision=REVISION)[0]
- except pysvn.ClientError:
- raise Http404("Invalid doc: %r (version %r)" % (slug, version))
-
- cache_key = "djangowebsite:docs:%s:%s:%s" % (version, slug, info.rev.number)
- parts = cache.get(cache_key)
- if parts is None:
- parts = builder.build_document(client.cat(docpath, revision=REVISION))
- cache.set(cache_key, parts, 60*60)
-
- template_list = ["docs/%s_detail.html" % version, "docs/detail.html"]
- context = {
- "doc" : parts,
- "version" : version,
- "all_versions" : DocumentRelease.objects.all(),
- "slug" : slug,
- "update_date" : datetime.datetime.fromtimestamp(info.last_changed_date),
- }
- return render_to_response(template_list, context, RequestContext(request, {}))
-
-docstring_re = re.compile(r"([\"']{3})(.*?)(\1)", re.DOTALL|re.MULTILINE)
-def model_index(request, version=None):
- client, version, testroot = _get_svnroot(version, "tests/modeltests/")
-
- cache_key = "djangowebsite:docs:modelindex:%s" % version
- model_docs = cache.get(cache_key, [])
- if not model_docs:
- for testdir in client.ls(testroot, revision=REVISION):
- try:
- content = client.cat(os.path.join(testdir.name, "models.py"), revision=REVISION)
- except pysvn.ClientError:
- continue
-
- try:
- title, blurb = docstring_re.match(content).group(2).strip().split('\n', 1)
- except (AttributeError, ValueError):
- continue # Skip models that don't have docstrings.
-
- try:
- number, title = title.split(". ", 1)
- number = int(number)
- except ValueError:
- continue
- model_docs.append({"title" : title, "link" : os.path.basename(testdir.name), "number" : number})
-
- model_docs.sort(lambda a,b: cmp(a["number"], b["number"]))
-
- cache.set(cache_key, model_docs, 60*60)
-
- return render_to_response(
- ["docs/%s_model_index.html" % version, "docs/model_index.html"],
- {"example_list" : model_docs, "version" : version, "all_versions" : DocumentRelease.objects.all()},
- RequestContext(request, {})
- )
-
-def model_detail(request, slug, version=None):
- client, version, modelfile = _get_svnroot(version, "tests/modeltests/%s/models.py" % slug)
- name, info = client.info2(modelfile, revision=REVISION)[0]
-
- cache_key = "djangowebsite:docs:model:%s:%s:%s" % (version, slug, info.rev.number)
- parts = cache.get(cache_key)
- if parts is None:
- parts = builder.build_model_document(client.cat(modelfile, revision=REVISION))
- cache.set(cache_key, parts, 60*60)
-
- return render_to_response(
- ["docs/%s_model_detail.html" % version, "docs/model_detail.html"],
- {"doc" : parts, "version" : version, "all_versions" : DocumentRelease.objects.all(), "slug" : slug},
- )
-
-def _get_svnroot(version, subpath):
- client = pysvn.Client()
-
- if version is None:
- version = "trunk"
- subpath = os.path.join("trunk/", subpath)
- else:
- rel = get_object_or_404(DocumentRelease, version=version)
- subpath = os.path.join(rel.repository_path, subpath)
- docroot = urlparse.urljoin(settings.DJANGO_SVN_ROOT, subpath)
-
- try:
- client.info2(docroot, recurse=False, revision=REVISION)
- except pysvn.ClientError:
- raise Http404("Bad SVN path: %s" % docroot)
-
- return client, version, docroot
View
0  django_website/apps/blog/__init__.py → django_website/blog/__init__.py
File renamed without changes
View
4 django_website/apps/blog/admin.py → django_website/blog/admin.py
@@ -1,5 +1,7 @@
+from __future__ import absolute_import
+
from django.contrib import admin
-from django_website.apps.blog.models import Entry
+from .models import Entry
admin.site.register(Entry,
list_display = ('pub_date', 'headline', 'author'),
View
6 django_website/apps/blog/feeds.py → django_website/blog/feeds.py
@@ -1,6 +1,8 @@
-from django.contrib.syndication.feeds import Feed
-from django_website.apps.blog.models import Entry
+from __future__ import absolute_import
+
import datetime
+from django.contrib.syndication.feeds import Feed
+from .models import Entry
class WeblogEntryFeed(Feed):
title = "The Django weblog"
View
0  django_website/apps/blog/models.py → django_website/blog/models.py
File renamed without changes
View
0  ...e/apps/aggregator/management/commands/__init__.py → django_website/blog/templatetags/__init__.py
File renamed without changes
View
4 django_website/apps/blog/templatetags/weblog.py → django_website/blog/templatetags/weblog.py
@@ -1,6 +1,8 @@
+from __future__ import absolute_import
+
import datetime
from django import template
-from django_website.apps.blog.models import Entry
+from .models import Entry
register = template.Library()
View
4 django_website/apps/blog/urls.py → django_website/blog/urls.py
@@ -1,5 +1,7 @@
+from __future__ import absolute_import
+
from django.conf.urls.defaults import *
-from models import Entry # relative import
+from .models import Entry
info_dict = {
'queryset': Entry.objects.all(),
View
0  django_website/apps/aggregator/__init__.py → django_website/contact/__init__.py
File renamed without changes
View
0  django_website/apps/contact/forms.py → django_website/contact/forms.py
File renamed without changes
View
4 django_website/apps/contact/urls.py → django_website/contact/urls.py
@@ -1,7 +1,9 @@
+from __future__ import absolute_import
+
from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template
from contact_form.views import contact_form
-from django_website.apps.contact.forms import FoundationContactForm
+from .forms import FoundationContactForm
urlpatterns = patterns('',
url(
View
0  django_website/apps/accounts/__init__.py → django_website/legacy/__init_.py
File renamed without changes
View
18 django_website/legacy/docurls.py
@@ -0,0 +1,18 @@
+"""
+Legacy URLs for documentation pages.
+"""
+
+from __future__ import absolute_import
+
+from django.conf.urls.defaults import *
+from .views import gone
+
+urlpatterns = patterns('',
+ (r'^$', gone),
+ (r'^(?P<version>[\d.]+)/$', gone),
+ (r'^models/$', gone),
+ (r'^models/(?P<slug>\w+)/$', gone),
+ (r'^(?P<version>[\d.]+)/models/$', gone),
+ (r'^(?P<version>[\d.]+)/models/(?P<slug>\w+)/$', gone),
+ (r'^(?P<version>[\d.]+)/(?P<slug>[\w\.-]+)/$', gone),
+)
View
10 django_website/legacy/views.py
@@ -0,0 +1,10 @@
+from django import template
+from django.http import HttpResponseGone
+
+def gone(request, *args, **kwargs):
+ """
+ Display a nice 410 gone page.
+ """
+ t = template.loader.get_template('410.html')
+ c = template.RequestContext(request, {'request': request})
+ return HttpResponseGone(t.render(c))
View
16 django_website/middleware.py
@@ -0,0 +1,16 @@
+class SetRemoteAddr(object):
+ """
+ Set the remote addr to the actual real IP, not the IP of the load
+ balancer. This assumes running behind Nginx with something like::
+
+ location / {
+ proxy_pass http://localhost:8000;
+ proxy_set_header X-Real-IP $remote_addr;
+ }
+ """
+
+ def process_request(self, request):
+ try:
+ request.META['REMOTE_ADDR'] = request.META['HTTP_X_REAL_IP']
+ except KeyError:
+ pass
View
14 django_website/settings.py
@@ -6,7 +6,7 @@
ADMINS = (('Adrian Holovaty','holovaty@gmail.com'), ('Jacob Kaplan-Moss', 'jacob@jacobian.org'))
TIME_ZONE = 'America/Chicago'
-SERVER_EMAIL = 'root@pam.servers.ljworld.com'
+SERVER_EMAIL = 'root@djangoproject.com'
MANAGERS = (('Jacob Kaplan-Moss','jacob@jacobian.org'),)
DATABASE_ENGINE = 'postgresql_psycopg2'
@@ -45,9 +45,9 @@
'django.contrib.redirects',
'django.contrib.sessions',
'django.contrib.sitemaps',
- 'django_website.apps.blog',
- 'django_website.apps.docs',
- 'django_website.apps.aggregator',
+ 'django_website.blog',
+ 'django_website.docs',
+ 'django_website.aggregator',
'registration',
)
@@ -82,9 +82,3 @@
# comment_utils settings
AKISMET_API_KEY = "c892e4962244"
-
-try:
- from local_settings import *
-except ImportError:
- pass
-
View
6 django_website/sitemaps.py
@@ -1,7 +1,9 @@
+from __future__ import absolute_import
+
+import datetime
from django.contrib.sitemaps import Sitemap
-from django_website.apps.blog.models import Entry
from django.contrib.flatpages.models import FlatPage
-import datetime
+from .blog.models import Entry
class FlatPageSitemap(Sitemap):
"""
View
12 django_website/urls.py
@@ -1,14 +1,16 @@
+from __future__ import absolute_import
+
from django.conf import settings
from django.conf.urls.defaults import *
from django.contrib import admin
from django.contrib.comments.feeds import LatestCommentFeed
from django.contrib.comments.models import Comment
from django.contrib.sitemaps import views as sitemap_views
-from django_website.apps.aggregator.feeds import CommunityAggregatorFeed
-from django_website.apps.aggregator.models import FeedItem
-from django_website.apps.blog.feeds import WeblogEntryFeed
-from django_website.sitemaps import FlatPageSitemap, WeblogSitemap
from django.views.decorators.cache import cache_page
+from .aggregator.feeds import CommunityAggregatorFeed
+from .aggregator.models import FeedItem
+from .blog.feeds import WeblogEntryFeed
+from .sitemaps import FlatPageSitemap, WeblogSitemap
comments_info_dict = {
'queryset': Comment.objects.filter(is_public=True).order_by('-submit_date'),
@@ -45,7 +47,7 @@
name="community-feed-list"),
url(r'^community/', 'django_website.apps.aggregator.views.index', name='community-index'),
(r'^contact/', include('django_website.apps.contact.urls')),
- (r'^documentation/', include('django_website.apps.docs.urls')),
+ (r'^documentation/', include('django_website.legacy.docurls')),
(r'^r/', include('django.conf.urls.shortcut')),
(r'^rss/(?P<url>.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict': feeds}),
(r'^sitemap\.xml$', cache_page(sitemap_views.sitemap, 60 * 60 * 6), {'sitemaps': sitemaps}),
View
4 requirements.txt
@@ -0,0 +1,4 @@
+Django >= 1.2, < 1.3
+django-registration == 0.7
+akismet == 0.2.0
+FeedParser == 4.1
Please sign in to comment.
Something went wrong with that request. Please try again.