├── INSTALL ├── LICENSE ├── Makefile ├── README ├── __init__.py ├── aggregator ├── __init__.py ├── admin.py ├── bin │ ├── mark_defunct_feeds.py │ └── update_feeds.py ├── feeds.py ├── models.py └── templatetags │ ├── __init__.py │ └── aggregator.py ├── blog ├── __init__.py ├── admin.py ├── feeds.py ├── models.py ├── templatetags │ ├── __init__.py │ └── latestblogentry.py └── urls.py ├── captcha ├── __init__.py ├── fields.py ├── forms.py ├── views.py └── widgets.py ├── community ├── __init__.py ├── admin.py ├── feeds.py ├── models.py ├── subscriptions.py ├── summary.py ├── urls.py └── views.py ├── cran └── update_cran.py ├── forshow ├── __init__.py ├── admin.py ├── models.py └── views.py ├── manage.py ├── media ├── css │ └── base.css └── images │ ├── bib.png │ ├── bookmark.png │ ├── cray_flat_small.png │ ├── cray_small.png │ ├── disk.png │ ├── homepage.png │ ├── jmlr.jpg │ ├── mloss.png │ ├── mloss_flat_small.png │ ├── mloss_logo_new.jpg │ ├── mloss_logo_new.png │ ├── mloss_small.png │ ├── mloss_transparent_small.png │ ├── paper.png │ ├── rlogo.png │ ├── rss.png │ ├── stars │ ├── blank.png │ ├── half.png │ ├── quarter.png │ ├── star.png │ └── three-quarter.png │ ├── subscribe.png │ └── temp-logo.jpg ├── registration ├── __init__.py ├── admin.py ├── auth_urls.py ├── backends │ ├── __init__.py │ ├── default │ │ ├── __init__.py │ │ └── urls.py │ └── simple │ │ ├── __init__.py │ │ └── urls.py ├── forms.py ├── locale │ ├── ar │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── bg │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── da │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── de │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── el │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── en │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── es │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── es_AR │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── fr │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── he │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── is │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── it │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ja │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ko │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── nl │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── pl │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── pt_BR │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── ru │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── sl │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── sr │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── sv │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ ├── zh_CN │ │ └── LC_MESSAGES │ │ │ ├── django.mo │ │ │ └── django.po │ └── zh_TW │ │ └── LC_MESSAGES │ │ ├── django.mo │ │ └── django.po ├── management │ ├── __init__.py │ └── commands │ │ ├── __init__.py │ │ └── cleanupregistration.py ├── models.py ├── signals.py └── views.py ├── revision ├── __init__.py ├── admin.py ├── models.py ├── urls.py └── views.py ├── scripts └── fix_jmlr_subs.py ├── settings.py ├── software ├── __init__.py ├── admin.py ├── feeds.py ├── forms.py ├── models.py ├── templatetags │ ├── __init__.py │ ├── get_version.py │ ├── paginator.py │ ├── permute_items.py │ ├── safe_markup.py │ └── show_stars.py ├── urls.py └── views │ ├── __init__.py │ ├── entry.py │ └── list.py ├── subscriptions ├── __init__.py ├── admin.py └── models.py ├── subscriptions2 ├── __init__.py ├── admin.py └── models.py ├── templates ├── 404.html ├── 500.html ├── aggregator │ └── feeditem_list.html ├── author_list.html ├── base.html ├── base_2col.html ├── base_workshop.html ├── blog │ ├── blogitem_archive_day.html │ ├── blogitem_archive_month.html │ ├── blogitem_archive_year.html │ └── blogitem_detail.html ├── comments │ ├── form.html │ ├── posted.html │ └── preview.html ├── community │ ├── blog_list.html │ ├── forum_base.html │ ├── forum_list.html │ ├── summary.html │ ├── thread.html │ └── thread_list.html ├── faq_index.html ├── flatpages │ └── default.html ├── news_index.html ├── paginator.html ├── registration │ ├── activate.html │ ├── activation_complete.html │ ├── activation_email.txt │ ├── activation_email_subject.txt │ ├── login.html │ ├── logout.html │ ├── password_change_done.html │ ├── password_change_form.html │ ├── password_reset_complete.html │ ├── password_reset_confirm.html │ ├── password_reset_done.html │ ├── password_reset_email.html │ ├── password_reset_form.html │ ├── registration_complete.html │ └── registration_form.html ├── software │ ├── author_list.html │ ├── base_software.html │ ├── dataformat_list.html │ ├── language_list.html │ ├── license_list.html │ ├── opsys_list.html │ ├── software_add.html │ ├── software_contact_author.html │ ├── software_detail.html │ ├── software_list.html │ ├── tag_list.html │ └── user_list.html └── users │ ├── user_change_done.html │ ├── user_detail.html │ └── user_list.html ├── templatetags ├── __init__.py ├── get_version.py ├── paginator.py ├── permute_items.py ├── safe_markup.py └── show_stars.py ├── update_feeds.sh ├── urls.py ├── user ├── __init__.py ├── urls.py └── views.py ├── utils.py └── wfwfeed.py /INSTALL: -------------------------------------------------------------------------------- 1 | svn co http://code.djangoproject.com/svn/django/trunk/ Django 2 | 3 | # sqlite3 is installed on my mac 4 | sudo port install py-sqlite py-pil py-readline 5 | 6 | # start a new project 7 | django-admin.py startproject mloss 8 | cd mloss 9 | python manage.py runserver 10 | 11 | # start a new app 12 | python manage.py startapp 13 | # check whether ok 14 | python manage.py validate 15 | 16 | # list sql commands to CREATE TABLE 17 | python manage.py sqlall 18 | # do CREATE TABLE 19 | python manage.py syncdb 20 | # for SQL freaks 21 | python manage.py dbshell 22 | 23 | 24 | # cab, the app on djangosnippets 25 | svn checkout http://cab.googlecode.com/svn/trunk/ cab 26 | # requires markdown 27 | http://sourceforge.net/project/showfiles.php?group_id=153041 28 | # requires pygments 29 | svn co http://trac.pocoo.org/repos/pygments/trunk pygments 30 | # get registration from googlecode http://code.google.com/p/django-registration/ 31 | 32 | 33 | # How to set up a django server 34 | http://www.lethain.com/entry/2007/jul/17/dreamier-dream-server-nginx/ 35 | 36 | 37 | 38 | # Some free style sheets 39 | http://www.freecsstemplates.org/ 40 | 41 | 42 | # how to update tables 43 | python manage.py dumpdata software > software.json 44 | python manage.py sqlclear software > software_drop.sql 45 | python manage.py dbshell 46 | # -- inside the sqlite shell, paste the commands in software_drop.sql 47 | % -- to exit, type .exit 48 | # -- update your model after getting rid of the tables 49 | python manage.py syncdb 50 | python manage.py loaddata software.json 51 | 52 | 53 | 54 | 55 | # how to export from svn to production 56 | make release 57 | 58 | 59 | # admin script to tidy up orphans 60 | python manage.py shell 61 | from software.models import clean_all 62 | clean_all() 63 | 64 | # sqlite -> mysql conversion 65 | PYTHONPATH=. python ../admintools/db_dump.py dump 66 | now switch to mysql (empty db) 67 | python manage.py syncdb 68 | PYTHONPATH=. python ../admintools/db_dump.py load 69 | 70 | #the manual way below does not work reliably!!! 71 | # 72 | #sqlite3 mloss.db .dump .quit >~/mloss_sqlite.dump 73 | #edit mloss_sqlite.dump 74 | #replace all " with ` ( grave backticks!) 75 | #remove "BEGIN TRANSACTION;" 76 | #remove "COMMIT;" 77 | #-> now switch to mysql 78 | #python manage.py syncdb 79 | #mysql -p mloss mloss/mloss.dump 16 | # ( ssh -p 65514 mloss@zut.tuebingen.mpg.de chmod 700 mysql_to_sqlite.sh \; ./mysql_to_sqlite.sh ) | sqlite3 mloss/mloss.db 17 | # ssh -p 65514 mloss@zut.tuebingen.mpg.de rm -f mysql_to_sqlite.sh 18 | # 19 | release: clean 20 | # svn commit 21 | # svn update 22 | #git pull 23 | rm -rf $(RELEASEDIR)/$(RELEASENAME) 24 | # svn export mloss $(RELEASEDIR)/$(RELEASENAME) 25 | git checkout-index -f -a --prefix=$(RELEASEDIR)/$(RELEASENAME)/ 26 | ssh mloss@${HOST} rm -rf $(WEBSITEDIR)/$(RELEASENAME) 27 | tar cjvf - -C releases --exclude 'mloss.db' $(RELEASENAME) | \ 28 | ssh mloss@${HOST} \ 29 | \( tar -xjvf - -C $(WEBSITEDIR) \; sync \; sync \; sync \; \ 30 | sed -i "s#XXXXXXXXX#\`cat /home/mloss/.mysql_password\`#" $(WEBSITEDIR)/$(RELEASENAME)/settings.py \; \ 31 | sed -i "s#RECAPTCHAPUBLIC#\`cat /home/mloss/.recaptcha_public\`#" $(WEBSITEDIR)/$(RELEASENAME)/settings.py \; \ 32 | sed -i "s#RECAPTCHAPRIVATE#\`cat /home/mloss/.recaptcha_private\`#" $(WEBSITEDIR)/$(RELEASENAME)/settings.py \; \ 33 | sed -i '"s/^PRODUCTION = False/PRODUCTION = True/g"' $(WEBSITEDIR)/$(RELEASENAME)/settings.py \; \ 34 | sed -i '"s/^VERSION = \"r0000\"/VERSION = \"$(VER)\"/g"' $(WEBSITEDIR)/$(RELEASENAME)/settings.py \; \python -mcompileall $(WEBSITEDIR)/$(RELEASENAME)/ \; \ 35 | find $(WEBSITEDIR)/$(RELEASENAME) -type d -exec chmod 755 {} '\;' \; \ 36 | find $(WEBSITEDIR)/$(RELEASENAME) -type f -exec chmod 644 {} '\;' \; \ 37 | chmod 640 $(WEBSITEDIR)/$(RELEASENAME)/settings.py\* \; \ 38 | cp $(WEBSITEDIR)/$(RELEASENAME)/media/css/base.css static/media/css/base.css \; \ 39 | chmod 644 static/media/css/base.css \; \ 40 | cd $(WEBSITEDIR) \; ln -snf $(RELEASENAME) mloss \; \ 41 | chmod 755 /home/mloss/bin/update_*.sh \; \ 42 | sudo /etc/init.d/fapws3 restart \ 43 | \) 44 | rm -rf $(RELEASEDIR)/$(RELEASENAME) 45 | 46 | tar: clean 47 | rm -rf "$(RELEASEDIR)/$(RELEASENAME)" 48 | svn export mloss $(RELEASEDIR)/$(RELEASENAME) 49 | cd $(RELEASEDIR) && tar cjvf $(RELEASETAR) $(RELEASENAME) 50 | rm -rf "$(RELEASEDIR)/$(RELEASENAME)" 51 | 52 | clean: 53 | find ./ -name '*.pyc' -delete 54 | find ./ -name '*.swp' -delete 55 | -------------------------------------------------------------------------------- /README: -------------------------------------------------------------------------------- 1 | This is the source code of the mloss.org website. It was written by the 2 | mloss team, which currently is (in alphabetical order) 3 | 4 | Mikio Braun 5 | Cheng Soon Ong 6 | Soeren Sonnenburg 7 | 8 | 9 | FEATURES 10 | 11 | The website contains quite a few features and is also quite specific, 12 | so you may or may not find it useful for your means. The features include: 13 | 14 | * a registration system for users of the site 15 | * a database of user submitted software projects 16 | * a rating system for the projects 17 | * a commenting system for the projects 18 | * access-statistics to the projects 19 | * a blog (although articles have to be entered directly through django's 20 | admin interface) 21 | * a forum 22 | * email notifications for tracking projects and the forum 23 | * a tool which automatically extracts projects in the "machine learning" 24 | section from CRAN (a repository for packages for the R programming 25 | language) 26 | 27 | The source code is organized into several sub-directories, so called 28 | "applications". Each directory is organized more or less according to 29 | the django standard, at least containing a definition of the models in 30 | models.py, and of the url mappings in urls.py. If you want to find out 31 | how a specific url is processed, have a look at the urls.py which tell 32 | you which method takes care of the request. 33 | 34 | CHANGELOG 35 | 36 | mloss.org svn-r482-September-2008 37 | 38 | * Several bugfixes and adjustments related to last minute 39 | changes in django 1.0: 40 | 41 | - comments now don't require a password 42 | - search didn't work when returning >10 results 43 | - added #of subscriptions to list view 44 | - better interlinking between forum and blog 45 | - fix comments links in blog and show archive, 46 | - option to filter by published in JMLR 47 | - minor style changes 48 | - change sorting order in forum (new threads first) 49 | 50 | mloss.org svn-r470-August-2008 51 | 52 | * Initial Release 53 | 54 | LICENSE 55 | 56 | The source code is licensed under GPLv3, and incorporates the work of 57 | a number of projects, cf. LICENSE for details. 58 | 59 | 60 | INSTALLING 61 | 62 | This website is built using the django framework 63 | (http://www.djangoproject.com). Refer to that website for general 64 | information about the framework. An online version of a very nice book 65 | on django can be found at http://www.djangobook.com/ . 66 | 67 | Download Django 1.0 or a recent svn snapshot 68 | 69 | svn co http://code.djangoproject.com/svn/django/trunk/ Django 70 | 71 | and install it via the usual python setup.py install. 72 | 73 | To locally test out the mloss.org webpage untar the source and run 74 | 75 | python manage.py migrate 76 | python manage.py runserver 77 | 78 | then open http://127.0.0.1:8000 in a web browser and have fun. 79 | 80 | In case you want to put things live follow the steps described at 81 | http://www.djangoproject.com/documentation/modpython/. 82 | 83 | Sincerely, 84 | your mloss team. 85 | -------------------------------------------------------------------------------- /__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /aggregator/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/aggregator/__init__.py -------------------------------------------------------------------------------- /aggregator/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from aggregator.models import Feed 3 | 4 | class FeedAdmin(admin.ModelAdmin): 5 | pass 6 | 7 | admin.site.register(Feed, FeedAdmin) 8 | -------------------------------------------------------------------------------- /aggregator/bin/mark_defunct_feeds.py: -------------------------------------------------------------------------------- 1 | """ 2 | Mark people with 404'ing feeds as defunct. 3 | """ 4 | 5 | for f in Feed.objects.all(): 6 | try: 7 | r = urllib2.urlopen(f.feed_url) 8 | except urllib2.HTTPError, e: 9 | if e.code == 404 or e.code == 500: 10 | print "%s on %s; marking defunct" % f 11 | f.is_defunct = True 12 | f.save() 13 | else: 14 | raise -------------------------------------------------------------------------------- /aggregator/bin/update_feeds.py: -------------------------------------------------------------------------------- 1 | """ 2 | Update feeds for Django community page. Requires Mark Pilgrim's excellent 3 | Universal Feed Parser (http://feedparser.org) 4 | """ 5 | 6 | import os 7 | import sys 8 | import time 9 | import optparse 10 | import datetime 11 | import feedparser 12 | 13 | sys.path.insert(0,'/home/mloss/django/') 14 | sys.path.insert(0,'/home/mloss/django/mloss/') 15 | 16 | os.environ['DJANGO_SETTINGS_MODULE'] = 'mloss.settings' 17 | 18 | def update_feeds(): 19 | from aggregator.models import Feed, FeedItem 20 | for feed in Feed.objects.filter(is_defunct=False): 21 | parsed_feed = feedparser.parse(feed.feed_url) 22 | print 'Reading ' + feed.title + ' with ' + str(len(parsed_feed.entries)) + ' entries.' 23 | if len(parsed_feed.entries) == 0: 24 | print 'No feed entries found, error is...' 25 | print parsed_feed.bozo_exception 26 | for entry in parsed_feed.entries: 27 | title = entry.title.encode(parsed_feed.encoding, "xmlcharrefreplace") 28 | print 'Updating ' + title 29 | guid = entry.get("id", entry.link).encode(parsed_feed.encoding, "xmlcharrefreplace") 30 | link = entry.link.encode(parsed_feed.encoding, "xmlcharrefreplace") 31 | 32 | if not guid: 33 | guid = link 34 | 35 | if hasattr(entry, "summary"): 36 | content = entry.summary 37 | elif hasattr(entry, "content"): 38 | content = entry.content[0].value 39 | elif hasattr(entry, "description"): 40 | content = entry.description 41 | else: 42 | content = u"" 43 | content = content.encode(parsed_feed.encoding, "xmlcharrefreplace") 44 | 45 | try: 46 | if entry.has_key('modified_parsed'): 47 | date_modified = datetime.datetime.fromtimestamp(time.mktime(entry.modified_parsed)) 48 | elif parsed_feed.feed.has_key('modified_parsed'): 49 | date_modified = datetime.datetime.fromtimestamp(time.mktime(parsed_feed.feed.modified_parsed)) 50 | elif parsed_feed.has_key('modified'): 51 | date_modified = datetime.datetime.fromtimestamp(time.mktime(parsed_feed.modified)) 52 | else: 53 | date_modified = datetime.datetime.now() 54 | except TypeError: 55 | date_modified = datetime.datetime.now() 56 | 57 | try: 58 | feed.feeditem_set.get(guid=guid) 59 | except FeedItem.DoesNotExist: 60 | feed.feeditem_set.create(title=title[:200], link=link, summary=content, guid=guid, date_modified=date_modified) 61 | 62 | if __name__ == '__main__': 63 | parser = optparse.OptionParser() 64 | parser.add_option('--settings') 65 | options, args = parser.parse_args() 66 | if options.settings: 67 | os.environ["DJANGO_SETTINGS_MODULE"] = options.settings 68 | update_feeds() 69 | -------------------------------------------------------------------------------- /aggregator/feeds.py: -------------------------------------------------------------------------------- 1 | from django.contrib.syndication.views import Feed 2 | from aggregator.models import FeedItem 3 | 4 | class CommunityAggregatorFeed(Feed): 5 | title = "The mloss.org community aggregator" 6 | link = "http://mloss.org" 7 | description = "Aggregated feeds from the machine learning community." 8 | 9 | def items(self): 10 | return FeedItem.objects.all()[:10] 11 | -------------------------------------------------------------------------------- /aggregator/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | 3 | class Feed(models.Model): 4 | title = models.CharField(max_length=200) 5 | feed_url = models.URLField(unique=True) 6 | public_url = models.URLField() 7 | is_defunct = models.BooleanField() 8 | 9 | class Meta: 10 | db_table = 'aggregator_feeds' 11 | 12 | def __unicode__(self): 13 | return unicode(self.title) 14 | 15 | class FeedItem(models.Model): 16 | feed = models.ForeignKey(Feed) 17 | title = models.CharField(max_length=200) 18 | link = models.URLField() 19 | summary = models.TextField(blank=True) 20 | date_modified = models.DateTimeField() 21 | guid = models.CharField(max_length=200, unique=True, db_index=True) 22 | 23 | class Meta: 24 | db_table = 'aggregator_feeditems' 25 | ordering = ("-date_modified",) 26 | 27 | def __unicode__(self): 28 | return unicode(self.title) 29 | 30 | def get_absolute_url(self): 31 | return self.link 32 | 33 | -------------------------------------------------------------------------------- /aggregator/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/aggregator/templatetags/__init__.py -------------------------------------------------------------------------------- /aggregator/templatetags/aggregator.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | 3 | 4 | class FeedListNode(template.Node): 5 | def __init__(self, varname): 6 | self.varname = varname 7 | 8 | def render(self, context): 9 | from aggregator.models import Feed 10 | context[self.varname] = Feed.objects.filter(is_defunct=False) 11 | return '' 12 | 13 | def do_get_feed_list(parser, token): 14 | """ 15 | {% get_feed_list as feed_list %} 16 | """ 17 | bits = token.contents.split() 18 | if len(bits) != 3: 19 | raise template.TemplateSyntaxError("'%s' tag takes two arguments" % bits[0]) 20 | 21 | if bits[1] != "as": 22 | raise template.TemplateSyntaxError("First argument to '%s' tag must be 'as'" % bits[0]) 23 | 24 | return FeedListNode(bits[2]) 25 | 26 | 27 | register = template.Library() 28 | register.tag('get_feed_list', do_get_feed_list) 29 | -------------------------------------------------------------------------------- /blog/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/blog/__init__.py -------------------------------------------------------------------------------- /blog/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from blog.models import BlogItem 3 | 4 | class BlogItemAdmin(admin.ModelAdmin): 5 | list_display = ('pub_date', 'headline', 'author') 6 | 7 | 8 | admin.site.register(BlogItem, BlogItemAdmin) -------------------------------------------------------------------------------- /blog/feeds.py: -------------------------------------------------------------------------------- 1 | from wfwfeed import WellFormedWebRss 2 | from blog.models import BlogItem 3 | from django.contrib.sites.models import Site 4 | from django.http import HttpResponse 5 | from markdown import markdown 6 | 7 | from community.summary import get_latest_news 8 | from django.views.generic.list import ListView 9 | from django.views.generic.dates import YearArchiveView 10 | from django.views.generic.dates import MonthArchiveView 11 | from django.views.generic.dates import DateDetailView 12 | 13 | 14 | class BlogView(ListView): 15 | context_object_name='latest' 16 | 17 | def get_template_names(self): 18 | return 'community/blog_list.html' 19 | 20 | def get_queryset(self, **kwargs): 21 | return BlogItem.objects.all() 22 | 23 | def get_context_data(self, **kwargs): 24 | context=super(BlogView, self).get_context_data(**kwargs) 25 | context.update(get_latest_news()) 26 | return context 27 | 28 | class DetailView(DateDetailView): 29 | queryset=BlogItem.objects.all() 30 | date_field = "pub_date" 31 | 32 | def get_context_data(self, **kwargs): 33 | context=super(DetailView, self).get_context_data(**kwargs) 34 | context.update(get_latest_news()) 35 | return context 36 | 37 | class YearView(YearArchiveView): 38 | queryset=BlogItem.objects.all() 39 | date_field = "pub_date" 40 | 41 | def get_context_data(self, **kwargs): 42 | context=super(YearView, self).get_context_data(**kwargs) 43 | context.update(get_latest_news()) 44 | return context 45 | 46 | class MonthView(MonthArchiveView): 47 | queryset=BlogItem.objects.all() 48 | date_field = "pub_date" 49 | 50 | def get_context_data(self, **kwargs): 51 | context=super(MonthView, self).get_context_data(**kwargs) 52 | context.update(get_latest_news()) 53 | return context 54 | 55 | def RssBlogFeed(request): 56 | try: 57 | object_list = BlogItem.objects.all().order_by('-pub_date')[:10] 58 | except documents.DocumentDoesNotExist: 59 | raise Http404 60 | feed = WellFormedWebRss( u"The mloss.org community blog", 61 | "http://mloss.org/community", 62 | u'Some thoughts about machine learning open source software', 63 | language=u"en") 64 | 65 | for object in object_list: 66 | link = 'http://%s%s' % (Site.objects.get_current().domain, object.get_absolute_url()) 67 | #commentlink=u'http://%s/software/rss/comments/%i' % (Site.objects.get_current().domain, object.id) 68 | #comments=commentlink, 69 | feed.add_item( object.headline.encode('utf-8'), 70 | link, markdown(object.body), 71 | author_name=object.author.encode('utf-8'), 72 | pubdate=object.pub_date, unique_id=link) 73 | response = HttpResponse(mimetype='application/xml') 74 | feed.write(response, 'utf-8') 75 | return response 76 | -------------------------------------------------------------------------------- /blog/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from utils import slugify 3 | 4 | class BlogItem(models.Model): 5 | pub_date = models.DateTimeField() 6 | slug = models.SlugField(unique_for_date='pub_date', editable=True) 7 | headline = models.CharField(max_length=200) 8 | summary = models.TextField(help_text="Use markdown.") 9 | body = models.TextField(help_text="Use markdown.") 10 | author = models.CharField(max_length=100) 11 | 12 | class Meta: 13 | ordering = ('-pub_date',) 14 | get_latest_by = 'pub_date' 15 | 16 | def __unicode__(self): 17 | return unicode(self.headline) 18 | 19 | def get_absolute_url(self): 20 | from django.urls import reverse 21 | return reverse('get_blog', kwargs={'year': int(self.pub_date.strftime("%Y").lower()), 'month': self.pub_date.strftime("%b").lower(), 'day': self.pub_date.strftime("%d").lower(), 'slug': self.slug}) 22 | 23 | def get_comment_url(self): 24 | return ("/community/blog/%s/%s/#comments", (self.pub_date.strftime("%Y/%b/%d").lower(), self.slug)) 25 | 26 | def save(self): 27 | if not self.id: 28 | self.slug = slugify(self.headline) 29 | super(BlogItem,self).save() 30 | -------------------------------------------------------------------------------- /blog/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/blog/templatetags/__init__.py -------------------------------------------------------------------------------- /blog/templatetags/latestblogentry.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from blog.models import BlogItem 3 | import datetime 4 | 5 | class LatestBlogEntriesNode(template.Node): 6 | def __init__(self, num, varname): 7 | self.num, self.varname = num, varname 8 | 9 | def render(self, context): 10 | context[self.varname] = list(BlogItem.objects.filter(pub_date__lte=datetime.datetime.now())[:self.num]) 11 | return '' 12 | 13 | def do_get_latest_blog_entries(parser, token): 14 | """ 15 | {% get_latest_blog_entries 2 as latest_entries %} 16 | """ 17 | bits = token.contents.split() 18 | if len(bits) != 4: 19 | raise template.TemplateSyntaxError, "'%s' tag takes three arguments" % bits[0] 20 | if bits[2] != 'as': 21 | raise template.TemplateSyntaxError, "First argument to '%s' tag must be 'as'" % bits[0] 22 | return LatestBlogEntriesNode(bits[1], bits[3]) 23 | 24 | register = template.Library() 25 | register.tag('get_latest_blog_entries', do_get_latest_blog_entries) 26 | -------------------------------------------------------------------------------- /blog/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.conf.urls import url, include 3 | 4 | from blog.models import BlogItem 5 | from blog.feeds import RssBlogFeed 6 | from blog.feeds import BlogView 7 | from blog.feeds import YearView 8 | from blog.feeds import MonthView 9 | from blog.feeds import DetailView 10 | 11 | 12 | urlpatterns = [ 13 | url(r'^(?P\d{4})/(?P[a-z]{3})/(?P\w{1,2})/(?P[A-Za-z0-9-_]+)/$', DetailView.as_view(), name='get_blog'), 14 | url(r'^(?P\d{4})/(?P[a-z]{3})/$', MonthView.as_view()), 15 | url(r'^(?P\d{4})/$', YearView.as_view()), 16 | url(r'^rss/latest/$', RssBlogFeed), 17 | ] 18 | -------------------------------------------------------------------------------- /captcha/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/captcha/__init__.py -------------------------------------------------------------------------------- /captcha/fields.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django import forms 3 | from django.utils.encoding import smart_unicode 4 | from django.utils.translation import ugettext_lazy as _ 5 | 6 | from captcha.widgets import ReCaptcha 7 | from recaptcha.client import captcha 8 | 9 | class ReCaptchaField(forms.CharField): 10 | default_error_messages = { 11 | 'captcha_invalid': _(u'Invalid captcha') 12 | } 13 | 14 | def __init__(self, *args, **kwargs): 15 | self.widget = ReCaptcha 16 | self.required = True 17 | super(ReCaptchaField, self).__init__(*args, **kwargs) 18 | 19 | def clean(self, values): 20 | super(ReCaptchaField, self).clean(values[1]) 21 | recaptcha_challenge_value = smart_unicode(values[0]) 22 | recaptcha_response_value = smart_unicode(values[1]) 23 | check_captcha = captcha.submit(recaptcha_challenge_value, 24 | recaptcha_response_value, settings.RECAPTCHA_PRIVATE_KEY, {}) 25 | if not check_captcha.is_valid: 26 | raise forms.util.ValidationError(self.error_messages['captcha_invalid']) 27 | return values[0] -------------------------------------------------------------------------------- /captcha/forms.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from registration.forms import RegistrationFormTermsOfService 3 | from captcha.fields import ReCaptchaField 4 | from django.conf import settings 5 | from django.utils.encoding import smart_unicode, force_unicode 6 | from django.utils.translation import ugettext_lazy as _ 7 | from django.forms.forms import BoundField 8 | from django.utils.html import conditional_escape 9 | from django.utils.safestring import mark_safe 10 | from snowpenguin.django.recaptcha2.fields import ReCaptchaField 11 | from snowpenguin.django.recaptcha2.widgets import ReCaptchaWidget 12 | 13 | class RegistrationFormCaptcha(RegistrationFormTermsOfService): 14 | captcha = ReCaptchaField(widget=ReCaptchaWidget()) 15 | -------------------------------------------------------------------------------- /captcha/widgets.py: -------------------------------------------------------------------------------- 1 | from django import forms 2 | from django.utils.safestring import mark_safe 3 | from django.conf import settings 4 | from recaptcha.client import captcha 5 | 6 | class ReCaptcha(forms.widgets.Widget): 7 | recaptcha_challenge_name = 'recaptcha_challenge_field' 8 | recaptcha_response_name = 'recaptcha_response_field' 9 | 10 | 11 | def render(self, name, value, attrs=None): 12 | return mark_safe(u'%s' % captcha.displayhtml(settings.RECAPTCHA_PUBLIC_KEY, use_ssl=True)) 13 | 14 | def value_from_datadict(self, data, files, name): 15 | return [data.get(self.recaptcha_challenge_name, None), 16 | data.get(self.recaptcha_response_name, None)] 17 | -------------------------------------------------------------------------------- /community/__init__.py: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /community/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from community.models import Forum, Thread, Post 3 | 4 | class ForumAdmin(admin.ModelAdmin): 5 | pass 6 | 7 | class ThreadAdmin(admin.ModelAdmin): 8 | pass 9 | 10 | class PostAdmin(admin.ModelAdmin): 11 | pass 12 | 13 | 14 | admin.site.register(Forum, ForumAdmin) 15 | admin.site.register(Thread, ThreadAdmin) 16 | admin.site.register(Post, PostAdmin) 17 | 18 | -------------------------------------------------------------------------------- /community/feeds.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import get_object_or_404 2 | from django.contrib.sites.models import Site 3 | from django.http import HttpResponse, Http404 4 | from django.utils.xmlutils import SimplerXMLGenerator 5 | from community.models import Forum,Thread,Post 6 | from markdown2 import markdown 7 | from wfwfeed import WellFormedWebRss 8 | 9 | def ForumFeed(request, forum): 10 | f = get_object_or_404(Forum, slug=forum) 11 | try: 12 | object_list = f.thread_set.all() 13 | except documents.DocumentDoesNotExist: 14 | raise Http404 15 | feed = WellFormedWebRss( u"mloss.org community forum %s" % f.title.encode('utf-8'), 16 | "http://mloss.org", 17 | u'Updates to mloss.org forum %s' % f.title.encode('utf-8'), 18 | language=u"en") 19 | 20 | for thread in object_list: 21 | link = u'http://%s%s' % (Site.objects.get_current().domain, thread.get_absolute_url()) 22 | commentlink=u'http://%s%s' % (Site.objects.get_current().domain, thread.get_absolute_url()) 23 | commentrss=u'http://%s/community/rss/thread/%i' % (Site.objects.get_current().domain, thread.id) 24 | feed.add_item( thread.title.encode('utf-8'), 25 | commentlink, None, 26 | comments=commentlink, 27 | pubdate=thread.thread_latest_post.time, unique_id=link) 28 | feed.add_commentRss(commentrss) 29 | 30 | response = HttpResponse(mimetype='application/xml') 31 | feed.write(response, 'utf-8') 32 | return response 33 | 34 | def ThreadFeed(request, forum, thread): 35 | thread = get_object_or_404(Thread, pk=thread) 36 | 37 | feed = WellFormedWebRss( u"mloss.org community forum", 38 | "http://mloss.org", 39 | u'Updates to mloss.org thread %s' % thread.title.encode('utf-8'), 40 | language=u"en") 41 | 42 | for post in thread.post_set.all().order_by('time'): 43 | link = u'http://%s%s' % (Site.objects.get_current().domain, post.get_absolute_url()) 44 | feed.add_item(u'By: %s on: %s' % (post.author.username, post.time.strftime("%Y-%m-%d %H:%M")), 45 | link, markdown(post.body), 46 | author_name=post.author.username, 47 | pubdate=post.time, unique_id=link) 48 | 49 | response = HttpResponse(mimetype='application/xml') 50 | feed.write(response, 'utf-8') 51 | return response 52 | -------------------------------------------------------------------------------- /community/subscriptions.py: -------------------------------------------------------------------------------- 1 | from django.shortcuts import get_object_or_404 2 | from django.contrib.sites.models import Site 3 | from django.http import HttpResponse, HttpResponseRedirect, Http404 4 | from models import Forum, Thread, Post 5 | 6 | def SubscribeForum(request, forum, bookmark=False): 7 | if not request.user.is_authenticated(): 8 | return HttpResponseRedirect('/accounts/login?next=%s' % request.path) 9 | entry = get_object_or_404(Forum, slug=forum) 10 | entry.subscribe(request.user, bookmark) 11 | return HttpResponseRedirect("/user/view/" + str(request.user.id) + "/") 12 | 13 | def UnsubscribeForum(request, forum, bookmark=False): 14 | if not request.user.is_authenticated(): 15 | return HttpResponseRedirect('/accounts/login?next=%s' % request.path) 16 | entry = get_object_or_404(Forum, slug=forum) 17 | entry.unsubscribe(request.user, bookmark) 18 | 19 | return HttpResponseRedirect("/user/view/" + str(request.user.id) + "/") 20 | 21 | def BookmarkForum(request, forum): 22 | return SubscribeForum(request, forum, bookmark=True) 23 | def RemoveBookmarkForum(request, forum): 24 | return UnsubscribeForum(request, forum, bookmark=True) 25 | 26 | def SubscribeThread(request, forum, thread, bookmark=False): 27 | if not request.user.is_authenticated(): 28 | return HttpResponseRedirect('/accounts/login?next=%s' % request.path) 29 | entry = get_object_or_404(Thread, pk=thread) 30 | entry.subscribe(request.user, bookmark) 31 | return HttpResponseRedirect("/user/view/" + str(request.user.id) + "/") 32 | 33 | def BookmarkThread(request, forum, thread): 34 | return SubscribeThread(request, forum, thread, bookmark=True) 35 | 36 | def UnsubscribeThread(request, forum, thread, bookmark=False): 37 | if not request.user.is_authenticated(): 38 | return HttpResponseRedirect('/accounts/login?next=%s' % request.path) 39 | entry = get_object_or_404(Thread, pk=thread) 40 | entry.unsubscribe(request.user, bookmark) 41 | 42 | return HttpResponseRedirect("/user/view/" + str(request.user.id) + "/") 43 | 44 | def RemoveBookmarkThread(request, forum, thread): 45 | return UnsubscribeThread(request, forum, thread, bookmark=True) 46 | -------------------------------------------------------------------------------- /community/summary.py: -------------------------------------------------------------------------------- 1 | from community.models import Forum,Thread,Post 2 | from django.template import RequestContext 3 | from aggregator.models import Feed, FeedItem 4 | from blog.models import BlogItem 5 | 6 | class ForumSummary(): 7 | """ 8 | Summarises latest forum posts 9 | """ 10 | title = '' 11 | url = '' 12 | body = '' 13 | author = '' 14 | time = '' 15 | thread = '' 16 | 17 | class FeedSummary(): 18 | """ 19 | Summarises the latest feeds from external sites 20 | """ 21 | title = '' 22 | url = '' 23 | items = [] 24 | 25 | 26 | def get_latest_posts(): 27 | """ 28 | For each Forum, get the latest post 29 | """ 30 | latest_posts = [] 31 | all_forums = Forum.objects.all() 32 | for forum in all_forums: 33 | summary = ForumSummary() 34 | summary.title = forum.title 35 | post = forum.forum_latest_post 36 | if post: 37 | summary.body = post.body 38 | summary.url = post.get_absolute_url() 39 | summary.author = post.author 40 | summary.pub_date = post.time 41 | if post.thread: 42 | summary.thread = post.thread.title 43 | latest_posts.append(summary) 44 | return latest_posts 45 | 46 | def get_latest_feeds(): 47 | """ 48 | For each feed from an external site, get the latest post title 49 | """ 50 | all_feeds = Feed.objects.all() 51 | 52 | latest_feeds = [] 53 | for feed in all_feeds: 54 | cur_feed = FeedSummary() 55 | cur_feed.title = feed.title 56 | cur_feed.url = feed.public_url 57 | items = FeedItem.objects.filter(feed__title=feed.title).order_by('-date_modified') 58 | cur_feed.items = items[:3] 59 | 60 | latest_feeds.append(cur_feed) 61 | 62 | return latest_feeds 63 | 64 | def get_latest_news(extra=None): 65 | if extra is None: 66 | extra=dict() 67 | 68 | latest_posts = get_latest_posts() 69 | latest_feeds = get_latest_feeds() 70 | blog_entries = BlogItem.objects.order_by('-pub_date')[:10] 71 | extra['latest_posts']=latest_posts 72 | extra['latest_feeds']=latest_feeds 73 | extra['blog_entries']=blog_entries 74 | extra['blog_years']=BlogItem.objects.dates('pub_date', 'year') 75 | return extra 76 | -------------------------------------------------------------------------------- /community/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URLConf for Django-Forum. 3 | 4 | django-forum assumes that the forum application is living under 5 | /forum/. 6 | 7 | Usage in your base urls.py: 8 | (r'^forum/', include('community.urls')), 9 | """ 10 | 11 | from django.conf.urls import url, include 12 | 13 | from blog.feeds import BlogView 14 | 15 | urlpatterns = [ 16 | url(r'^$', BlogView.as_view()), 17 | url(r'^blog/', include('blog.urls')), 18 | ] 19 | -------------------------------------------------------------------------------- /forshow/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/forshow/__init__.py -------------------------------------------------------------------------------- /forshow/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from forshow.models import News, Faq 3 | 4 | class NewsAdmin(admin.ModelAdmin): 5 | list_display = ('headline', 'publication_date') 6 | 7 | class FaqAdmin(admin.ModelAdmin): 8 | list_display = ('question', 'answer') 9 | fieldsets = ( 10 | (None, {'fields': ('question','answer')}), 11 | ) 12 | 13 | 14 | admin.site.register(News, NewsAdmin) 15 | admin.site.register(Faq, FaqAdmin) 16 | -------------------------------------------------------------------------------- /forshow/models.py: -------------------------------------------------------------------------------- 1 | from django.db import models 2 | from django.contrib.auth.models import User 3 | 4 | # Create your models here. 5 | class News(models.Model): 6 | headline = models.CharField(max_length=200) 7 | author = models.ManyToManyField(User) 8 | publication_date = models.DateField() 9 | article = models.TextField() 10 | 11 | class Meta: 12 | ordering = ('-publication_date',) 13 | 14 | class Faq(models.Model): 15 | question = models.TextField() 16 | answer = models.TextField() 17 | 18 | -------------------------------------------------------------------------------- /forshow/views.py: -------------------------------------------------------------------------------- 1 | # Create your views here. 2 | from django.shortcuts import render_to_response 3 | from django.shortcuts import render 4 | from forshow.models import News 5 | from forshow.models import Faq 6 | from django.template import RequestContext 7 | 8 | def newsindex(request): 9 | """ 10 | List of all news items 11 | """ 12 | all_news_items = News.objects.all().order_by('-publication_date') 13 | return render(request, 'news_index.html', 14 | {'all_news_items': all_news_items}) 15 | 16 | 17 | def faqindex(request): 18 | """ 19 | List of all FAQ items 20 | """ 21 | all_faq_items = Faq.objects.all().order_by('question') 22 | return render(request, 'faq_index.html', 23 | {'all_faq_items': all_faq_items}) 24 | -------------------------------------------------------------------------------- /manage.py: -------------------------------------------------------------------------------- 1 | 2 | #!/usr/bin/env python 3 | import os, sys 4 | 5 | if __name__ == "__main__": 6 | os.environ.setdefault("DJANGO_SETTINGS_MODULE", "settings") 7 | 8 | from django.core.management import execute_from_command_line 9 | 10 | execute_from_command_line(sys.argv) 11 | -------------------------------------------------------------------------------- /media/images/bib.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/bib.png -------------------------------------------------------------------------------- /media/images/bookmark.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/bookmark.png -------------------------------------------------------------------------------- /media/images/cray_flat_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/cray_flat_small.png -------------------------------------------------------------------------------- /media/images/cray_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/cray_small.png -------------------------------------------------------------------------------- /media/images/disk.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/disk.png -------------------------------------------------------------------------------- /media/images/homepage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/homepage.png -------------------------------------------------------------------------------- /media/images/jmlr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/jmlr.jpg -------------------------------------------------------------------------------- /media/images/mloss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/mloss.png -------------------------------------------------------------------------------- /media/images/mloss_flat_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/mloss_flat_small.png -------------------------------------------------------------------------------- /media/images/mloss_logo_new.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/mloss_logo_new.jpg -------------------------------------------------------------------------------- /media/images/mloss_logo_new.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/mloss_logo_new.png -------------------------------------------------------------------------------- /media/images/mloss_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/mloss_small.png -------------------------------------------------------------------------------- /media/images/mloss_transparent_small.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/mloss_transparent_small.png -------------------------------------------------------------------------------- /media/images/paper.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/paper.png -------------------------------------------------------------------------------- /media/images/rlogo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/rlogo.png -------------------------------------------------------------------------------- /media/images/rss.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/rss.png -------------------------------------------------------------------------------- /media/images/stars/blank.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/stars/blank.png -------------------------------------------------------------------------------- /media/images/stars/half.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/stars/half.png -------------------------------------------------------------------------------- /media/images/stars/quarter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/stars/quarter.png -------------------------------------------------------------------------------- /media/images/stars/star.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/stars/star.png -------------------------------------------------------------------------------- /media/images/stars/three-quarter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/stars/three-quarter.png -------------------------------------------------------------------------------- /media/images/subscribe.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/subscribe.png -------------------------------------------------------------------------------- /media/images/temp-logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/media/images/temp-logo.jpg -------------------------------------------------------------------------------- /registration/__init__.py: -------------------------------------------------------------------------------- 1 | VERSION = (0, 8, 0, 'alpha', 1) 2 | 3 | def get_version(): 4 | version = '%s.%s' % (VERSION[0], VERSION[1]) 5 | if VERSION[2]: 6 | version = '%s.%s' % (version, VERSION[2]) 7 | if VERSION[3:] == ('alpha', 0): 8 | version = '%s pre-alpha' % version 9 | else: 10 | if VERSION[3] != 'final': 11 | version = "%s %s" % (version, VERSION[3]) 12 | if VERSION[4] != 0: 13 | version = '%s %s' % (version, VERSION[4]) 14 | return version 15 | -------------------------------------------------------------------------------- /registration/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from django.contrib.sites.requests import RequestSite 3 | from django.contrib.sites.models import Site 4 | from django.utils.translation import ugettext_lazy as _ 5 | 6 | from registration.models import RegistrationProfile 7 | 8 | 9 | class RegistrationAdmin(admin.ModelAdmin): 10 | actions = ['activate_users', 'resend_activation_email'] 11 | list_display = ('user', 'activation_key_expired') 12 | raw_id_fields = ['user'] 13 | search_fields = ('user__username', 'user__first_name') 14 | 15 | def activate_users(self, request, queryset): 16 | """ 17 | Activates the selected users, if they are not alrady 18 | activated. 19 | 20 | """ 21 | for profile in queryset: 22 | RegistrationProfile.objects.activate_user(profile.activation_key) 23 | activate_users.short_description = _("Activate users") 24 | 25 | def resend_activation_email(self, request, queryset): 26 | """ 27 | Re-sends activation emails for the selected users. 28 | 29 | Note that this will *only* send activation emails for users 30 | who are eligible to activate; emails will not be sent to users 31 | whose activation keys have expired or who have already 32 | activated. 33 | 34 | """ 35 | if Site._meta.installed: 36 | site = Site.objects.get_current() 37 | else: 38 | site = RequestSite(request) 39 | 40 | for profile in queryset: 41 | if not profile.activation_key_expired(): 42 | profile.send_activation_email(site) 43 | resend_activation_email.short_description = _("Re-send activation emails") 44 | 45 | 46 | admin.site.register(RegistrationProfile, RegistrationAdmin) 47 | -------------------------------------------------------------------------------- /registration/auth_urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URL patterns for the views included in ``django.contrib.auth``. 3 | 4 | Including these URLs (via the ``include()`` directive) will set up the 5 | following patterns based at whatever URL prefix they are included 6 | under: 7 | 8 | * User login at ``login/``. 9 | 10 | * User logout at ``logout/``. 11 | 12 | * The two-step password change at ``password/change/`` and 13 | ``password/change/done/``. 14 | 15 | * The four-step password reset at ``password/reset/``, 16 | ``password/reset/confirm/``, ``password/reset/complete/`` and 17 | ``password/reset/done/``. 18 | 19 | The default registration backend already has an ``include()`` for 20 | these URLs, so under the default setup it is not necessary to manually 21 | include these views. Other backends may or may not include them; 22 | consult a specific backend's documentation for details. 23 | 24 | """ 25 | 26 | from django.conf.urls import url, include 27 | 28 | from django.contrib.auth.views import (login, 29 | logout, 30 | password_reset, 31 | password_reset_done, 32 | password_reset_confirm, 33 | ) 34 | 35 | from django.contrib.auth import views as auth_views 36 | 37 | 38 | urlpatterns = [ 39 | url(r'^login/$', 40 | auth_views.login, 41 | {'template_name': 'registration/login.html'}, 42 | name='login'), 43 | url(r'^logout/$', 44 | auth_views.logout, 45 | {'template_name': 'registration/logout.html'}, 46 | name='logout'), 47 | url(r'^password/change/$', 48 | auth_views.password_change, 49 | name='password_change'), 50 | url(r'^password/change/done/$', 51 | auth_views.password_change_done, 52 | name='password_change_done'), 53 | url(r'^password/reset/$', 54 | auth_views.password_reset, 55 | name='password_reset'), 56 | url(r'^password/reset/confirm/(?P[0-9A-Za-z]+)-(?P.+)/$', 57 | auth_views.password_reset_confirm, 58 | name='password_reset_confirm'), 59 | url(r'^password/reset/complete/$', 60 | auth_views.password_reset_complete, 61 | name='password_reset_complete'), 62 | url(r'^password/reset/done/$', 63 | auth_views.password_reset_done, 64 | name='password_reset_done'), 65 | ] 66 | -------------------------------------------------------------------------------- /registration/backends/__init__.py: -------------------------------------------------------------------------------- 1 | from django.core.exceptions import ImproperlyConfigured 2 | 3 | 4 | # Python 2.7 has an importlib with import_module; for older Pythons, 5 | # Django's bundled copy provides it. 6 | try: 7 | from importlib import import_module 8 | except ImportError: 9 | from django.utils.importlib import import_module 10 | 11 | def get_backend(path): 12 | """ 13 | Return an instance of a registration backend, given the dotted 14 | Python import path (as a string) to the backend class. 15 | 16 | If the backend cannot be located (e.g., because no such module 17 | exists, or because the module does not contain a class of the 18 | appropriate name), ``django.core.exceptions.ImproperlyConfigured`` 19 | is raised. 20 | 21 | """ 22 | i = path.rfind('.') 23 | module, attr = path[:i], path[i+1:] 24 | try: 25 | mod = import_module(module) 26 | except ImportError, e: 27 | raise ImproperlyConfigured('Error loading registration backend %s: "%s"' % (module, e)) 28 | try: 29 | backend_class = getattr(mod, attr) 30 | except AttributeError: 31 | raise ImproperlyConfigured('Module "%s" does not define a registration backend named "%s"' % (module, attr)) 32 | return backend_class() 33 | -------------------------------------------------------------------------------- /registration/backends/default/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URLconf for registration and activation, using django-registration's 3 | default backend. 4 | 5 | If the default behavior of these views is acceptable to you, simply 6 | use a line like this in your root URLconf to set up the default URLs 7 | for registration:: 8 | 9 | (r'^accounts/', include('registration.backends.default.urls')), 10 | 11 | This will also automatically set up the views in 12 | ``django.contrib.auth`` at sensible default locations. 13 | 14 | If you'd like to customize the behavior (e.g., by passing extra 15 | arguments to the various views) or split up the URLs, feel free to set 16 | up your own URL patterns for these views instead. 17 | 18 | """ 19 | 20 | 21 | 22 | from django.conf.urls import url, include 23 | from django.views.generic import TemplateView 24 | 25 | from registration.views import activate 26 | from registration.views import register 27 | 28 | from captcha.forms import RegistrationFormCaptcha 29 | 30 | urlpatterns = [ 31 | url(r'^activate/complete/$', 32 | TemplateView.as_view(template_name='registration/activation_complete.html'), 33 | name='registration_activation_complete'), 34 | # Activation keys get matched by \w+ instead of the more specific 35 | # [a-fA-F0-9]{40} because a bad activation key should still get to the view; 36 | # that way it can return a sensible "invalid key" message instead of a 37 | # confusing 404. 38 | url(r'^activate/(?P\w+)/$', 39 | activate, 40 | {'backend': 'registration.backends.default.DefaultBackend'}, 41 | name='registration_activate'), 42 | url(r'^register/$', 43 | register, 44 | {'backend': 'registration.backends.default.DefaultBackend', 45 | 'form_class': RegistrationFormCaptcha}, 46 | name='registration_register'), 47 | url(r'^register/complete/$', 48 | TemplateView.as_view(template_name='registration/registration_complete.html'), 49 | name='registration_complete'), 50 | url(r'^register/closed/$', 51 | TemplateView.as_view(template_name='registration/registration_closed.html'), 52 | name='registration_disallowed'), 53 | url(r'', include('registration.auth_urls')), 54 | ] 55 | -------------------------------------------------------------------------------- /registration/backends/simple/__init__.py: -------------------------------------------------------------------------------- 1 | from django.conf import settings 2 | from django.contrib.auth import authenticate 3 | from django.contrib.auth import login 4 | from django.contrib.auth.models import User 5 | 6 | from registration import signals 7 | from registration.forms import RegistrationForm 8 | 9 | 10 | class SimpleBackend(object): 11 | """ 12 | A registration backend which implements the simplest possible 13 | workflow: a user supplies a username, email address and password 14 | (the bare minimum for a useful account), and is immediately signed 15 | up and logged in. 16 | 17 | """ 18 | def register(self, request, **kwargs): 19 | """ 20 | Create and immediately log in a new user. 21 | 22 | """ 23 | username, email, password = kwargs['username'], kwargs['email'], kwargs['password1'] 24 | User.objects.create_user(username, email, password) 25 | 26 | # authenticate() always has to be called before login(), and 27 | # will return the user we just created. 28 | new_user = authenticate(username=username, password=password) 29 | login(request, new_user) 30 | signals.user_registered.send(sender=self.__class__, 31 | user=new_user, 32 | request=request) 33 | return new_user 34 | 35 | def activate(self, **kwargs): 36 | raise NotImplementedError 37 | 38 | def registration_allowed(self, request): 39 | """ 40 | Indicate whether account registration is currently permitted, 41 | based on the value of the setting ``REGISTRATION_OPEN``. This 42 | is determined as follows: 43 | 44 | * If ``REGISTRATION_OPEN`` is not specified in settings, or is 45 | set to ``True``, registration is permitted. 46 | 47 | * If ``REGISTRATION_OPEN`` is both specified and set to 48 | ``False``, registration is not permitted. 49 | 50 | """ 51 | return getattr(settings, 'REGISTRATION_OPEN', True) 52 | 53 | def get_form_class(self, request): 54 | return RegistrationForm 55 | 56 | def post_registration_redirect(self, request, user): 57 | """ 58 | After registration, redirect to the user's account page. 59 | 60 | """ 61 | return (user.get_absolute_url(), (), {}) 62 | 63 | def post_activation_redirect(self, request, user): 64 | raise NotImplementedError 65 | -------------------------------------------------------------------------------- /registration/backends/simple/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URLconf for registration and activation, using django-registration's 3 | one-step backend. 4 | 5 | If the default behavior of these views is acceptable to you, simply 6 | use a line like this in your root URLconf to set up the default URLs 7 | for registration:: 8 | 9 | (r'^accounts/', include('registration.backends.simple.urls')), 10 | 11 | This will also automatically set up the views in 12 | ``django.contrib.auth`` at sensible default locations. 13 | 14 | If you'd like to customize the behavior (e.g., by passing extra 15 | arguments to the various views) or split up the URLs, feel free to set 16 | up your own URL patterns for these views instead. 17 | 18 | """ 19 | 20 | 21 | 22 | from django.conf.urls import url, include 23 | from django.views.generic import TemplateView 24 | 25 | 26 | from registration.views import activate 27 | from registration.views import register 28 | 29 | 30 | urlpatterns = [ 31 | url(r'^register/$', 32 | register, 33 | {'backend': 'registration.backends.simple.SimpleBackend'}, 34 | name='registration_register'), 35 | url(r'^register/closed/$', 36 | TemplateView.as_view(template_name='registration/registration_closed.html'), 37 | name='registration_disallowed'), 38 | url(r'', include('registration.auth_urls')), 39 | ] 40 | -------------------------------------------------------------------------------- /registration/locale/ar/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/ar/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/ar/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "اسم المستخدم" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "عنوان البريد الالكتروني" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "كلمة المرور" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "تأكيد كلمة المرور" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "يمكن أن يحتوي اسم المستخدم على احرف، ارقام وشرطات سطرية فقط" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "اسم المستخدم مسجل مسبقا. يرجى اختيار اسم اخر." 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "يجب ادخال كلمة المرور مطابقة كل مرة" 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "أقر بقراءة والموافقة على شروط الخدمة" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "يجب الموافقة على الشروط للتسجيل" 54 | 55 | #: forms.py:124 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "عنوان البريد الالكتروني مسجل مسبقا. يرجى تزويد عنوان بريد الكتروني مختلف." 60 | 61 | #: forms.py:149 62 | msgid "" 63 | "Registration using free email addresses is prohibited. Please supply a " 64 | "different email address." 65 | msgstr "يمنع التسجيل باستخدام عناوين بريد الكترونية مجانية. يرجى تزويد عنوان بريد الكتروني مختلف." 66 | 67 | #: models.py:188 68 | msgid "user" 69 | msgstr "مستخدم" 70 | 71 | #: models.py:189 72 | msgid "activation key" 73 | msgstr "رمز التفعيل" 74 | 75 | #: models.py:194 76 | msgid "registration profile" 77 | msgstr "ملف التسجيل الشخصي" 78 | 79 | #: models.py:195 80 | msgid "registration profiles" 81 | msgstr "ملفات التسجيل الشخصية" 82 | -------------------------------------------------------------------------------- /registration/locale/bg/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/bg/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/bg/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 11 | "PO-Revision-Date: 2008-03-05 12:37+0200\n" 12 | "Last-Translator: Vladislav \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Poedit-Bookmarks: -1,-1,-1,-1,10,-1,-1,-1,-1,-1\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "Потребителско име " 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "Електронна поща" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "Парола" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "Парола (проверка)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Потребителските имена могат да съдържат букви, цифри и подчертавки" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Потребителското име е заето. Моля изберето друго." 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "Грешка при проверка на паролата." 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "Прочел съм и съм съгласен с условията за експлоатация" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "Трябва да сте съгласни с условията за да се регистрирате." 54 | 55 | #: forms.py:124 56 | msgid "This email address is already in use. Please supply a different email address." 57 | msgstr "Адреса на електронната поща е използван. Моля въведете друг адрес." 58 | 59 | #: forms.py:149 60 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 61 | msgstr "Регистрациите с безплатни адреси е забранен. Моля въведете различен адрес за електронна поща" 62 | 63 | #: models.py:188 64 | msgid "user" 65 | msgstr "Потребител" 66 | 67 | #: models.py:189 68 | msgid "activation key" 69 | msgstr "Ключ за активация" 70 | 71 | #: models.py:194 72 | msgid "registration profile" 73 | msgstr "регистрационен профил" 74 | 75 | #: models.py:195 76 | msgid "registration profiles" 77 | msgstr "регистрационни профили" 78 | 79 | -------------------------------------------------------------------------------- /registration/locale/da/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/da/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/da/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Rune Bromer , 2007-2009. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: django-registration 0.8 \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: \n" 12 | "PO-Revision-Date: \n" 13 | "Last-Translator: Rune Bromer \n" 14 | "Language-Team: \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: admin.py:23 20 | msgid "Activate users" 21 | msgstr "Aktiver brugere" 22 | 23 | #: admin.py:43 24 | msgid "Re-send activation emails" 25 | msgstr "Gensend aktiveringsemails" 26 | 27 | #: forms.py:35 28 | msgid "Username" 29 | msgstr "Brugernavn" 30 | 31 | #: forms.py:36 32 | msgid "This value must contain only letters, numbers and underscores." 33 | msgstr "V¾rdien mŒ kun indeholde bogstaver, tal og underscore." 34 | 35 | #: forms.py:39 36 | msgid "Email address" 37 | msgstr "E-mailadresse" 38 | 39 | #: forms.py:41 40 | msgid "Password" 41 | msgstr "Password" 42 | 43 | #: forms.py:43 44 | msgid "Password (again)" 45 | msgstr "Password (gentag)" 46 | 47 | #: forms.py:55 48 | msgid "A user with that username already exists." 49 | msgstr "Der findes allerede en bruger med dette brugernavn." 50 | 51 | #: forms.py:67 52 | msgid "The two password fields didn't match." 53 | msgstr "De 2 passwordfelter er ikke ens." 54 | 55 | #: forms.py:78 56 | msgid "I have read and agree to the Terms of Service" 57 | msgstr "I har l¾st og accepterer betingelserne." 58 | 59 | #: forms.py:79 60 | msgid "You must agree to the terms to register" 61 | msgstr "Du skal acceptere betingelserne for at registere" 62 | 63 | #: forms.py:95 64 | msgid "" 65 | "This email address is already in use. Please supply a different email " 66 | "address." 67 | msgstr "" 68 | "Denne emailadresse er allerede i brug. Benyt venligst en anden. " 69 | 70 | #: forms.py:122 71 | msgid "" 72 | "Registration using free email addresses is prohibited. Please supply a " 73 | "different email address." 74 | msgstr "" 75 | "Registrering med gratis emailadresser er ikke muligt. V¾lg venligst en " 76 | "anden emailadresse" 77 | 78 | #: models.py:165 79 | msgid "user" 80 | msgstr "bruger" 81 | 82 | #: models.py:166 83 | msgid "activation key" 84 | msgstr "Aktiveringsn¿gle" 85 | 86 | #: models.py:171 87 | msgid "registration profile" 88 | msgstr "Registreringsprofil" 89 | 90 | #: models.py:172 91 | msgid "registration profiles" 92 | msgstr "Registreringprofiler" 93 | -------------------------------------------------------------------------------- /registration/locale/de/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/de/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/de/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Jannis Leidel , 2007-2009. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: django-registration 0.8 \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2009-10-18 21:32+0200\n" 12 | "PO-Revision-Date: 2007-09-29 16:50+0200\n" 13 | "Last-Translator: Jannis Leidel \n" 14 | "Language-Team: Deutsch \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: admin.py:23 20 | msgid "Activate users" 21 | msgstr "Benutzer aktivieren" 22 | 23 | #: admin.py:43 24 | msgid "Re-send activation emails" 25 | msgstr "Aktivierungs-E-Mail erneut senden" 26 | 27 | #: forms.py:35 28 | msgid "Username" 29 | msgstr "Benutzername" 30 | 31 | #: forms.py:36 32 | msgid "This value must contain only letters, numbers and underscores." 33 | msgstr "Dieser Wert darf nur Buchstaben, Ziffern und Unterstriche enthalten." 34 | 35 | #: forms.py:39 36 | msgid "Email address" 37 | msgstr "E-Mail-Adresse" 38 | 39 | #: forms.py:41 40 | msgid "Password" 41 | msgstr "Passwort" 42 | 43 | #: forms.py:43 44 | msgid "Password (again)" 45 | msgstr "Passwort (wiederholen)" 46 | 47 | #: forms.py:55 48 | msgid "A user with that username already exists." 49 | msgstr "Dieser Benutzername ist bereits vergeben." 50 | 51 | #: forms.py:67 52 | msgid "The two password fields didn't match." 53 | msgstr "Die beiden Passwörter sind nicht identisch." 54 | 55 | #: forms.py:78 56 | msgid "I have read and agree to the Terms of Service" 57 | msgstr "Ich habe die Nutzungsvereinbarung gelesen und stimme ihr zu" 58 | 59 | #: forms.py:79 60 | msgid "You must agree to the terms to register" 61 | msgstr "Sie müssen der Nutzungsvereinbarung zustimmen, um sich zu registrieren" 62 | 63 | #: forms.py:95 64 | msgid "" 65 | "This email address is already in use. Please supply a different email " 66 | "address." 67 | msgstr "" 68 | "Diese E-Mail-Adresse wird schon genutzt. Bitte geben Sie eine andere E-Mail-" 69 | "Adresse an." 70 | 71 | #: forms.py:122 72 | msgid "" 73 | "Registration using free email addresses is prohibited. Please supply a " 74 | "different email address." 75 | msgstr "" 76 | "Die Registrierung mit einer kostenlosen E-Mail-Adresse ist untersagt. Bitte " 77 | "geben Sie eine andere E-Mail-Adresse an." 78 | 79 | #: models.py:165 80 | msgid "user" 81 | msgstr "Benutzer" 82 | 83 | #: models.py:166 84 | msgid "activation key" 85 | msgstr "Aktivierungsschlüssel" 86 | 87 | #: models.py:171 88 | msgid "registration profile" 89 | msgstr "Registrierungsprofil" 90 | 91 | #: models.py:172 92 | msgid "registration profiles" 93 | msgstr "Registrierungsprofile" 94 | -------------------------------------------------------------------------------- /registration/locale/el/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/el/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/el/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Panos Laganakos , 2007. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: 2007-11-14 21:50+0200\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "όνομα χρήστη" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "διεύθυνση ηλεκτρονικού ταχυδρομείου" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "συνθηματικό" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "συνθηματικό (ξανά)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Τα ονόματα χρηστών μπορούν να περιλαμβάνουν μόνο γράμματα, αριθμούς και υπογραμμίσεις" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Αυτό το όνομα χρήστη χρησιμοποίειται ήδη. Παρακαλώ διαλέξτε ένα άλλο." 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "Πρέπει να εισάγετε το ίδιο συνθηματικό κάθε φορά" 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "Διάβασα και συμφωνώ με τους Όρους της Υπηρεσίας" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "Πρέπει να συμφωνείται με τους όρους για να εγγραφείτε" 54 | 55 | #: forms.py:124 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "" 60 | "Η συγκεκριμένη διεύθυνση ηλεκτρονικού ταχυδρομείου χρησιμοποιείται ήδη. " 61 | "Παρακαλώ δώστε κάποια άλλη." 62 | 63 | #: forms.py:149 64 | msgid "" 65 | "Registration using free email addresses is prohibited. Please supply a " 66 | "different email address." 67 | msgstr "" 68 | "Η εγγραφή μέσω δωρεάν διευθύνσεων ηλεκτρονικού ταχυδρομείου απαγορεύεται. ""Παρακαλώ δώστε κάποια άλλη." 69 | 70 | #: models.py:188 71 | msgid "user" 72 | msgstr "χρήστης" 73 | 74 | #: models.py:189 75 | msgid "activation key" 76 | msgstr "κλειδί ενεργοποίησης" 77 | 78 | #: models.py:194 79 | msgid "registration profile" 80 | msgstr "προφίλ εγγραφής" 81 | 82 | #: models.py:195 83 | msgid "registration profiles" 84 | msgstr "προφίλ εγγραφών" 85 | -------------------------------------------------------------------------------- /registration/locale/en/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/en/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/en/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2009-10-12 14:09-0500\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: admin.py:23 20 | msgid "Activate users" 21 | msgstr "" 22 | 23 | #: admin.py:43 24 | msgid "Re-send activation emails" 25 | msgstr "" 26 | 27 | #: forms.py:35 28 | msgid "username" 29 | msgstr "" 30 | 31 | #: forms.py:36 32 | msgid "This value must contain only letters, numbers and underscores." 33 | msgstr "" 34 | 35 | #: forms.py:39 36 | msgid "Email address" 37 | msgstr "" 38 | 39 | #: forms.py:41 40 | msgid "Password" 41 | msgstr "" 42 | 43 | #: forms.py:43 44 | msgid "Password (again)" 45 | msgstr "" 46 | 47 | #: forms.py:55 48 | msgid "A user with that username already exists." 49 | msgstr "" 50 | 51 | #: forms.py:67 52 | msgid "The two password fields didn't match." 53 | msgstr "" 54 | 55 | #: forms.py:78 56 | msgid "I have read and agree to the Terms of Service" 57 | msgstr "" 58 | 59 | #: forms.py:79 60 | msgid "You must agree to the terms to register" 61 | msgstr "" 62 | 63 | #: forms.py:95 64 | msgid "" 65 | "This email address is already in use. Please supply a different email " 66 | "address." 67 | msgstr "" 68 | 69 | #: forms.py:122 70 | msgid "" 71 | "Registration using free email addresses is prohibited. Please supply a " 72 | "different email address." 73 | msgstr "" 74 | 75 | #: models.py:165 76 | msgid "user" 77 | msgstr "" 78 | 79 | #: models.py:166 80 | msgid "activation key" 81 | msgstr "" 82 | 83 | #: models.py:171 84 | msgid "registration profile" 85 | msgstr "" 86 | 87 | #: models.py:172 88 | msgid "registration profiles" 89 | msgstr "" 90 | -------------------------------------------------------------------------------- /registration/locale/es/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/es/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/es/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Spanish translation for django-registration. 2 | # Copyright (C) 2007, James Bennet 3 | # This file is distributed under the same license as the registration package. 4 | # Ernesto Rico Schmidt , 2008. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: django-registration 0.3 \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2008-03-11 00:19-0400\n" 12 | "PO-Revision-Date: 2008-03-11 00:19-0400\n" 13 | "Last-Translator: Ernesto Rico Schmidt \n" 14 | "Language-Team: Español \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "nombre de usuario" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "dirección de coreo electrónico" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "contraseña" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "contraseña (otra vez)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Los nombres de usuarios sólo pueden contener letras, números y guiones bajos" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Este nombre de usuario ya está ocupado. Por favor escoge otro" 42 | 43 | #: forms.py:71 44 | msgid "You must type the same password each time" 45 | msgstr "Tienes que introducir la misma contraseña cada vez" 46 | 47 | #: forms.py:100 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "He leído y acepto los términos de servicio" 50 | 51 | #: forms.py:109 52 | msgid "You must agree to the terms to register" 53 | msgstr "Tienes que aceptar los términos para registrarte" 54 | 55 | #: forms.py:128 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "" 60 | "La dirección de correo electrónico ya está siendo usada. Por favor" 61 | "proporciona otra dirección." 62 | 63 | #: forms.py:153 64 | msgid "" 65 | "Registration using free email addresses is prohibited. Please supply a " 66 | "different email address." 67 | msgstr "" 68 | "El registro usando una dirección de correo electrónico gratis está prohibido." 69 | "Por favor proporciona otra dirección." 70 | 71 | #: models.py:188 72 | msgid "user" 73 | msgstr "usuario" 74 | 75 | #: models.py:189 76 | msgid "activation key" 77 | msgstr "clave de activación" 78 | 79 | #: models.py:194 80 | msgid "registration profile" 81 | msgstr "perfil de registro" 82 | 83 | #: models.py:195 84 | msgid "registration profiles" 85 | msgstr "perfiles de registro" 86 | -------------------------------------------------------------------------------- /registration/locale/es_AR/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/es_AR/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/es_AR/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) 2008 Leonardo Manuel Rocha 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "nombre de usuario" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "dirección de e-mail" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "contraseña" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "contraseña (nuevamente)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "El nombre de usuario solo puede contener letras, números y guiones bajos" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Ese nombre de usuario ya está asignado. Por favor elija otro." 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "Debe tipear la misma contraseña cada vez" 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "He leído y estoy de acuerdo con las Condiciones de Servicio" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "Debe estar de acuerdo con las Condiciones para poder registrarse" 54 | 55 | #: forms.py:124 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "Esa dirección de e-mail ya está en uso. Por favor provea otra " 60 | "dirección." 61 | 62 | #: forms.py:149 63 | msgid "" 64 | "Registration using free email addresses is prohibited. Please supply a " 65 | "different email address." 66 | msgstr "La registración con un e-mail gratuito está prohibida. Por favor " 67 | "de una dirección de e-mail diferente." 68 | 69 | #: models.py:188 70 | msgid "user" 71 | msgstr "usuario" 72 | 73 | #: models.py:189 74 | msgid "activation key" 75 | msgstr "clave de activación" 76 | 77 | #: models.py:194 78 | msgid "registration profile" 79 | msgstr "perfil de registro" 80 | 81 | #: models.py:195 82 | msgid "registration profiles" 83 | msgstr "perfiles de registro" 84 | -------------------------------------------------------------------------------- /registration/locale/fr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/fr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/fr/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Samuel Adam , 2007. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: django-registration 0.3 \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: 2007-09-20 10:30+0100\n" 13 | "Last-Translator: Samuel Adam \n" 14 | "Language-Team: Français \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "pseudo" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "adresse email" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "mot de passe" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "mot de passe (vérification)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Le pseudo ne peut contenir que des lettres, chiffres et le caractère souligné." 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Ce pseudo est déjà utilisé. Veuillez en choisir un autre." 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "Veuillez indiquer le même mot de passe dans les deux champs" 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "J'ai lu et accepté les Conditions Générales d'Utilisation" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "Vous devez accepter les conditions d'utilisation pour vous inscrire" 54 | 55 | #: forms.py:124 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "Cette adresse email est déjà utilisée. Veuillez en indiquer une autre." 60 | 61 | #: forms.py:149 62 | msgid "" 63 | "Registration using free email addresses is prohibited. Please supply a " 64 | "different email address." 65 | msgstr "L'inscription avec une adresse email d'un compte gratuit est interdite. Veuillez en indiquer une autre." 66 | 67 | #: models.py:188 68 | msgid "user" 69 | msgstr "utilisateur" 70 | 71 | #: models.py:189 72 | msgid "activation key" 73 | msgstr "clé d'activation" 74 | 75 | #: models.py:194 76 | msgid "registration profile" 77 | msgstr "profil d'inscription" 78 | 79 | #: models.py:195 80 | msgid "registration profiles" 81 | msgstr "profils d'inscription" 82 | -------------------------------------------------------------------------------- /registration/locale/he/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/he/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/he/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # translation of registration. 2 | # Copyright (C) 2008 THE registration'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the registration package. 4 | # <>, 2008. 5 | # , fuzzy 6 | # <>, 2008. 7 | # 8 | # 9 | msgid "" 10 | msgstr "" 11 | "Project-Id-Version: registration\n" 12 | "Report-Msgid-Bugs-To: \n" 13 | "POT-Creation-Date: 2008-02-10 02:01+0200\n" 14 | "PO-Revision-Date: 2008-02-10 02:05+0200\n" 15 | "Last-Translator: Meir Kriheli \n" 16 | "Language-Team: Hebrew\n" 17 | "MIME-Version: 1.0\n" 18 | "Content-Type: text/plain; charset=UTF-8\n" 19 | "Content-Transfer-Encoding: 8bit" 20 | 21 | #: forms.py:38 22 | msgid "username" 23 | msgstr "שם משתמש" 24 | 25 | #: forms.py:41 26 | msgid "email address" 27 | msgstr "דואר אלקטרוני" 28 | 29 | #: forms.py:43 30 | msgid "password" 31 | msgstr "סיסמה" 32 | 33 | #: forms.py:45 34 | msgid "password (again)" 35 | msgstr "סיסמה (שוב)" 36 | 37 | #: forms.py:54 38 | msgid "Usernames can only contain letters, numbers and underscores" 39 | msgstr "שמות משתמש יכולים להכיל רק אותיות, ספרות וקווים תחתונים" 40 | 41 | #: forms.py:59 42 | msgid "This username is already taken. Please choose another." 43 | msgstr "שם המשתמש תפוס כבר. נא לבחור אחר." 44 | 45 | #: forms.py:64 46 | msgid "You must type the same password each time" 47 | msgstr "יש להקליד את אותה הסיסמה פעמיים" 48 | 49 | #: forms.py:93 50 | msgid "I have read and agree to the Terms of Service" 51 | msgstr "קראתי והסכמתי לתנאי השימוש" 52 | 53 | #: forms.py:102 54 | msgid "You must agree to the terms to register" 55 | msgstr "עליך להסכים לתנאי השימוש" 56 | 57 | #: forms.py:121 58 | msgid "" 59 | "This email address is already in use. Please supply a different email " 60 | "address." 61 | msgstr "" 62 | "כתובת הדואר האלקטרוני תפוסה כבר. נא לספק כתובת דואר אחרת." 63 | 64 | #: forms.py:146 65 | msgid "" 66 | "Registration using free email addresses is prohibited. Please supply a " 67 | "different email address." 68 | msgstr "" 69 | "הרישום בעזרת תיבת דואר אלקטרוני חינמית אסור. נא לספק כתובת אחרת." 70 | 71 | #: models.py:188 72 | msgid "user" 73 | msgstr "משתמש" 74 | 75 | #: models.py:189 76 | msgid "activation key" 77 | msgstr "מפתח הפעלה" 78 | 79 | #: models.py:194 80 | msgid "registration profile" 81 | msgstr "פרופיל רישום" 82 | 83 | #: models.py:195 84 | msgid "registration profiles" 85 | msgstr "פרופילי רישום" 86 | 87 | -------------------------------------------------------------------------------- /registration/locale/is/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/is/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/is/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Icelandic translation of django-registration 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the django-registration 4 | # package. 5 | # Björn Kristinsson , 2009. 6 | # 7 | #, fuzzy 8 | msgid "" 9 | msgstr "" 10 | "Project-Id-Version: PACKAGE VERSION\n" 11 | "Report-Msgid-Bugs-To: \n" 12 | "POT-Creation-Date: 2009-01-22 12:49+0100\n" 13 | "PO-Revision-Date: 2009-01-22 12:49+0100\n" 14 | "Last-Translator: Björn Kristinsson \n" 15 | "Language-Team: Icelandic\n" 16 | "MIME-Version: 1.0\n" 17 | "Content-Type: text/plain; charset=UTF-8\n" 18 | "Content-Transfer-Encoding: 8bit\n" 19 | 20 | #: forms.py:36 21 | msgid "username" 22 | msgstr "notandanafn" 23 | 24 | #: forms.py:39 25 | msgid "email address" 26 | msgstr "netfang" 27 | 28 | #: forms.py:41 29 | msgid "password" 30 | msgstr "lykilorð" 31 | 32 | #: forms.py:43 33 | msgid "password (again)" 34 | msgstr "lykilorð (aftur)" 35 | 36 | #: forms.py:55 37 | msgid "This username is already taken. Please choose another." 38 | msgstr "Þetta notendanafn er þegar á skrá. Vinsamlega reyndu annað." 39 | 40 | #: forms.py:67 41 | msgid "You must type the same password each time" 42 | msgstr "Lykilorðin verða að vera eins " 43 | 44 | #: forms.py:90 45 | msgid "I have read and agree to the Terms of Service" 46 | msgstr "Ég hef lesið og samþykki skilmálana" 47 | 48 | #: forms.py:107 49 | msgid "" 50 | "This email address is already in use. Please supply a different email " 51 | "address." 52 | msgstr "Þetta netfang er þegar á skrá. Vinsamlegast notaðu annað netfang." 53 | 54 | #: forms.py:133 55 | msgid "" 56 | "Registration using free email addresses is prohibited. Please supply a " 57 | "different email address." 58 | msgstr "Óheimilt er að nota ókeypis netföng. Vinsamlegast notaðu annað netfang." 59 | 60 | #: models.py:218 61 | msgid "user" 62 | msgstr "notandi" 63 | 64 | #: models.py:219 65 | msgid "activation key" 66 | msgstr "einkennislykill" 67 | 68 | #: models.py:224 69 | msgid "registration profile" 70 | msgstr "skráningarprófíll" 71 | 72 | #: models.py:225 73 | msgid "registration profiles" 74 | msgstr "skráningarprófílar" 75 | -------------------------------------------------------------------------------- /registration/locale/it/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/it/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/it/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # translation of django.po to Italiano 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # 5 | # Nicola Larosa , 2008. 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: django\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 11 | "PO-Revision-Date: 2008-05-27 15:05+0200\n" 12 | "Last-Translator: Nicola Larosa \n" 13 | "Language-Team: Italiano\n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Generator: KBabel 1.11.4\n" 18 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 19 | 20 | #: forms.py:38 21 | msgid "username" 22 | msgstr "nome utente" 23 | 24 | #: forms.py:41 25 | msgid "email address" 26 | msgstr "indirizzo email" 27 | 28 | #: forms.py:43 29 | msgid "password" 30 | msgstr "password" 31 | 32 | #: forms.py:45 33 | msgid "password (again)" 34 | msgstr "password (di nuovo)" 35 | 36 | #: forms.py:54 37 | msgid "Usernames can only contain letters, numbers and underscores" 38 | msgstr "I nomi utente possono contenere solo lettere, numeri e sottolineature" 39 | 40 | #: forms.py:59 41 | msgid "This username is already taken. Please choose another." 42 | msgstr "Questo nome utente è già usato. Scegline un altro." 43 | 44 | #: forms.py:68 45 | msgid "You must type the same password each time" 46 | msgstr "Bisogna inserire la stessa password ogni volta" 47 | 48 | #: forms.py:96 49 | msgid "I have read and agree to the Terms of Service" 50 | msgstr "Dichiaro di aver letto e di approvare le Condizioni di Servizio" 51 | 52 | #: forms.py:105 53 | msgid "You must agree to the terms to register" 54 | msgstr "Per registrarsi bisogna approvare le condizioni" 55 | 56 | #: forms.py:124 57 | msgid "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "Questo indirizzo email è già in uso. Inserisci un altro indirizzo email." 60 | 61 | #: forms.py:149 62 | msgid "Registration using free email addresses is prohibited. Please supply a " 63 | "different email address." 64 | msgstr "La registrazione con indirizzi email gratis non è permessa. " 65 | "Inserisci un altro indirizzo email." 66 | 67 | #: models.py:188 68 | msgid "user" 69 | msgstr "utente" 70 | 71 | #: models.py:189 72 | msgid "activation key" 73 | msgstr "chiave di attivazione" 74 | 75 | #: models.py:194 76 | msgid "registration profile" 77 | msgstr "profilo di registrazione" 78 | 79 | #: models.py:195 80 | msgid "registration profiles" 81 | msgstr "profili di registrazione" 82 | 83 | -------------------------------------------------------------------------------- /registration/locale/ja/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/ja/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/ja/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Shinya Okano , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: django-registration 0.4 \n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: 2008-01-31 10:20+0900\n" 13 | "Last-Translator: Shinya Okano \n" 14 | "Language-Team: Japanese \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "ユーザ名" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "メールアドレス" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "パスワード" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "パスワード (確認)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "ユーザ名には半角英数とアンダースコアのみが使用できます。" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "このユーザ名は既に使用されています。他のユーザ名を指定してください。" 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "同じパスワードを入力する必要があります。" 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "サービス利用規約を読み、同意します。" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "登録するためには規約に同意する必要があります。" 54 | 55 | #: forms.py:124 56 | msgid "This email address is already in use. Please supply a different email address." 57 | msgstr "このメールアドレスは既に使用されています。他のメールアドレスを指定して下さい。" 58 | 59 | #: forms.py:149 60 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 61 | msgstr "自由なメールアドレスを使用した登録は禁止されています。他のメールアドレスを指定してください。" 62 | 63 | #: models.py:188 64 | msgid "user" 65 | msgstr "ユーザ" 66 | 67 | #: models.py:189 68 | msgid "activation key" 69 | msgstr "アクティベーションキー" 70 | 71 | #: models.py:194 72 | msgid "registration profile" 73 | msgstr "登録プロファイル" 74 | 75 | #: models.py:195 76 | msgid "registration profiles" 77 | msgstr "登録プロファイル" 78 | 79 | -------------------------------------------------------------------------------- /registration/locale/ko/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/ko/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/ko/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # Young Gyu Park , 2009. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2009-10-12 14:09-0500\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: Young Gyu Park \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: admin.py:23 20 | msgid "Activate users" 21 | msgstr "활동 사용자" 22 | 23 | #: admin.py:43 24 | msgid "Re-send activation emails" 25 | msgstr "이 메일 제 전송" 26 | 27 | #: forms.py:35 28 | msgid "username" 29 | msgstr "사용자 아이디" 30 | 31 | #: forms.py:36 32 | msgid "This value must contain only letters, numbers and underscores." 33 | msgstr "이 곳에는 숫자, _, 영문 글자만 가능합니다." 34 | 35 | #: forms.py:39 36 | msgid "Email address" 37 | msgstr "이메일 주소" 38 | 39 | #: forms.py:41 40 | msgid "Password" 41 | msgstr "사용자 패스워드" 42 | 43 | #: forms.py:43 44 | msgid "Password (again)" 45 | msgstr "패스워드 (재입력)" 46 | 47 | #: forms.py:55 48 | msgid "A user with that username already exists." 49 | msgstr "이미 같은 아이디로 사용자가 등록되어 있습니다." 50 | 51 | #: forms.py:67 52 | msgid "The two password fields didn't match." 53 | msgstr "패스워드가 서로 일치하지 않습니다." 54 | 55 | #: forms.py:78 56 | msgid "I have read and agree to the Terms of Service" 57 | msgstr "약관을 읽었고 그 내용에 동의합니다." 58 | 59 | #: forms.py:79 60 | msgid "You must agree to the terms to register" 61 | msgstr "약관에 동의 하셔야만 합니다." 62 | 63 | #: forms.py:95 64 | msgid "" 65 | "This email address is already in use. Please supply a different email " 66 | "address." 67 | msgstr "이메일이 이미 사용중입니다. 다른 이메일을 등록해 주세요." 68 | 69 | #: forms.py:122 70 | msgid "" 71 | "Registration using free email addresses is prohibited. Please supply a " 72 | "different email address." 73 | msgstr "무료 이메일 계정으로 등록하실 수 없습니다. 다른 이메일을 등록해 주세요" 74 | 75 | #: models.py:165 76 | msgid "user" 77 | msgstr "사용자" 78 | 79 | #: models.py:166 80 | msgid "activation key" 81 | msgstr "활성화 키" 82 | 83 | #: models.py:171 84 | msgid "registration profile" 85 | msgstr "등록 프로파일" 86 | 87 | #: models.py:172 88 | msgid "registration profiles" 89 | msgstr "등록 프로파일" 90 | -------------------------------------------------------------------------------- /registration/locale/nl/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/nl/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/nl/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: registration\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2008-08-14 13:25+0200\n" 11 | "PO-Revision-Date: 2008-08-14 13:25+0200\n" 12 | "Last-Translator: Joost Cassee \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=2; plural=(n != 1);\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "gebruikersnaam" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "e-mail adres" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "wachtwoord" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "wachtwoord (opnieuw)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Gebruikersnamen kunnen alleen letters, nummer en liggende streepjes bevatten." 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Deze gebruikersnaam is reeds in gebruik. Kiest u alstublieft een andere gebruikersnaam." 42 | 43 | #: forms.py:71 44 | msgid "You must type the same password each time" 45 | msgstr "U moet twee maal hetzelfde wachtwoord typen." 46 | 47 | #: forms.py:100 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "Ik heb de servicevoorwaarden gelezen en ga akkoord." 50 | 51 | #: forms.py:109 52 | msgid "You must agree to the terms to register" 53 | msgstr "U moet akkoord gaan met de servicevoorwaarden om u te registreren." 54 | 55 | #: forms.py:125 56 | msgid "This email address is already in use. Please supply a different email address." 57 | msgstr "Dit e-mail adres is reeds in gebruik. Kiest u alstublieft een ander e-mail adres." 58 | 59 | #: forms.py:151 60 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 61 | msgstr "U kunt u niet registreren met een gratis e-mail adres. Kiest u alstublieft een ander e-mail adres." 62 | 63 | #: models.py:191 64 | msgid "user" 65 | msgstr "gebruiker" 66 | 67 | #: models.py:192 68 | msgid "activation key" 69 | msgstr "activatiecode" 70 | 71 | #: models.py:197 72 | msgid "registration profile" 73 | msgstr "registratieprofiel" 74 | 75 | #: models.py:198 76 | msgid "registration profiles" 77 | msgstr "registratieprofielen" 78 | -------------------------------------------------------------------------------- /registration/locale/pl/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/pl/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/pl/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # Polish translation for django-registration. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the django-registration package. 4 | # Jarek Zgoda , 2007. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: 0.4\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: 2007-12-15 12:45+0100\n" 13 | "Last-Translator: Jarek Zgoda \n" 14 | "Language-Team: Polish \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "nazwa użytkownika" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "adres email" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "hasło" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "hasło (ponownie)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "" 38 | "Nazwa użytkownika może zawierać tylko litery, cyfry i znaki podkreślenia" 39 | 40 | #: forms.py:59 41 | msgid "This username is already taken. Please choose another." 42 | msgstr "Ta nazwa użytkownika jest już zajęta. Wybierz inną." 43 | 44 | #: forms.py:68 45 | msgid "You must type the same password each time" 46 | msgstr "Musisz wpisać to samo hasło w obu polach" 47 | 48 | #: forms.py:96 49 | msgid "I have read and agree to the Terms of Service" 50 | msgstr "Przeczytałem regulamin i akceptuję go" 51 | 52 | #: forms.py:105 53 | msgid "You must agree to the terms to register" 54 | msgstr "Musisz zaakceptować regulamin, aby się zarejestrować" 55 | 56 | #: forms.py:124 57 | msgid "" 58 | "This email address is already in use. Please supply a different email " 59 | "address." 60 | msgstr "Ten adres email jest już używany. Użyj innego adresu email." 61 | 62 | #: forms.py:149 63 | msgid "" 64 | "Registration using free email addresses is prohibited. Please supply a " 65 | "different email address." 66 | msgstr "" 67 | "Nie ma możliwości rejestracji przy użyciu darmowego adresu email. Użyj " 68 | "innego adresu email." 69 | 70 | #: models.py:188 71 | msgid "user" 72 | msgstr "użytkownik" 73 | 74 | #: models.py:189 75 | msgid "activation key" 76 | msgstr "klucz aktywacyjny" 77 | 78 | #: models.py:194 79 | msgid "registration profile" 80 | msgstr "profil rejestracji" 81 | 82 | #: models.py:195 83 | msgid "registration profiles" 84 | msgstr "profile rejestracji" 85 | -------------------------------------------------------------------------------- /registration/locale/pt_BR/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/pt_BR/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/pt_BR/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: FULL NAME \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: forms.py:38 20 | msgid "username" 21 | msgstr "usuário" 22 | 23 | #: forms.py:41 24 | msgid "email address" 25 | msgstr "endereço de email" 26 | 27 | #: forms.py:43 28 | msgid "password" 29 | msgstr "" 30 | 31 | #: forms.py:45 32 | msgid "password (again)" 33 | msgstr "senha (novamente)" 34 | 35 | #: forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Nomes de usuário apenas podem conter letras, números, e underscore" 38 | 39 | #: forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Este nome de usuário já existe. Por favor, escolha outro." 42 | 43 | #: forms.py:68 44 | msgid "You must type the same password each time" 45 | msgstr "Você deve escrever a mesma senha nos dois campos" 46 | 47 | #: forms.py:96 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "Eu lí e concordo com os Termos de Uso do serviço" 50 | 51 | #: forms.py:105 52 | msgid "You must agree to the terms to register" 53 | msgstr "Você deve concordar com os termos para registrar-se" 54 | 55 | #: forms.py:124 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "Este endereço de email já está em uso. Por favor, informe um endereço de email diferente." 60 | 61 | #: forms.py:149 62 | msgid "" 63 | "Registration using free email addresses is prohibited. Please supply a " 64 | "different email address." 65 | msgstr "Registrar-se com contas de email gratuitos está proibido. Por favor, informe um endereço de email diferente." 66 | 67 | #: models.py:188 68 | msgid "user" 69 | msgstr "usuário" 70 | 71 | #: models.py:189 72 | msgid "activation key" 73 | msgstr "chave de ativação" 74 | 75 | #: models.py:194 76 | msgid "registration profile" 77 | msgstr "profile de registro" 78 | 79 | #: models.py:195 80 | msgid "registration profiles" 81 | msgstr "profiles de registro" 82 | -------------------------------------------------------------------------------- /registration/locale/ru/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/ru/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/ru/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2009-10-21 20:12+0600\n" 11 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 12 | "Last-Translator: FULL NAME \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | 18 | #: admin.py:23 19 | msgid "Activate users" 20 | msgstr "Активировать учетные записи" 21 | 22 | #: admin.py:43 23 | msgid "Re-send activation emails" 24 | msgstr "Выслать ключи активации заново" 25 | 26 | #: forms.py:35 27 | msgid "Username" 28 | msgstr "Имя пользователя" 29 | 30 | #: forms.py:36 31 | msgid "This value must contain only letters, numbers and underscores." 32 | msgstr "Это поле может содержать только буквы, цифры и подчеркивания" 33 | 34 | #: forms.py:39 35 | msgid "Email address" 36 | msgstr "Адрес электронной почты" 37 | 38 | #: forms.py:41 39 | msgid "Password" 40 | msgstr "Пароль" 41 | 42 | #: forms.py:43 43 | msgid "Password (again)" 44 | msgstr "Пароль (снова)" 45 | 46 | #: forms.py:55 47 | msgid "A user with that username already exists." 48 | msgstr "Пользователь с таким именем уже существует." 49 | 50 | #: forms.py:67 51 | msgid "The two password fields didn't match." 52 | msgstr "Введенные пароли не совпадают." 53 | 54 | #: forms.py:78 55 | msgid "I have read and agree to the Terms of Service" 56 | msgstr "Я прочитал Правила Использования и согласен с ними" 57 | 58 | #: forms.py:79 59 | msgid "You must agree to the terms to register" 60 | msgstr "Для регистрации Вы должны согласиться с Правилами" 61 | 62 | #: forms.py:95 63 | msgid "" 64 | "This email address is already in use. Please supply a different email " 65 | "address." 66 | msgstr "" 67 | "Этот адрес электронной почты уже используется. Пожалуйста, введите другой " 68 | "адрес." 69 | 70 | #: forms.py:122 71 | msgid "" 72 | "Registration using free email addresses is prohibited. Please supply a " 73 | "different email address." 74 | msgstr "" 75 | "Регистрация с использованием свободных почтовых серверов запрещена. " 76 | "Пожалуйста, введите другой адрес электронной почты." 77 | 78 | #: models.py:165 79 | msgid "user" 80 | msgstr "пользователь" 81 | 82 | #: models.py:166 83 | msgid "activation key" 84 | msgstr "ключ активации" 85 | 86 | #: models.py:171 87 | msgid "registration profile" 88 | msgstr "карточка регистрации" 89 | 90 | #: models.py:172 91 | msgid "registration profiles" 92 | msgstr "карточки регистрации" 93 | -------------------------------------------------------------------------------- /registration/locale/sl/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/sl/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/sl/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: 0.8.1beta\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2009-10-12 14:09-0500\n" 11 | "PO-Revision-Date: 2009-10-23 15:49+0100\n" 12 | "Last-Translator: Domen Kožar \n" 13 | "Language-Team: Slovenian \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=utf-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "X-Poedit-Language: Slovenian\n" 18 | "X-Poedit-Country: SLOVENIA\n" 19 | 20 | #: admin.py:23 21 | msgid "Activate users" 22 | msgstr "Aktiviraj uporabnike" 23 | 24 | #: admin.py:43 25 | msgid "Re-send activation emails" 26 | msgstr "Ponovno pošlju aktivacijske emaile" 27 | 28 | #: forms.py:35 29 | msgid "username" 30 | msgstr "uporabniško ime" 31 | 32 | #: forms.py:36 33 | msgid "This value must contain only letters, numbers and underscores." 34 | msgstr "Vrednost lahko vsebuje samo črke, cifre in podčrtaje." 35 | 36 | #: forms.py:39 37 | msgid "Email address" 38 | msgstr "Elektronska pošta" 39 | 40 | #: forms.py:41 41 | msgid "Password" 42 | msgstr "Geslo" 43 | 44 | #: forms.py:43 45 | msgid "Password (again)" 46 | msgstr "Geslo (ponovno)" 47 | 48 | #: forms.py:55 49 | msgid "A user with that username already exists." 50 | msgstr "Uporabnik z tem uporabniškim imenom že obstaja." 51 | 52 | #: forms.py:67 53 | msgid "The two password fields didn't match." 54 | msgstr "Polji z gesli se ne ujemata." 55 | 56 | #: forms.py:78 57 | msgid "I have read and agree to the Terms of Service" 58 | msgstr "Strinjam se z pogoji uporable" 59 | 60 | #: forms.py:79 61 | msgid "You must agree to the terms to register" 62 | msgstr "Za registracijo se morate strinjati z pogoji uporabe" 63 | 64 | #: forms.py:95 65 | msgid "This email address is already in use. Please supply a different email address." 66 | msgstr "Email je že v uporabi, prosimo vnesite drugega." 67 | 68 | #: forms.py:122 69 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 70 | msgstr "Registracija ni mogoča z brezplačnimi email naslovi. Prosimo vnesite drug email naslov." 71 | 72 | #: models.py:165 73 | msgid "user" 74 | msgstr "Uporabnik" 75 | 76 | #: models.py:166 77 | msgid "activation key" 78 | msgstr "Aktivacijski ključ" 79 | 80 | #: models.py:171 81 | msgid "registration profile" 82 | msgstr "Registracijski profil" 83 | 84 | #: models.py:172 85 | msgid "registration profiles" 86 | msgstr "Registracijski profili" 87 | 88 | -------------------------------------------------------------------------------- /registration/locale/sr/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/sr/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/sr/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: django-registration trunk\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2008-04-05 13:51+0200\n" 11 | "PO-Revision-Date: 2008-04-05 14:00+0100\n" 12 | "Last-Translator: Nebojsa Djordjevic \n" 13 | "Language-Team: \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" 18 | "X-Poedit-Language: Serbian\n" 19 | "X-Poedit-Country: YUGOSLAVIA\n" 20 | 21 | #: forms.py:38 22 | msgid "username" 23 | msgstr "korisničko ime" 24 | 25 | #: forms.py:41 26 | msgid "email address" 27 | msgstr "email adresa" 28 | 29 | #: forms.py:43 30 | msgid "password" 31 | msgstr "šifra" 32 | 33 | #: forms.py:45 34 | msgid "password (again)" 35 | msgstr "šifra (ponovo)" 36 | 37 | #: forms.py:54 38 | msgid "Usernames can only contain letters, numbers and underscores" 39 | msgstr "Korisničko ime može da se sastoji samo od slova, brojeva i donje crte (\"_\")" 40 | 41 | #: forms.py:59 42 | msgid "This username is already taken. Please choose another." 43 | msgstr "Korisničko ime je već zauzeto. Izaberite drugo." 44 | 45 | #: forms.py:71 46 | msgid "You must type the same password each time" 47 | msgstr "Unete šifre se ne slažu" 48 | 49 | #: forms.py:100 50 | msgid "I have read and agree to the Terms of Service" 51 | msgstr "Pročitao sam i slažem se sa uslovima korišćenja" 52 | 53 | #: forms.py:109 54 | msgid "You must agree to the terms to register" 55 | msgstr "Morate se složiti sa uslovima korišćenja da bi ste se registrovali" 56 | 57 | #: forms.py:128 58 | msgid "This email address is already in use. Please supply a different email address." 59 | msgstr "Ova e-mail adresa je već u upotrebi. Morate koristiti drugu e-mail adresu." 60 | 61 | #: forms.py:153 62 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 63 | msgstr "Registracija korišćenjem besplatnig e-mail adresa je zabranjena. Morate uneti drugu e-mail adresu." 64 | 65 | #: models.py:188 66 | msgid "user" 67 | msgstr "korisnik" 68 | 69 | #: models.py:189 70 | msgid "activation key" 71 | msgstr "aktivacioni ključ" 72 | 73 | #: models.py:194 74 | msgid "registration profile" 75 | msgstr "registracioni profil" 76 | 77 | #: models.py:195 78 | msgid "registration profiles" 79 | msgstr "registracioni profili" 80 | 81 | -------------------------------------------------------------------------------- /registration/locale/sv/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/sv/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/sv/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | #, fuzzy 7 | msgid "" 8 | msgstr "" 9 | "Project-Id-Version: PACKAGE VERSION\n" 10 | "Report-Msgid-Bugs-To: \n" 11 | "POT-Creation-Date: 2008-03-23 18:59+0100\n" 12 | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" 13 | "Last-Translator: Emil Stenström \n" 14 | "Language-Team: LANGUAGE \n" 15 | "MIME-Version: 1.0\n" 16 | "Content-Type: text/plain; charset=UTF-8\n" 17 | "Content-Transfer-Encoding: 8bit\n" 18 | 19 | #: .\forms.py:38 20 | msgid "username" 21 | msgstr "Användarnamn" 22 | 23 | #: .\forms.py:41 24 | msgid "email address" 25 | msgstr "E-postadress" 26 | 27 | #: .\forms.py:43 28 | msgid "password" 29 | msgstr "Lösenord" 30 | 31 | #: .\forms.py:45 32 | msgid "password (again)" 33 | msgstr "Lösenord (igen)" 34 | 35 | #: .\forms.py:54 36 | msgid "Usernames can only contain letters, numbers and underscores" 37 | msgstr "Användarnamn får bara innehålla bokstäver, siffror och understreck" 38 | 39 | #: .\forms.py:59 40 | msgid "This username is already taken. Please choose another." 41 | msgstr "Det användarnamnet är upptaget. Prova ett annat." 42 | 43 | #: .\forms.py:71 44 | msgid "You must type the same password each time" 45 | msgstr "Båda lösenord måste vara lika" 46 | 47 | #: .\forms.py:100 48 | msgid "I have read and agree to the Terms of Service" 49 | msgstr "Jag har läst och accepterar avtalet" 50 | 51 | #: .\forms.py:109 52 | msgid "You must agree to the terms to register" 53 | msgstr "Du måste acceptera avtalet för att registrera dig" 54 | 55 | #: .\forms.py:128 56 | msgid "" 57 | "This email address is already in use. Please supply a different email " 58 | "address." 59 | msgstr "Den e-postadressen är upptagen, använd an annan adress." 60 | 61 | #: .\forms.py:153 62 | msgid "" 63 | "Registration using free email addresses is prohibited. Please supply a " 64 | "different email address." 65 | msgstr "Gratis e-postadresser är inte tillåtna, använd en annan adress." 66 | 67 | #: .\models.py:188 68 | msgid "user" 69 | msgstr "Användare" 70 | 71 | #: .\models.py:189 72 | msgid "activation key" 73 | msgstr "Aktiveringsnyckel" 74 | 75 | #: .\models.py:194 76 | msgid "registration profile" 77 | msgstr "Profil" 78 | 79 | #: .\models.py:195 80 | msgid "registration profiles" 81 | msgstr "Profiler" 82 | -------------------------------------------------------------------------------- /registration/locale/zh_CN/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/zh_CN/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/zh_CN/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 11 | "PO-Revision-Date: 2008-03-20 23:22+0800\n" 12 | "Last-Translator: hutuworm \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | 18 | #: forms.py:38 19 | msgid "username" 20 | msgstr "用户名" 21 | 22 | #: forms.py:41 23 | msgid "email address" 24 | msgstr "Email 地址" 25 | 26 | #: forms.py:43 27 | msgid "password" 28 | msgstr "密码" 29 | 30 | #: forms.py:45 31 | msgid "password (again)" 32 | msgstr "密码(重复)" 33 | 34 | #: forms.py:54 35 | msgid "Usernames can only contain letters, numbers and underscores" 36 | msgstr "用户名只能包含字母、数字和下划线" 37 | 38 | #: forms.py:59 39 | msgid "This username is already taken. Please choose another." 40 | msgstr "该用户名已被占用,请另选一个。" 41 | 42 | #: forms.py:68 43 | msgid "You must type the same password each time" 44 | msgstr "您必须输入两遍同样的密码" 45 | 46 | #: forms.py:96 47 | msgid "I have read and agree to the Terms of Service" 48 | msgstr "我已阅读并同意该服务条款" 49 | 50 | #: forms.py:105 51 | msgid "You must agree to the terms to register" 52 | msgstr "您必须同意注册条款" 53 | 54 | #: forms.py:124 55 | msgid "This email address is already in use. Please supply a different email address." 56 | msgstr "该 Email 地址已有人使用,请提供一个另外的 Email 地址。" 57 | 58 | #: forms.py:149 59 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 60 | msgstr "禁止使用免费 Email 地址注册,请提供一个另外的 Email 地址。" 61 | 62 | #: models.py:188 63 | msgid "user" 64 | msgstr "用户" 65 | 66 | #: models.py:189 67 | msgid "activation key" 68 | msgstr "激活密钥" 69 | 70 | #: models.py:194 71 | msgid "registration profile" 72 | msgstr "注册信息" 73 | 74 | #: models.py:195 75 | msgid "registration profiles" 76 | msgstr "注册信息" 77 | 78 | -------------------------------------------------------------------------------- /registration/locale/zh_TW/LC_MESSAGES/django.mo: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/locale/zh_TW/LC_MESSAGES/django.mo -------------------------------------------------------------------------------- /registration/locale/zh_TW/LC_MESSAGES/django.po: -------------------------------------------------------------------------------- 1 | # SOME DESCRIPTIVE TITLE. 2 | # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER 3 | # This file is distributed under the same license as the PACKAGE package. 4 | # FIRST AUTHOR , YEAR. 5 | # 6 | msgid "" 7 | msgstr "" 8 | "Project-Id-Version: PACKAGE VERSION\n" 9 | "Report-Msgid-Bugs-To: \n" 10 | "POT-Creation-Date: 2007-09-19 19:30-0500\n" 11 | "PO-Revision-Date: 2008-03-20 23:22+0800\n" 12 | "Last-Translator: hutuworm \n" 13 | "Language-Team: LANGUAGE \n" 14 | "MIME-Version: 1.0\n" 15 | "Content-Type: text/plain; charset=UTF-8\n" 16 | "Content-Transfer-Encoding: 8bit\n" 17 | 18 | #: forms.py:38 19 | msgid "username" 20 | msgstr "用戶名" 21 | 22 | #: forms.py:41 23 | msgid "email address" 24 | msgstr "Email 地址" 25 | 26 | #: forms.py:43 27 | msgid "password" 28 | msgstr "密碼" 29 | 30 | #: forms.py:45 31 | msgid "password (again)" 32 | msgstr "密碼(重復)" 33 | 34 | #: forms.py:54 35 | msgid "Usernames can only contain letters, numbers and underscores" 36 | msgstr "用戶名只能包含字母、數字和下劃線" 37 | 38 | #: forms.py:59 39 | msgid "This username is already taken. Please choose another." 40 | msgstr "該用戶名已被佔用,請另選一個。" 41 | 42 | #: forms.py:68 43 | msgid "You must type the same password each time" 44 | msgstr "您必須輸入兩遍同樣的密碼" 45 | 46 | #: forms.py:96 47 | msgid "I have read and agree to the Terms of Service" 48 | msgstr "我已閱讀並同意該服務條款" 49 | 50 | #: forms.py:105 51 | msgid "You must agree to the terms to register" 52 | msgstr "您必須同意注冊條款" 53 | 54 | #: forms.py:124 55 | msgid "This email address is already in use. Please supply a different email address." 56 | msgstr "該 Email 地址已有人使用,請提供一個另外的 Email 地址。" 57 | 58 | #: forms.py:149 59 | msgid "Registration using free email addresses is prohibited. Please supply a different email address." 60 | msgstr "禁止使用免費 Email 地址注冊,請提供一個另外的 Email 地址。" 61 | 62 | #: models.py:188 63 | msgid "user" 64 | msgstr "用戶" 65 | 66 | #: models.py:189 67 | msgid "activation key" 68 | msgstr "激活密鑰" 69 | 70 | #: models.py:194 71 | msgid "registration profile" 72 | msgstr "注冊信息" 73 | 74 | #: models.py:195 75 | msgid "registration profiles" 76 | msgstr "注冊信息" 77 | 78 | -------------------------------------------------------------------------------- /registration/management/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/management/__init__.py -------------------------------------------------------------------------------- /registration/management/commands/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/registration/management/commands/__init__.py -------------------------------------------------------------------------------- /registration/management/commands/cleanupregistration.py: -------------------------------------------------------------------------------- 1 | """ 2 | A management command which deletes expired accounts (e.g., 3 | accounts which signed up but never activated) from the database. 4 | 5 | Calls ``RegistrationProfile.objects.delete_expired_users()``, which 6 | contains the actual logic for determining which accounts are deleted. 7 | 8 | """ 9 | 10 | from django.core.management.base import NoArgsCommand 11 | 12 | from registration.models import RegistrationProfile 13 | 14 | 15 | class Command(NoArgsCommand): 16 | help = "Delete expired user registrations from the database" 17 | 18 | def handle_noargs(self, **options): 19 | RegistrationProfile.objects.delete_expired_users() 20 | -------------------------------------------------------------------------------- /registration/signals.py: -------------------------------------------------------------------------------- 1 | from django.dispatch import Signal 2 | 3 | 4 | # A new user has registered. 5 | user_registered = Signal(providing_args=["user", "request"]) 6 | 7 | # A user has activated his or her account. 8 | user_activated = Signal(providing_args=["user", "request"]) 9 | -------------------------------------------------------------------------------- /revision/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/revision/__init__.py -------------------------------------------------------------------------------- /revision/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from revision.models import Revision 3 | from revision.models import Author,Tag,License,Language,OpSys 4 | 5 | class RevisionAdmin(admin.ModelAdmin): 6 | fieldsets = ( 7 | ('Metadata', { 8 | 'fields': ('software', 'version', 'authors')}), 9 | ('None', { 10 | 'fields': ( 'contact', 'short_description', 'description', 'changes', 11 | 'project_url', 'jmlr_mloss_url', 'tags', 'language', 'os_license', 12 | 'revision', 'updated_date', 'tarball', 'thumbnail', 'screenshot', 13 | 'operating_systems', 'dataformats', 'paper_bib')}), 14 | ) 15 | list_filter = ['pub_date', 'revision'] 16 | date_hierarchy = 'pub_date' 17 | search_fields = ['software'] 18 | list_display = ['software', 'version', 'changes', 'revision'] 19 | 20 | 21 | class AuthorAdmin(admin.ModelAdmin): 22 | pass 23 | 24 | class TagAdmin(admin.ModelAdmin): 25 | pass 26 | 27 | class LicenseAdmin(admin.ModelAdmin): 28 | pass 29 | 30 | class LanguageAdmin(admin.ModelAdmin): 31 | pass 32 | 33 | class OpSysAdmin(admin.ModelAdmin): 34 | pass 35 | 36 | admin.site.register(Revision, RevisionAdmin) 37 | admin.site.register(Author, AuthorAdmin) 38 | admin.site.register(Tag, TagAdmin) 39 | admin.site.register(License, LicenseAdmin) 40 | admin.site.register(Language, LanguageAdmin) 41 | admin.site.register(OpSys, OpSysAdmin) 42 | -------------------------------------------------------------------------------- /revision/urls.py: -------------------------------------------------------------------------------- 1 | """ 2 | URLConf for revision. 3 | 4 | Recommended usage is to use a call to ``include("revision.urls")`` in your project's 5 | root URLConf to include this URLConf for any URL beginning with 6 | '/browse/'. 7 | 8 | """ 9 | 10 | 11 | from django.conf.urls import url, include 12 | 13 | from revision.views import revision_detail 14 | from revision.views import view_homepage 15 | from revision.views import view_jmlr_homepage 16 | from revision.views import download_revision 17 | from revision.views import get_bibitem 18 | from revision.views import get_paperbibitem 19 | 20 | 21 | # General revision views. 22 | urlpatterns = [ 23 | url(r'^view/(?P\d+)/$', revision_detail, name='revision_detail'), 24 | url(r'^homepage/(?P\d+)/$', view_homepage, name='view_homepage'), 25 | url(r'^jmlrhomepage/(?P\d+)/$', view_jmlr_homepage, name='view_jmlr_homepage'), 26 | url(r'^download/(?P\d+)/$', download_revision, name='download_revision'), 27 | url(r'^bib/(?P\d+)/$', get_bibitem, name='get_bibitem'), 28 | url(r'^paperbib/(?P\d+)/$', get_paperbibitem, name='get_paperbibitem'), 29 | ] 30 | 31 | -------------------------------------------------------------------------------- /revision/views.py: -------------------------------------------------------------------------------- 1 | from django.http import HttpResponse, HttpResponseRedirect, Http404 2 | from django.shortcuts import get_object_or_404, render 3 | from django.template import RequestContext 4 | from django.contrib.sites.models import Site 5 | 6 | from revision.models import Revision 7 | from software.models import Software, SoftwareRating 8 | from software.forms import RatingForm 9 | 10 | def revision_detail(request, revision_id): 11 | revision = get_object_or_404(Revision, pk=revision_id) 12 | software = revision.software 13 | revisions = Revision.objects.filter(software=software) 14 | todays_stats = software.update_views() 15 | 16 | if revisions.count() <= 1: 17 | revisions = None 18 | 19 | ratingform = None 20 | 21 | if request.user.is_authenticated() and not request.user == software.user: 22 | try: 23 | r = SoftwareRating.objects.get(user__id=request.user.id, software=software) 24 | ratingform= RatingForm({'features': r.features, 25 | 'usability': r.usability, 26 | 'documentation': r.documentation}) 27 | 28 | except SoftwareRating.DoesNotExist: 29 | ratingform = RatingForm() 30 | 31 | return render(request, 'software/software_detail.html', {'object' : revision}) 32 | 33 | 34 | def download_revision(request, revision_id): 35 | entry = get_object_or_404(Revision, pk=revision_id) 36 | sw = get_object_or_404(Software, pk=entry.software.pk) 37 | sw.update_downloads() 38 | 39 | if entry.download_url: 40 | return HttpResponseRedirect(entry.download_url) 41 | elif entry.tarball: 42 | return HttpResponseRedirect('/media/' + entry.tarball.name) 43 | else: 44 | raise Http404 45 | 46 | def view_homepage(request, revision_id): 47 | entry = get_object_or_404(Revision, pk=revision_id) 48 | sw = get_object_or_404(Software, pk=entry.software.pk) 49 | sw.update_views() 50 | return HttpResponseRedirect(entry.project_url) 51 | 52 | def view_jmlr_homepage(request, revision_id): 53 | entry = get_object_or_404(Revision, pk=revision_id) 54 | sw = get_object_or_404(Software, pk=entry.software.pk) 55 | sw.update_views() 56 | return HttpResponseRedirect(entry.jmlr_mloss_url) 57 | 58 | def get_bibitem(request, revision_id): 59 | entry = get_object_or_404(Revision, pk=revision_id) 60 | sw = get_object_or_404(Software, pk=entry.software.pk) 61 | sw.update_views() 62 | key='' 63 | authors='' 64 | author_list = entry.authors.split(',') 65 | for i in xrange(len(author_list)): 66 | a=author_list[i] 67 | key+=a.split(' ')[-1][:3] 68 | authors+=a.strip() 69 | if iComment by %s on %s' % (object.name, object.submit_date.strftime("%Y-%m-%d %H:%M")), 59 | link, markdown(object.comment), 60 | author_name=object.name, 61 | pubdate=object.submit_date, unique_id=link,) 62 | response = HttpResponse(mimetype='application/xml') 63 | feed.write(response, 'utf-8') 64 | return response 65 | 66 | def RssCommentsFeed(request, software_id): 67 | sw = get_object_or_404(Software, pk=software_id) 68 | ctype = ContentType.objects.get_for_model(sw) 69 | object_list = Comment.objects.filter(content_type=ctype, object_pk=sw.pk).order_by('submit_date') 70 | 71 | feed = WellFormedWebRss( u'mloss.org ' + sw.title.encode('utf-8'), 72 | "http://mloss.org", 73 | u'Updates and additions to ' + sw.title.encode('utf-8'), 74 | language=u"en") 75 | 76 | for object in object_list: 77 | link = 'http://%s%s' % (Site.objects.get_current().domain, object.get_absolute_url()) 78 | feed.add_item(u'By: %s on: %s' % (object.name, object.submit_date.strftime("%Y-%m-%d %H:%M")), 79 | link, markdown(object.comment), 80 | author_name=object.name, 81 | pubdate=object.submit_date, unique_id=link,) 82 | response = HttpResponse(mimetype='application/xml') 83 | feed.write(response, 'utf-8') 84 | return response 85 | -------------------------------------------------------------------------------- /software/templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/software/templatetags/__init__.py -------------------------------------------------------------------------------- /software/templatetags/get_version.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.conf import settings 3 | 4 | register = template.Library() 5 | 6 | @register.simple_tag 7 | def get_version(): 8 | return settings.VERSION 9 | -------------------------------------------------------------------------------- /software/templatetags/paginator.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from urllib import quote 3 | 4 | register = template.Library() 5 | @register.inclusion_tag('paginator.html', takes_context=True) 6 | 7 | def paginator(context, adjacent_pages=2): 8 | """ 9 | To be used in conjunction with the object_list generic view. 10 | 11 | Adds pagination context variables for use in displaying first, adjacent and 12 | last page links in addition to those created by the object_list generic 13 | view. 14 | 15 | """ 16 | 17 | if context.has_key('is_paginated'): 18 | page_obj=context['page_obj'] 19 | paginator=page_obj.paginator 20 | page_numbers = [n for n in \ 21 | range(page_obj.number - adjacent_pages, page_obj.number + adjacent_pages + 1) \ 22 | if n > 0 and n <= paginator.num_pages] 23 | results_this_page = context['object_list'].count() 24 | range_base = ((page_obj.number - 1) * paginator.per_page) 25 | if len(page_numbers)<=1: 26 | page_numbers=[] 27 | 28 | r= { 29 | 'hits': paginator.count, 30 | 'results_per_page': paginator.per_page, 31 | 'results_this_page': results_this_page, 32 | 'first_this_page': range_base + 1, 33 | 'last_this_page': range_base + results_this_page, 34 | 'page': page_obj.number, 35 | 'pages': paginator.num_pages, 36 | 'page_numbers': page_numbers, 37 | 'next': page_obj.next_page_number, 38 | 'previous': page_obj.previous_page_number, 39 | 'has_next': page_obj.has_next(), 40 | 'has_previous': page_obj.has_previous(), 41 | 'show_first': 1 not in page_numbers, 42 | 'show_last': paginator.num_pages not in page_numbers, 43 | } 44 | 45 | if context.has_key('search_term'): 46 | r['search_term']=quote(context['search_term'],'') 47 | 48 | return r 49 | -------------------------------------------------------------------------------- /software/templatetags/permute_items.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | import random 3 | 4 | register = template.Library() 5 | 6 | class Permutator(template.Node): 7 | def __init__(self, context_var): 8 | self.context_var = context_var 9 | 10 | def render(self, context): 11 | return self.context_var 12 | 13 | def permute_items(parser, token): 14 | items = token.contents[13:].split('|') 15 | random.shuffle(items) 16 | return Permutator(", ".join(items)) 17 | 18 | register.tag('permute_items', permute_items) 19 | -------------------------------------------------------------------------------- /software/templatetags/safe_markup.py: -------------------------------------------------------------------------------- 1 | """ 2 | Implementation of a Markdown filter which supports safe mode and 3 | extensions. 4 | 5 | """ 6 | 7 | from django import template 8 | from django.conf import settings 9 | 10 | register = template.Library() 11 | 12 | def safe_markdown(value, arg=''): 13 | """ 14 | Runs Markdown over a given value, optionally using various 15 | extensions python-markdown supports. 16 | 17 | Syntax:: 18 | 19 | {{ value|markdown:"extension1_name,extension2_name..." }} 20 | 21 | To enable safe mode, which strips raw HTML and only returns HTML 22 | generated by actual Markdown syntax, pass "safe" as the first 23 | extension in the list. 24 | 25 | If the version of Markdown in use does not support extensions, 26 | they will be silently ignored. 27 | 28 | """ 29 | try: 30 | import markdown 31 | except ImportError: 32 | if settings.DEBUG: 33 | raise template.TemplateSyntaxError('Error in markdown filter: Markdown could not be imported.') 34 | else: 35 | # Try to salvage this; whatever we do, we shouldn't 36 | # return potentially unsafe HTML. 37 | from django.utils.html import escape, linebreaks 38 | return linebreaks(escape(value)) 39 | else: 40 | extensions=arg.split(",") 41 | if len(extensions) > 0 and extensions[0] == "safe": 42 | extensions = extensions[1:] 43 | safe_mode = True 44 | else: 45 | safe_mode = False 46 | if len(extensions) > 0 and extensions[0].startswith("cut"): 47 | cutoff = int(extensions[0][extensions[0].rfind("=")+1:]) 48 | extensions = extensions[1:] 49 | if len(value)>cutoff: 50 | p = value[:cutoff].find("\n") 51 | append="" 52 | if p == -1: 53 | append=" [...]" 54 | p = value[:cutoff-1].rfind(" ") 55 | if p >= 0: 56 | cutoff = p 57 | else: 58 | cutoff = p 59 | 60 | value = value[:cutoff] + append 61 | return markdown.markdown(value, extensions, safe_mode=safe_mode) 62 | 63 | 64 | def firstwords(value, arg=''): 65 | """ 66 | Return the first paragraph of a string, 67 | or up to number of characters defined by keyword cut 68 | """ 69 | extensions=arg.split(",") 70 | if len(extensions) > 0 and extensions[0].startswith("cut"): 71 | cutoff = int(extensions[0][extensions[0].rfind("=")+1:]) 72 | else: 73 | cutoff = 200 74 | 75 | if len(value)>cutoff: 76 | p = value[:cutoff].find("\n") 77 | append="" 78 | if p == -1: 79 | append=" [...]" 80 | p = value[:cutoff-1].rfind(" ") 81 | if p >= 0: 82 | cutoff = p 83 | else: 84 | cutoff = p 85 | value = value[:cutoff] + append 86 | return value 87 | 88 | register.filter('firstwords',firstwords) 89 | 90 | register.filter('safe_markdown', safe_markdown) 91 | -------------------------------------------------------------------------------- /software/templatetags/show_stars.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist, Variable 4 | from django.conf import settings 5 | 6 | register = Library() 7 | 8 | IMG_TEMPLATE = '%s' 9 | 10 | PATH_TO_WHOLE_STAR = IMG_TEMPLATE % (settings.STATIC_URL + 'images/stars/star.png', "Whole Star") 11 | PATH_TO_THREE_QUARTER_STAR = IMG_TEMPLATE % (settings.STATIC_URL + 'images/stars/three-quarter.png', "3/4 Star") 12 | PATH_TO_HALF_STAR = IMG_TEMPLATE % (settings.STATIC_URL + 'images/stars/half.png', "1/2 Star") 13 | PATH_TO_QUARTER_STAR = IMG_TEMPLATE % (settings.STATIC_URL + 'images/stars/quarter.png', "1/4 Star") 14 | PATH_TO_BLANK_STAR = IMG_TEMPLATE % (settings.STATIC_URL + 'images/stars/blank.png', "Empty Star") 15 | 16 | class ShowStarsNode(Node): 17 | """ Default rounding is to the whole unit """ 18 | def __init__(self, context_var, total_stars, round_to): 19 | self.context_var = context_var 20 | self.total_stars = int(total_stars) 21 | self.round_to = round_to.lower() 22 | 23 | def render(self, context): 24 | try: 25 | stars = Variable(self.context_var).resolve(context) 26 | #stars = resolve_variable(self.context_var, context) 27 | except VariableDoesNotExist: 28 | return '' 29 | 30 | if self.round_to == "half": 31 | stars = round(stars*2)/2 32 | elif self.round_to == "quarter": 33 | stars = round(stars*4)/4 34 | else: 35 | stars = round(stars) 36 | 37 | fraction, integer = math.modf(stars) 38 | integer = int(integer) 39 | output = [] 40 | 41 | for whole_star in range(integer): 42 | output.append(PATH_TO_WHOLE_STAR) 43 | if self.round_to == 'half' and fraction == .5: 44 | output.append(PATH_TO_HALF_STAR) 45 | elif self.round_to == 'quarter': 46 | if fraction == .25: 47 | output.append(PATH_TO_QUARTER_STAR) 48 | elif fraction == .5: 49 | output.append(PATH_TO_HALF_STAR) 50 | elif fraction == .75: 51 | output.append(PATH_TO_THREE_QUARTER_STAR) 52 | 53 | if fraction: 54 | integer += 1 55 | 56 | blanks = int(self.total_stars - integer) 57 | 58 | for blank_star in range(blanks): 59 | output.append(PATH_TO_BLANK_STAR) 60 | 61 | return "".join(output) 62 | 63 | """ show_stars context_var of 5 round to half """ 64 | def do_show_stars(parser, token): 65 | args = token.contents.split() 66 | if len(args) != 7: 67 | raise TemplateSyntaxError('%s tag requires exactly six arguments' % args[0]) 68 | if args[2] != 'of': 69 | raise TemplateSyntaxError("second argument to '%s' tag must be 'of'" % args[0]) 70 | if args[4] != 'round': 71 | raise TemplateSyntaxError("fourth argument to '%s' tag must be 'round'" % args[0]) 72 | if args[5] != 'to': 73 | raise TemplateSyntaxError("fourth argument to '%s' tag must be 'to'" % args[0]) 74 | return ShowStarsNode(args[1], args[3], args[6]) 75 | 76 | register.tag('show_stars', do_show_stars) 77 | -------------------------------------------------------------------------------- /software/views/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/software/views/__init__.py -------------------------------------------------------------------------------- /subscriptions/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/subscriptions/__init__.py -------------------------------------------------------------------------------- /subscriptions/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from subscriptions.models import Subscriptions 3 | 4 | class SubscriptionsAdmin(admin.ModelAdmin): 5 | list_display = ('user', 'title', 'last_updated', 'subscribed_date', 'url', 6 | 'object_id', 'content_type', 'bookmark') 7 | 8 | admin.site.register(Subscriptions, SubscriptionsAdmin) 9 | 10 | -------------------------------------------------------------------------------- /subscriptions/models.py: -------------------------------------------------------------------------------- 1 | from markdown import markdown 2 | from django.contrib.auth.models import User 3 | from django.contrib.contenttypes.models import ContentType 4 | from django.contrib.contenttypes import generic 5 | from django.db import models 6 | 7 | class Subscriptions(models.Model): 8 | """ 9 | Email subscriptions on various events 10 | 11 | * software authors should be notified when someone posts a comment to their software package 12 | * people sending comments to a sw should be notified on answers 13 | * people should be able to subscribe to threads in the forum 14 | * email reminder to users, once per quarter of the year, that they are subscribed and which 15 | software packages are new since their last logon 16 | * people should see a list of subscriptions on their user page (with unsubscribe option) 17 | """ 18 | 19 | # user, title, url 20 | user = models.ForeignKey(User) 21 | title = models.CharField(max_length=200) 22 | url = models.URLField(verify_exists=False) 23 | # if bookmark == true don't send out notifications 24 | bookmark = models.BooleanField(default=False) 25 | 26 | # software/posting object etc - this is handled via generic content types 27 | content_type = models.ForeignKey(ContentType) 28 | object_id = models.PositiveIntegerField() 29 | content_object = generic.GenericForeignKey() 30 | last_updated = models.DateTimeField(auto_now_add=True) 31 | subscribed_date = models.DateTimeField(auto_now_add=True) 32 | 33 | def get_unsubscribe_url(self): 34 | if self.title.startswith("Software"): 35 | return "/software/unsubscribe/%d" % self.object_id 36 | elif self.title.startswith("Forum"): 37 | c=self.content_type.get_object_for_this_type(id=self.object_id) 38 | return "/community/unsubscribe/%s" % c.slug 39 | elif self.title.startswith("Thread"): 40 | c=self.content_type.get_object_for_this_type(id=self.object_id) 41 | return "/community/unsubscribe/%s/%d" % (c.forum.slug, self.object_id) 42 | 43 | def get_rmbookmark_url(self): 44 | if self.title.startswith("Software"): 45 | return "/software/rmbookmark/%d" % self.object_id 46 | elif self.title.startswith("Forum"): 47 | c=self.content_type.get_object_for_this_type(id=self.object_id) 48 | return "/community/rmbookmark/%s" % c.slug 49 | elif self.title.startswith("Thread"): 50 | c=self.content_type.get_object_for_this_type(id=self.object_id) 51 | return "/community/rmbookmark/%s/%d" % (c.forum.slug, self.object_id) 52 | 53 | -------------------------------------------------------------------------------- /subscriptions2/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/subscriptions2/__init__.py -------------------------------------------------------------------------------- /subscriptions2/admin.py: -------------------------------------------------------------------------------- 1 | from django.contrib import admin 2 | from subscriptions2.models import Subscriptions 3 | class SubscriptionsAdmin(admin.ModelAdmin): 4 | list_display = ('user', 'title', 'last_updated', 'subscribed_date', 'url', 5 | 'object_id', 'content_type', 'bookmark') 6 | 7 | admin.site.register(Subscriptions, SubscriptionsAdmin) 8 | 9 | -------------------------------------------------------------------------------- /subscriptions2/models.py: -------------------------------------------------------------------------------- 1 | from markdown2 import markdown 2 | from django.contrib.auth.models import User 3 | from django.contrib.contenttypes.models import ContentType 4 | from django.contrib.contenttypes import fields 5 | from django.db import models 6 | 7 | class Subscriptions(models.Model): 8 | """ 9 | Email subscriptions on various events 10 | 11 | * software authors should be notified when someone posts a comment to their software package 12 | * people sending comments to a sw should be notified on answers 13 | * people should be able to subscribe to threads in the forum 14 | * email reminder to users, once per quarter of the year, that they are subscribed and which 15 | software packages are new since their last logon 16 | * people should see a list of subscriptions on their user page (with unsubscribe option) 17 | """ 18 | 19 | # user, title, url 20 | user = models.ForeignKey(User) 21 | title = models.CharField(max_length=200) 22 | url = models.URLField() 23 | # if bookmark == true don't send out notifications 24 | bookmark = models.BooleanField(default=False) 25 | 26 | # software/posting object etc - this is handled via generic content types 27 | content_type = models.ForeignKey(ContentType) 28 | object_id = models.PositiveIntegerField() 29 | content_object = fields.GenericForeignKey() 30 | last_updated = models.DateTimeField(auto_now_add=True) 31 | subscribed_date = models.DateTimeField(auto_now_add=True) 32 | 33 | def get_unsubscribe_url(self): 34 | if self.title.startswith("Software"): 35 | return "/software/unsubscribe/%d" % self.object_id 36 | elif self.title.startswith("Forum"): 37 | c=self.content_type.get_object_for_this_type(id=self.object_id) 38 | return "/community/unsubscribe/%s" % c.slug 39 | elif self.title.startswith("Thread"): 40 | c=self.content_type.get_object_for_this_type(id=self.object_id) 41 | return "/community/unsubscribe/%s/%d" % (c.forum.slug, self.object_id) 42 | 43 | def get_rmbookmark_url(self): 44 | if self.title.startswith("Software"): 45 | return "/software/rmbookmark/%d" % self.object_id 46 | elif self.title.startswith("Forum"): 47 | c=self.content_type.get_object_for_this_type(id=self.object_id) 48 | return "/community/rmbookmark/%s" % c.slug 49 | elif self.title.startswith("Thread"): 50 | c=self.content_type.get_object_for_this_type(id=self.object_id) 51 | return "/community/rmbookmark/%s/%d" % (c.forum.slug, self.object_id) 52 | 53 | -------------------------------------------------------------------------------- /templates/404.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block title %}Page not found{% endblock %} 4 | 5 | {% block content %} 6 | 7 |

Page not found

8 | 9 |

Looks like you followed a bad link. If you think it's our fault, 10 | please let us 11 | know.

12 | 13 |

Here's a link to the homepage. You know, just in case.

14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/500.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block title %}Page unavailable{% endblock %} 4 | 5 | {% block content %} 6 | 7 |

Page unavailable

8 | 9 |

We're sorry, but the requested page is currently unavailable.

10 | 11 |

We're messing around with things internally, and the server had a bit of a hiccup.

12 | 13 |

Please try again later.

14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/aggregator/feeditem_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base_community.html" %} 2 | 3 | {% block extrahead %} 4 | 5 | {% endblock %} 6 | 7 | {% block content %} 8 | 9 |

Community

10 |

This page, updated every day, aggregates blog entries by people who are 11 | writing about Machine Learning.

12 | 13 | {% for item in object_list %} 14 |

{{ item.title }}

15 |

16 | Posted on {{ item.date_modified|date:"F j, Y" }} 17 | at {{ item.date_modified|date:"g:i A" }} 18 | by {{ item.feed.title }} 19 | RSS

20 |
21 | {{ item.summary }} 22 |
23 |

Read this post in context »

24 | {% endfor %} 25 | 26 |
27 | {% if has_next %}Earlier posts{% endif %}

28 |
29 | 30 | {% endblock %} 31 | -------------------------------------------------------------------------------- /templates/author_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block title %}All Authors{% endblock %} 4 | 5 |

All users

6 | 7 | {% block content-main %} 8 | 13 | 14 |

15 | {% if has_previous %} 16 | < 17 | Previous {{ results_per_page }} 18 | {% endif %}   19 | {% if has_next %} 20 | Next 21 | {{ results_per_page }} > 22 | {% endif %}

23 | {% endblock %} 24 | 25 | {% block content-related %} 26 | Here is a list of all the authors 27 | {% endblock %} 28 | 29 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | 6 | 7 | 8 | mloss | {% block title %}Machine Learning Open Source Software{% endblock %} 9 | 10 | 11 | 12 | 13 | 15 | 16 | 17 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | {% block extrahead %}{% endblock %} 31 | 32 | 33 | 34 |
35 | 62 | 63 |
{% block billboard %}{% endblock %}
64 |
65 | {% block columnwrap %} 66 | 67 | {% endblock %} 68 |
69 | 70 | {% block footer %} 71 | 72 | {% endblock %} 73 |
74 | 75 | 79 | 84 | 85 | 86 | -------------------------------------------------------------------------------- /templates/base_2col.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block columnwrap %} 4 | 8 | 9 |
10 | {% block content %} 11 | {% endblock %} 12 |
13 | 14 | {% endblock %} 15 | 16 | {% block footer %} 17 | {% load get_version %} 18 | {% load permute_items %} 19 | 24 | {% endblock %} 25 | -------------------------------------------------------------------------------- /templates/base_workshop.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col" %} 2 | 3 | {% block sectionid %}workshop{% endblock %} 4 | 5 | {% block title %}Workshop{% endblock %} 6 | 7 | {% block billboard %}Workshop{% endblock %} 8 | 9 | {% block content-related %} 10 | 14 | {% endblock %} 15 | 16 | -------------------------------------------------------------------------------- /templates/blog/blogitem_archive_day.html: -------------------------------------------------------------------------------- 1 | {% extends "community/blog_list.html" %} 2 | 3 | {% block title %}Weblog | {{ day|date:"F j" }}{% endblock %} 4 | 5 | {% block content %} 6 | {% load safe_markup %} 7 |

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

8 | 9 | {% for object in object_list %} 10 |

{{ object.headline }}

11 |

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

12 | {{ object.body|safe_markdown:"safe" }} 13 | 14 | {% endfor %} 15 | 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /templates/blog/blogitem_archive_month.html: -------------------------------------------------------------------------------- 1 | {% extends "community/blog_list.html" %} 2 | 3 | {% block title %}Weblog | {{ month|date:"F" }}{% endblock %} 4 | 5 | {% block content %} 6 | {% load markup %} 7 |

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

8 | 9 | {% for object in object_list %} 10 |

{{ object.headline }}

11 |

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

12 | {{ object.body|markdown:"safe" }} 13 | 14 | {% endfor %} 15 | 16 | {% endblock %} 17 | -------------------------------------------------------------------------------- /templates/blog/blogitem_archive_year.html: -------------------------------------------------------------------------------- 1 | {% extends "community/blog_list.html" %} 2 | 3 | {% block title %}Weblog | {{ year }}{% endblock %} 4 | 5 | {% block content %} 6 | 7 |

{{ year|date:"Y" }} archive

8 | 9 | 14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/blog/blogitem_detail.html: -------------------------------------------------------------------------------- 1 | {% extends "community/blog_list.html" %} 2 | 3 | {% block title %}Weblog | {{ object.headline|escape }}{% endblock %} 4 | 5 | {% block content %} 6 | {% load markup %} 7 |

{{ object.headline }}

8 |

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

9 |

{{ object.body|markdown:"safe" }}

10 | 11 | {% load comments %} 12 | {% get_comment_list for blog.blogitem object.id as comment_list %} 13 | 14 |
15 |

Comments

16 | 17 | {% if comment_list %} 18 | {% for comment in comment_list %} 19 |
20 |
21 |
22 |
{{ comment.name }} (on {{ comment.submit_date|date:"F j, Y, H:i:s" }})
23 |
{{ comment.comment|markdown:"safe" }}
24 |
25 |
26 |
27 | {% endfor %} 28 | {% else %} 29 |

30 | No one has posted any comments yet. Perhaps you'd like to be the first? 31 |

32 | {% endif %} 33 | 34 |

Leave a comment

35 | {% if user.is_authenticated %} 36 | {% render_comment_form for blog.blogitem object.id %} 37 | {% else %} 38 |

39 | You must be logged in to post comments. 40 |

41 | {% endif %} 42 |
43 | {% endblock %} 44 | -------------------------------------------------------------------------------- /templates/comments/form.html: -------------------------------------------------------------------------------- 1 | {% load comments %} 2 | 3 |
{% csrf_token %} 4 | {% for field in form %} 5 | {% if field.is_hidden %} 6 | {{ field }} 7 | {% else %} 8 | {% ifequal field.name "honeypot" %} 9 |

{{ field.label_tag }} {{ field }}

10 | {% endifequal %} 11 | {% endif %} 12 | {% endfor %} 13 | 14 |
15 |
16 |
17 | 18 |
(will not appear publicly) 19 |
20 |
21 | 22 |
23 |
24 |
25 | 26 |

You may use Markdown syntax here, but HTML tags are forbidden.

27 |

28 | 29 |

30 |
31 | -------------------------------------------------------------------------------- /templates/comments/posted.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}browse{% endblock %} 4 | 5 | {% block title %}Comment posted{% endblock %} 6 | 7 | {% block billboard %}Title:{{ object.title }}{% endblock %} 8 | 9 | 10 | {% block content %} 11 | 12 |

Comment posted successfully

13 | 14 |

Thanks for contributing.

15 | 16 | {% if object %} 17 | 20 | {% endif %} 21 | 22 | {% endblock %} 23 | -------------------------------------------------------------------------------- /templates/comments/preview.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | {% block sectionid %}browse{% endblock %} 3 | 4 | {% block title %}Preview your comment submission{% endblock %} 5 | 6 | {% block billboard %}Preview your comment submission{% endblock %} 7 | 8 | {% block content %} 9 | {% load comments %} 10 | {% load markup %} 11 | {% load safe_markup %} 12 | 13 |
{% csrf_token %} 14 | {% if form.errors %} 15 |

Please correct the error{{ form.errors|pluralize }} below

16 | {% else %} 17 |

Preview your comment

18 | 19 | 20 | 31 | 32 |
21 |
22 |
23 |
24 |
(on {% now "F j, Y, H:i:s" %})
25 |
{{ comment|markdown:"safe" }}
26 |
27 |
28 |
29 |
30 |
33 | {% endif %} 34 | 35 | {% for field in form %} 36 | {% if field.is_hidden %} 37 | {{ field }} 38 | {% else %} 39 | {% ifequal field.name "honeypot" %} 40 |

{{ field.label_tag }} {{ field }}

41 | {% endifequal %} 42 | {% endif %} 43 | {% endfor %} 44 |
45 |
46 | 48 | {% if form.name.errors %}{{ form.name.errors }}{% endif %} 49 | 50 | 51 |
52 |
{{ form.name }}
53 | 54 |
(will not appear publicly) 55 | 57 | {% if form.email.errors %}{{ form.email.errors }}{% endif %} 58 | 59 |
60 |
{{ form.email }}
61 | 62 |
63 | 65 | {% if form.comment.errors %}{{ form.comment.errors }}{% endif %} 66 | 67 |
68 |
{{ form.comment }}
69 |
70 |

71 | 72 | 73 |

74 |
75 | 76 | {% endblock %} 77 | -------------------------------------------------------------------------------- /templates/community/blog_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}blog{% endblock %} 4 | 5 | {% block title %}Open Thoughts{% endblock %} 6 | 7 | {% block billboard %}Open Thoughts{% endblock %} 8 | 9 | {% load safe_markup %} 10 | {% load markup %} 11 | 12 | {% block content-related %} 13 | {% if blog_entries %} 14 |

Latest Thoughts

15 |

16 |

    17 | {% for latest_blog in blog_entries %} 18 |
  • {{ latest_blog.headline }} 19 |
    by 20 | {{ latest_blog.author }} 21 | on {{ latest_blog.pub_date|date:"F j, Y" }} 22 |
    23 |
  • 24 | {% endfor %} 25 |
26 |

27 | {% endif %} 28 | 29 | {% if blog_years %} 30 |

Archive

31 |

32 |

    33 | {% for year in blog_years %} 34 |
  • 35 |

    {{ year|date:"Y"}}

    36 |
  • 37 | {% endfor %} 38 |
39 |

40 | {% endif %} 41 | 42 | {% if latest_posts %} 43 |

Recent forum posts

44 |

45 |

58 |

59 | {% else %} 60 |

No forum yet.

61 | {% endif %} 62 | 63 |

RSS Feed RSS Feed - Blog

65 |

66 |

67 | {% endblock %} 68 | 69 | {% block content %} 70 | 71 | 72 | {% if latest %} 73 | {% for object in latest %} 74 |

{{ object.headline }}

75 |

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

79 |

{{ object.body|markdown:"safe" }}

80 | {% endfor %} 81 | {% else %} 82 |

No blogs yet

83 | {% endif %} 84 | 85 | {% endblock %} 86 | -------------------------------------------------------------------------------- /templates/community/forum_base.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}forum{% endblock %} 4 | 5 | {% block title %}Discussion Forum{% endblock %} 6 | 7 | {% block billboard %}Discussion Forum{% endblock %} 8 | 9 | {% block content %} 10 |
Home » Forums 11 | {% block breadcrumbs %}{% endblock %} 12 |
13 | {% endblock %} 14 | -------------------------------------------------------------------------------- /templates/community/forum_list.html: -------------------------------------------------------------------------------- 1 | {% extends "community/forum_base.html" %} 2 | 3 | {% block content %} 4 | 5 | 6 | 7 | 8 | 9 | {% for forum in object_list %} 10 | 11 | 15 | 16 | 17 | {% endfor %} 18 |
ForumLast Post

{{ forum.title }} {{ forum.threads }} thread{{ forum.threads|pluralize }}, {{ forum.posts }} post{{ forum.posts|pluralize }} 12 | {% if user.is_authenticated %}[ Subscribe Bookmark]{% endif %} 13 |

14 |

{{ forum.description }}

{% if forum.forum_latest_post %}{{ forum.forum_latest_post.time|timesince }} ago by {{ forum.forum_latest_post.author }} (view){% else %}No Posts{% endif %}
19 | {% endblock %} 20 | 21 | {% load safe_markup %} 22 | {% load markup %} 23 | 24 | {% block content-related %} 25 |

Use ...

26 |

27 | the discussion forums to inform us about problems with this site, missing features. 28 | Or just discuss general MLOSS issues. 29 |

30 | 31 | {% endblock %} 32 | -------------------------------------------------------------------------------- /templates/community/summary.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}blog{% endblock %} 4 | 5 | {% block title %}Open Thoughts{% endblock %} 6 | 7 | {% block billboard %}Open Thoughts{% endblock %} 8 | 9 | {% block content-related %} 10 | 11 | {% load safe_markup %} 12 | {% load markup %} 13 | 14 | {% if blog_entries %} 15 |

Latest Thoughts

16 |

17 |

    18 | {% for latest_blog in blog_entries %} 19 |
  • {{ latest_blog.headline }} 20 |
    by 21 | {{ latest_blog.author }} 22 | on {{ latest_blog.pub_date|date:"F j, Y" }} 23 |
    24 |
  • 25 | {% endfor %} 26 |
27 |

28 | {% endif %} 29 | 30 | {% if blog_years %} 31 |

Archive

32 |

33 |

    34 | {% for year in blog_years %} 35 |
  • 36 |

    {{ year|date:"Y"}}

    37 |
  • 38 | {% endfor %} 39 |
40 |

41 | {% endif %} 42 | 43 | {% if latest_posts %} 44 |

Recent forum posts

45 |

46 |

59 |

60 | {% else %} 61 |

No forum yet.

62 | {% endif %} 63 | 64 | {% if latest_feeds %} 65 |

Recent posts from external sites

66 |

67 |

    68 | {% for feed in latest_feeds %} 69 |
  • {{ feed.title }}

    70 |
      71 | {% for item in feed.items %} 72 |
    • {{ item.title }}
    • 73 | {% endfor %} 74 |
    75 |
  • 76 | {% endfor %} 77 |
78 |

79 | {% else %} 80 |

No forum yet.

81 | {% endif %} 82 | 83 | 84 | 85 |

RSS Feed RSS Feed - Blog

86 | 87 | {% endblock %} 88 | 89 | {% block content %} 90 | {% if blog_entries %} 91 | {% for latest_blog in blog_entries %} 92 |

93 |

{{ latest_blog.headline }}

94 |

by 95 | {{ latest_blog.author }} 96 | on {{ latest_blog.pub_date|date:"F j, Y" }} 97 | 98 | {% load comments %} 99 | {% get_comment_list for blog.blogitem latest_blog.id as comment_list %} 100 | {% if comment_list %} 101 | {% get_comment_count for blog.blogitem latest_blog.id as comment_count %} 102 | ({{ comment_count }} comment{{ comment_count|pluralize }}) 103 | {% else %} 104 | (0 comments) 105 | {% endif %} 106 |

107 | 108 |

109 | {{ latest_blog.body|markdown:"safe" }} 110 |

111 |

112 | {% if not forloop.last %} 113 |
114 | {% endif %} 115 | {% endfor %} 116 | {% endif %} 117 | {% endblock %} 118 | -------------------------------------------------------------------------------- /templates/community/thread.html: -------------------------------------------------------------------------------- 1 | {% extends "community/forum_base.html" %} 2 | 3 | {% load paginator %} 4 | {% load markup %} 5 | 6 | {% block title %}{{ thread.title }} ({{ forum.title }}){% endblock %} 7 | {% block billboard %}Thread: {{ thread.title }} ({{ forum.title }}){% endblock %} 8 | 9 | {% block pagetitle %}{{ forum.title }} » {{ thread.title }}{% endblock %} 10 | 11 | 12 | {% block breadcrumbs %}» {{ forum.title }} » {{ thread.title }} ({{ thread.object_list }} post{{ thread.object_list|pluralize }}){% endblock %} 13 | 14 | {% block content %} 15 |

16 | {% paginator 5 %} 17 |
18 |
19 | {% for post in object_list %} 20 |
21 |
22 | 23 | 24 | 30 | 31 |
25 |
26 |
{{ post.author }} ( on {{ post.time|date:"F j, Y, H:i:s" }} )
27 |
{{ post.body|markdown:"safe" }}
28 |
29 |
32 |
33 |
34 | {% endfor %} 35 |
36 |
37 | 38 | {% paginator 5 %} 39 | 40 | {% if posting %} 41 |

Preview

42 |
43 |
{{ posting.author }} ( on {{ posting.time|date:"F j, Y, H:i:s" }} )
44 | {{ posting.body|markdown:"safe" }} 45 |
46 | {% endif %} 47 | 48 | {% if not has_next %} 49 |

Post a Reply

50 | {% if thread.closed %} 51 |

Sorry, this thread is closed. No further replies are permitted.

52 | {% else %} 53 |
54 |
55 | {% if not user.is_authenticated %} 56 |

Please login to create a thread.

57 |
58 |
59 | {% if form.username.errors %} 60 | {{ form.username.errors|join:", " }} 61 | {% endif %} 62 | {{ form.username|safe }} 63 |
64 |
65 |
66 | {% if form.password.errors %} 67 | {{ form.password.errors|join:", " }} 68 | {% endif %} 69 | {{ form.password|safe }} ( 70 | Forgotten your password?) 71 |
72 |
80 |
{{ form.body|safe }}
81 |
You may use Markdown syntax here, but raw HTML will be removed.
82 |
83 |
84 |
85 |
86 | {% endif %} 87 | {% endif %} 88 | {% endblock %} 89 | 90 | {% block content-related %} 91 |
You are in Forum {{ forum.title }} looking at thread {{ thread.title }}. 92 |
93 |
94 |
95 |

RSS Feed RSS Feed - Thread "{{ thread.title }}"

96 |

97 |
98 |
99 | {% endblock %} 100 | -------------------------------------------------------------------------------- /templates/faq_index.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}faq{% endblock %} 4 | 5 | {% block title %}Frequently Asked Questions{% endblock %} 6 | 7 | {% block billboard %}Frequently Asked Questions{% endblock %} 8 | 9 | {% block content-related %} 10 |

11 | To browse the currently listed software projects or to submit your own, 12 | click on the Software tab. 13 | You will need to register to be able to submit new projects.

14 | {% endblock %} 15 | 16 | {% block content %} 17 | {% load markup %} 18 | {% if all_faq_items %} 19 |
    20 | {% for nitem in all_faq_items %} 21 |
  1. 22 |

    {{ nitem.question|markdown }}

    23 | {{ nitem.answer|markdown }} 24 |
  2. 25 | {% endfor %} 26 |
27 | {% else %} 28 |

No faq items

29 | {% endif %} 30 | {% endblock %} 31 | -------------------------------------------------------------------------------- /templates/flatpages/default.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | {% block title %}{{ flatpage.title }}{% endblock %} 3 | 4 | {% block sectionid %}{{ flatpage.title }}{% endblock %} 5 | 6 | {% block billboard %}{{ flatpage.title }}{% endblock %} 7 | 8 | {% block content-related %} 9 |

10 | To browse the currently listed software projects or to submit your own, 11 | click on the Software tab. 12 | You will need to register to be able to submit new projects.

13 | {% endblock %} 14 | 15 | {% block content %} 16 | {{ flatpage.content }} 17 | {% endblock %} 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /templates/news_index.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}news{% endblock %} 4 | 5 | {% block title %}News Items{% endblock %} 6 | 7 | {% block billboard %}News Items{% endblock %} 8 | 9 | {% block content-related %} 10 | {% if all_news_items %} 11 |
    12 | {% for nitem in all_news_items %} 13 |
  • {{ nitem.headline }}
  • 14 | {% endfor %} 15 | {% else %} 16 |

    No news items

    17 | {% endif %} 18 | {% endblock %} 19 | 20 | {% block content %} 21 | {% if all_news_items %} 22 |
      23 | {% for nitem in all_news_items %} 24 |
    • 25 |

      {{ nitem.headline }} ({{ nitem.publication_date }})

      26 | {{ nitem.article }} 27 |
    • 28 | {% endfor %} 29 |
    30 | {% else %} 31 |

    No news items

    32 | {% endif %} 33 | {% endblock %} 34 | -------------------------------------------------------------------------------- /templates/paginator.html: -------------------------------------------------------------------------------- 1 | {% if page_numbers %} 2 |
    3 |
    4 | Showing Items {{ first_this_page }}-{{ last_this_page }} of {{ hits }} on page {{ page }} of {{ pages }}: 5 | {% if show_first %} 6 | {% if search_term %} 7 | First 8 | {% else %} 9 | First 10 | {% endif %} 11 | {% endif %} 12 | 13 | {% if has_previous %} 14 | {% if search_term %} 15 | Previous 16 | {% else %} 17 | Previous 18 | {% endif %} 19 | {% endif %} 20 | 21 | {% for pg in page_numbers %} 22 | {% ifequal pg page %} 23 | {{ pg }} 24 | {% else %} 25 | {% if search_term %} 26 | {{ pg }} 27 | {% else %} 28 | {{ pg }} 29 | {% endif %} 30 | {% endifequal %} 31 | {% endfor %} 32 | 33 | {% if has_next %} 34 | {% if search_term %} 35 | Next 36 | {% else %} 37 | Next 38 | {% endif %} 39 | {% endif %} 40 | 41 | {% if show_last %} 42 | {% if search_term %} 43 | Last 44 | {% else %} 45 | Last 46 | {% endif %} 47 | {% endif %} 48 |
    49 |
    50 | {% else %} 51 |

    52 | {% endif %} 53 | -------------------------------------------------------------------------------- /templates/registration/activate.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Account activation{% endblock %} 6 | 7 | {% block billboard %}Account activation{% endblock %} 8 | 9 | {% block content %} 10 | {% load humanize %} 11 |

    Either your activation key ({{ activation_key }}) was incorrect, or the activation key for your account has expired.

    12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /templates/registration/activation_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Account activation{% endblock %} 6 | 7 | {% block billboard %}Account activation{% endblock %} 8 | 9 | {% block content %} 10 | {% load humanize %} 11 |

    Thanks for signing up! Now you can log in and start contributing!

    12 | {% endblock %} 13 | 14 | -------------------------------------------------------------------------------- /templates/registration/activation_email.txt: -------------------------------------------------------------------------------- 1 | {% load humanize %} 2 | Someone, hopefully you, signed up for a new account at {{ site_url }} using this email address. If it was you, and you'd like to activate and use your account, click the link below or copy and paste it into your web browser's address bar: 3 | 4 | http://{{ site.domain }}{% url 'registration_activate' activation_key=activation_key %} 5 | 6 | If you didn't request this, you don't need to do anything; you won't receive any 7 | more email from us, and the account will expire automatically in {{ expiration_days|apnumber }} day{{expiration_days|apnumber|pluralize}}. 8 | -------------------------------------------------------------------------------- /templates/registration/activation_email_subject.txt: -------------------------------------------------------------------------------- 1 | {% load i18n %}{% trans "Account activation on" %} {{ site.name }} 2 | -------------------------------------------------------------------------------- /templates/registration/login.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Log in{% endblock %} 6 | 7 | {% block billboard %}Log in{% endblock %} 8 | 9 | {% block content-related %} 10 |

    If you don't have an account, you can sign up for one; it's free, and you'll be able to add content to this site.

    11 |

    Forgotten your password? Then click here to receive an e-mail with a new one.

    12 | {% endblock %} 13 | 14 | {% block content %} 15 | 16 | {% if form.errors %} 17 |

    Please correct the errors below:

    18 |

    Your username and password didn't match. Please try again.

    19 | {% endif %} 20 | 21 |

    Login

    22 |
    {% csrf_token %} 23 |
    24 |
    {% if form.username.errors %} {{ form.username.errors|join:", " }}{% endif %}
    25 |
    {{ form.username|safe }}
    26 |
    {% if form.password.errors %} {{ form.password.errors|join:", " }}{% endif %}
    27 |
    {{ form.password|safe }}
    28 |
    29 |
    30 |
    31 | 32 | {% endblock %} 33 | 34 | -------------------------------------------------------------------------------- /templates/registration/logout.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Logged out{% endblock %} 6 | 7 | {% block billboard %}Logout{% endblock %} 8 | 9 | {% block content %} 10 |

    You've been logged out.

    11 | {% endblock %} 12 | 13 | {% block content-related %} 14 |

    Thanks for stopping by; when you come back, don't forget to log in again.

    15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/registration/password_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Password change successful{% endblock %} 6 | 7 | {% block billboard %}Password change successful{% endblock %} 8 | 9 | {% block content %} 10 | 11 |

    Password change successful

    12 | 13 |

    Your password was changed.

    14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/registration/password_change_form.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Password change{% endblock %} 6 | 7 | {% block billboard %}Password change{% endblock %} 8 | 9 | {% block content %} 10 | 11 |

    Please enter your old password, for security's sake, and then 12 | enter your new password twice so we can verify you typed it in correctly.

    13 | 14 |
    {% csrf_token %} 15 | 16 | {% if form.old_password.errors %}{{ form.old_password.html_error_list }}{% endif %} 17 |

    {{ form.old_password|safe }}

    18 | {% if form.new_password1.errors %}{{ form.new_password1.html_error_list }}{% endif %} 19 |

    {{ form.new_password1|safe }}

    20 | {% if form.new_password2.errors %}{{ form.new_password2.html_error_list }}{% endif %} 21 |

    {{ form.new_password2|safe }}

    22 | 23 |

    24 |
    25 | 26 | {% endblock %} 27 | -------------------------------------------------------------------------------- /templates/registration/password_reset_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Password reset complete{% endblock %} 6 | 7 | {% block billboard %}Password reset complete{% endblock %} 8 | 9 | {% block content-related %} 10 |

    Password reset.

    11 | {% endblock %} 12 | 13 | {% block content %} 14 |

    Password reset complete

    15 |

    16 | Your password has been set. You may go ahead and log in now. 17 |

    18 |

    'Log in'

    19 | {% endblock %} 20 | -------------------------------------------------------------------------------- /templates/registration/password_reset_confirm.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Password reset{% endblock %} 6 | 7 | {% block billboard %}Password reset{% endblock %} 8 | 9 | {% block content %} 10 | 11 | {% if validlink %} 12 | 13 |

    Enter new password

    14 |

    Please enter your new password twice so we can verify you typed it in correctly.

    15 | 16 |
    {% csrf_token %} 17 | {% if form.new_password1.errors %}{{ form.new_password1.errors }}{% endif %} 18 |

    19 | {{ form.new_password1 }}

    20 | {% if form.new_password2.errors %}{{ form.new_password2.errors }}{% endif %} 21 |

    22 | {{ form.new_password2 }}

    23 |

    24 |
    25 | 26 | {% else %} 27 | 28 |

    Password reset unsuccessful

    29 | 30 |

    The password reset link was invalid, possibly because it has already been used. 31 | Please request a new password reset.

    32 | 33 | {% endif %} 34 | 35 | {% endblock %} 36 | -------------------------------------------------------------------------------- /templates/registration/password_reset_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Password reset successful{% endblock %} 6 | 7 | {% block billboard %}Password reset successful{% endblock %} 8 | 9 | {% block content-related %} 10 |

    Password reset.

    11 | {% endblock %} 12 | 13 | {% block content %} 14 |

    Password reset successful

    15 |

    We've e-mailed you instructions for setting your password 16 | to the e-mail address you submitted. You should be receiving it shortly.

    17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /templates/registration/password_reset_email.html: -------------------------------------------------------------------------------- 1 | {% load i18n %} 2 | {% autoescape off %} 3 | {% blocktrans %}You're receiving this e-mail because you requested a password reset for your user account at {{ site_name }}.{% endblocktrans %} 4 | 5 | {% trans "Please go to the following page and choose a new password:" %} 6 | {% block reset_link %} 7 | https://{{ domain }}{% url 'password_reset_confirm' uidb36=uid token=token %} 8 | {% endblock %} 9 | {% trans "Your username, in case you've forgotten:" %} {{ user.username }} 10 | 11 | {% trans "Thanks for using our site!" %} 12 | 13 | {% blocktrans %}The {{ site_name }} team{% endblocktrans %} 14 | 15 | {% endautoescape %} 16 | -------------------------------------------------------------------------------- /templates/registration/password_reset_form.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Password reset{% endblock %} 6 | 7 | {% block billboard %}Password reset{% endblock %} 8 | 9 | {% block content-related %} 10 |

    Forgotten your password? Enter your e-mail address, and we'll reset your password and e-mail the new one to you.

    11 | {% endblock %} 12 | 13 | {% block content %} 14 | 15 |

    Password reset

    16 | 17 |
    {% csrf_token %} 18 | {% if form.email.errors %}{{ form.email.html_error_list }}{% endif %} 19 |

    {{ form.email|safe }} 20 |

    21 |
    22 | 23 | {% endblock %} 24 | 25 | -------------------------------------------------------------------------------- /templates/registration/registration_complete.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Registration complete{% endblock %} 6 | 7 | {% block billboard %}Registration complete{% endblock %} 8 | 9 | {% block content %} 10 | {% load humanize %} 11 |

    An activation link has been sent to the email address you supplied, along with instructions for activating your account.

    12 | {% endblock %} 13 | -------------------------------------------------------------------------------- /templates/registration/registration_form.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}Sign up{% endblock %} 6 | 7 | {% block billboard %}Sign up{% endblock %} 8 | 9 | {% block content-related %} 10 |

    Fill out the form to the right (all fields are required), and your account will be created; you'll be sent an email with instructions on how to finish your registration.

    11 | {% endblock %} 12 | 13 | {% block content %} 14 | 15 | {% if form.errors %} 16 |

    Please correct the errors below:

    17 | {% endif %} 18 | 19 |
    {% csrf_token %} 20 |
    21 |
    {% if form.firstname.errors %} {{ form.firstname.errors|join:", " }}{% endif %}
    22 |
    {{ form.firstname|safe }}
    23 |
    {% if form.lastname.errors %} {{ form.lastname.errors|join:", " }}{% endif %}
    24 |
    {{ form.lastname|safe }}
    25 |
    {% if form.username.errors %} {{ form.username.errors|join:", " }}{% endif %}
    26 |
    {{ form.username|safe }}
    27 |
    {% if form.email.errors %} {{ form.email.errors|join:", " }}{% endif %}
    28 |
    {{ form.email|safe }}
    29 |
    {% if form.password1.errors %} {{ form.password2.errors|join:", " }}{% endif %}
    30 |
    {{ form.password1|safe }}
    31 |
    {% if form.password2.errors %} {{ form.password2.errors|join:", " }}{% endif %}
    32 |
    {{ form.password2|safe }}
    33 |
    {% if form.password2.errors %} {{ form.password2.errors|join:", " }}{% endif %}
    34 |
    {{ form.captcha }}
    35 | 36 |
    {% if form.tos.errors %} {{ form.tos.errors|join:", " }}{% endif %}  {{ form.tos|safe }}
    37 |
    38 |
    39 |
    40 | {% endblock %} 41 | -------------------------------------------------------------------------------- /templates/software/author_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | {% block title %}Authors{% endblock %} 4 | 5 | {% block billboard %}Authors{% endblock %} 6 | 7 | {% block content %} 8 | {% paginator 5 %} 9 | 16 | {% paginator 5 %} 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /templates/software/base_software.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | {% load paginator %} 3 | 4 | {% block sectionid %}browse{% endblock %} 5 | 6 | {% block title %}All entries{% endblock %} 7 | 8 | {% block billboard %}All entries{% endblock %} 9 | 10 | {% block content %} 11 | {% endblock %} 12 | 13 | {% block content-related %} 14 |

    Search

    15 |
    16 |
    17 | 18 | 19 |
    20 |
    21 |
    22 |

    Manage

    23 | 30 |

    Sort by

    31 | 39 |

    Filter by

    40 | 50 | 51 | {% if blog_entries %} 52 |

    53 |

    Latest Thoughts

    54 |

    55 |

      56 | {% for latest_blog in blog_entries %} 57 |
    • {{ latest_blog.headline }} 58 |
      by 59 | {{ latest_blog.author }} 60 | on {{ latest_blog.pub_date|date:"F j, Y" }} 61 |
      62 |
    • 63 | {% endfor %} 64 |
    65 |

    66 |

    67 | {% endif %} 68 | 69 | {% load safe_markup %} 70 | {% load markup %} 71 | {% if latest_posts %} 72 |

    Recent forum posts

    73 |

    74 |

    87 |

    88 | {% else %} 89 |

    No forum yet.

    90 | {% endif %} 91 | 92 |

    93 |

    RSS Feed RSS Feed - Blog

    94 |

    RSS Feed RSS Feed - New Software

    95 | 96 | 97 |

    98 | 99 |

    100 |

    101 | {% endblock %} 102 | 103 | 104 | -------------------------------------------------------------------------------- /templates/software/dataformat_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | 4 | {% block title %}Data Formats{% endblock %} 5 | 6 | {% block billboard %}Data Formats{% endblock %} 7 | 8 | {% block content %} 9 | {% paginator 5 %} 10 | 17 | {% paginator 5 %} 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /templates/software/language_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | {% block title %}Programming Languages{% endblock %} 4 | 5 | {% block billboard %}Programming Languages{% endblock %} 6 | 7 | {% block content %} 8 | {% paginator 5 %} 9 | 16 | {% paginator 5 %} 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /templates/software/license_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | {% block title %}Software Licenses{% endblock %} 4 | 5 | {% block billboard %}Software Licenses{% endblock %} 6 | 7 | {% block content %} 8 | {% paginator 5 %} 9 | 16 | {% paginator 5 %} 17 | {% endblock %} 18 | 19 | -------------------------------------------------------------------------------- /templates/software/opsys_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | 4 | {% block title %}Operating Systems{% endblock %} 5 | 6 | {% block billboard %}Operating Systems{% endblock %} 7 | 8 | {% block content %} 9 | {% paginator 5 %} 10 | 17 | {% paginator 5 %} 18 | {% endblock %} 19 | -------------------------------------------------------------------------------- /templates/software/software_contact_author.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block title %}Contact the authors of a package.{% endblock %} 4 | {% block billboard %}Contact the authors of a package.{% endblock %} 5 | {% block sectionid %}contact{% endblock %} 6 | {% block content %} 7 | 8 | {% if form.errors %} 9 |

    Please correct the errors below:

    10 | {% endif %} 11 | 12 |
    {% csrf_token %} 13 |
    14 | 15 | {% for field in form %} 16 |
    {{ field.errors }}{{ field.label_tag }}
    17 |
    {{ field }}
    18 | {% endfor %} 19 | 20 | 21 | 22 | 23 | {% endblock %} 24 | -------------------------------------------------------------------------------- /templates/software/tag_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | {% block title %}Tags{% endblock %} 4 | 5 | {% block billboard %}Tags{% endblock %} 6 | 7 | {% block content %} 8 | {% paginator 5 %} 9 | 16 | {% paginator 5 %} 17 | {% endblock %} 18 | -------------------------------------------------------------------------------- /templates/software/user_list.html: -------------------------------------------------------------------------------- 1 | {% extends "software/base_software.html" %} 2 | {% load paginator %} 3 | 4 | {% block title %}Users who have software projects{% endblock %} 5 | 6 | {% block billboard %}Users who have software projects{% endblock %} 7 | 8 | {% block content %} 9 | {% paginator 5 %} 10 |
      11 | {% for curuser in object_list %} 12 |
    • 13 | {{ curuser.username }} 14 | {% if curuser.get_full_name %} 15 | ({{ curuser.get_full_name }}) 16 | {% endif %} 17 |
    • 18 | {% endfor %} 19 |
    20 | {% paginator 5 %} 21 | {% endblock %} 22 | -------------------------------------------------------------------------------- /templates/users/user_change_done.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | 3 | {% block sectionid %}login{% endblock %} 4 | 5 | {% block title %}User details updated successfully.{% endblock %} 6 | 7 | {% block billboard %}User details updated successfully.{% endblock %} 8 | 9 | {% block content %} 10 | 11 |

    User details change change successful

    12 | 13 |

    Your user details were successfully updated. Click here to return to your user page.

    14 | 15 | {% endblock %} 16 | -------------------------------------------------------------------------------- /templates/users/user_list.html: -------------------------------------------------------------------------------- 1 | {% extends "base_2col.html" %} 2 | {% load paginator %} 3 | 4 | {% block sectionid %}browse{% endblock %} 5 | 6 | {% block title %}User List{% endblock %} 7 | 8 | {% block billboard %}User List{% endblock %} 9 | 10 | {% block content %} 11 | {% paginator 5 %} 12 | 13 | {% for curuser in object_list %} 14 | 15 | 16 | 17 | 18 | 19 | {% endfor %} 20 |
    {{ curuser.username }}{{curuser.get_full_name}}{{ curuser.email }}
    21 | {% paginator 5 %} 22 | {% endblock %} 23 | 24 | {% block content-related %} 25 |
    Viewing List of Users.
    26 | {% endblock %} 27 | 28 | -------------------------------------------------------------------------------- /templatetags/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/templatetags/__init__.py -------------------------------------------------------------------------------- /templatetags/get_version.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from django.conf import settings 3 | 4 | register = template.Library() 5 | 6 | @register.simple_tag 7 | def get_version(): 8 | return settings.VERSION 9 | -------------------------------------------------------------------------------- /templatetags/paginator.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | from urllib import quote 3 | 4 | register = template.Library() 5 | @register.inclusion_tag('paginator.html', takes_context=True) 6 | 7 | def paginator(context, adjacent_pages=2): 8 | """ 9 | To be used in conjunction with the object_list generic view. 10 | 11 | Adds pagination context variables for use in displaying first, adjacent and 12 | last page links in addition to those created by the object_list generic 13 | view. 14 | 15 | """ 16 | 17 | if context.has_key('is_paginated'): 18 | page_numbers = [n for n in \ 19 | range(context['page'] - adjacent_pages, context['page'] + adjacent_pages + 1) \ 20 | if n > 0 and n <= context['pages']] 21 | results_this_page = context['object_list'].count() 22 | range_base = ((context['page'] - 1) * context['results_per_page']) 23 | if len(page_numbers)<=1: 24 | page_numbers=[] 25 | 26 | r= { 27 | 'hits': context['hits'], 28 | 'results_per_page': context['results_per_page'], 29 | 'results_this_page': results_this_page, 30 | 'first_this_page': range_base + 1, 31 | 'last_this_page': range_base + results_this_page, 32 | 'page': context['page'], 33 | 'pages': context['pages'], 34 | 'page_numbers': page_numbers, 35 | 'next': context['next'], 36 | 'previous': context['previous'], 37 | 'has_next': context['has_next'], 38 | 'has_previous': context['has_previous'], 39 | 'show_first': 1 not in page_numbers, 40 | 'show_last': context['pages'] not in page_numbers, 41 | } 42 | 43 | if context.has_key('search_term'): 44 | r['search_term']=quote(context['search_term'],'') 45 | 46 | return r 47 | -------------------------------------------------------------------------------- /templatetags/permute_items.py: -------------------------------------------------------------------------------- 1 | from django import template 2 | import random 3 | 4 | register = template.Library() 5 | 6 | class Permutator(template.Node): 7 | def __init__(self, context_var): 8 | self.context_var = context_var 9 | 10 | def render(self, context): 11 | return self.context_var 12 | 13 | def permute_items(parser, token): 14 | items = token.contents[13:].split('|') 15 | random.shuffle(items) 16 | return Permutator(", ".join(items)) 17 | 18 | register.tag('permute_items', permute_items) 19 | -------------------------------------------------------------------------------- /templatetags/safe_markup.py: -------------------------------------------------------------------------------- 1 | """ 2 | Implementation of a Markdown filter which supports safe mode and 3 | extensions. 4 | 5 | """ 6 | 7 | from django import template 8 | from django.conf import settings 9 | 10 | register = template.Library() 11 | 12 | def safe_markdown(value, arg=''): 13 | """ 14 | Runs Markdown over a given value, optionally using various 15 | extensions python-markdown supports. 16 | 17 | Syntax:: 18 | 19 | {{ value|markdown:"extension1_name,extension2_name..." }} 20 | 21 | To enable safe mode, which strips raw HTML and only returns HTML 22 | generated by actual Markdown syntax, pass "safe" as the first 23 | extension in the list. 24 | 25 | If the version of Markdown in use does not support extensions, 26 | they will be silently ignored. 27 | 28 | """ 29 | try: 30 | import markdown 31 | except ImportError: 32 | if settings.DEBUG: 33 | raise template.TemplateSyntaxError('Error in markdown filter: Markdown could not be imported.') 34 | else: 35 | # Try to salvage this; whatever we do, we shouldn't 36 | # return potentially unsafe HTML. 37 | from django.utils.html import escape, linebreaks 38 | return linebreaks(escape(value)) 39 | else: 40 | extensions=arg.split(",") 41 | if len(extensions) > 0 and extensions[0] == "safe": 42 | extensions = extensions[1:] 43 | safe_mode = True 44 | else: 45 | safe_mode = False 46 | if len(extensions) > 0 and extensions[0].startswith("cut"): 47 | cutoff = int(extensions[0][extensions[0].rfind("=")+1:]) 48 | extensions = extensions[1:] 49 | if len(value)>cutoff: 50 | p = value[:cutoff].find("\n") 51 | append="" 52 | if p == -1: 53 | append=" [...]" 54 | p = value[:cutoff-1].rfind(" ") 55 | if p >= 0: 56 | cutoff = p 57 | else: 58 | cutoff = p 59 | 60 | value = value[:cutoff] + append 61 | return markdown.markdown(value, extensions, safe_mode=safe_mode) 62 | 63 | 64 | def firstwords(value, arg=''): 65 | """ 66 | Return the first paragraph of a string, 67 | or up to number of characters defined by keyword cut 68 | """ 69 | extensions=arg.split(",") 70 | if len(extensions) > 0 and extensions[0].startswith("cut"): 71 | cutoff = int(extensions[0][extensions[0].rfind("=")+1:]) 72 | else: 73 | cutoff = 200 74 | 75 | if len(value)>cutoff: 76 | p = value[:cutoff].find("\n") 77 | append="" 78 | if p == -1: 79 | append=" [...]" 80 | p = value[:cutoff-1].rfind(" ") 81 | if p >= 0: 82 | cutoff = p 83 | else: 84 | cutoff = p 85 | value = value[:cutoff] + append 86 | return value 87 | 88 | register.filter('firstwords',firstwords) 89 | 90 | register.filter('safe_markdown', safe_markdown) 91 | -------------------------------------------------------------------------------- /templatetags/show_stars.py: -------------------------------------------------------------------------------- 1 | import math 2 | 3 | from django.template import Library, Node, TemplateSyntaxError, VariableDoesNotExist, resolve_variable 4 | from django.conf import settings 5 | 6 | register = Library() 7 | 8 | IMG_TEMPLATE = '%s' 9 | 10 | PATH_TO_WHOLE_STAR = IMG_TEMPLATE % (settings.MEDIA_URL + 'images/stars/star.png', "Whole Star") 11 | PATH_TO_THREE_QUARTER_STAR = IMG_TEMPLATE % (settings.MEDIA_URL + 'images/stars/three-quarter.png', "3/4 Star") 12 | PATH_TO_HALF_STAR = IMG_TEMPLATE % (settings.MEDIA_URL + 'images/stars/half.png', "1/2 Star") 13 | PATH_TO_QUARTER_STAR = IMG_TEMPLATE % (settings.MEDIA_URL + 'images/stars/quarter.png', "1/4 Star") 14 | PATH_TO_BLANK_STAR = IMG_TEMPLATE % (settings.MEDIA_URL + 'images/stars/blank.png', "Empty Star") 15 | 16 | class ShowStarsNode(Node): 17 | """ Default rounding is to the whole unit """ 18 | def __init__(self, context_var, total_stars, round_to): 19 | self.context_var = context_var 20 | self.total_stars = int(total_stars) 21 | self.round_to = round_to.lower() 22 | 23 | def render(self, context): 24 | try: 25 | stars = resolve_variable(self.context_var, context) 26 | except VariableDoesNotExist: 27 | return '' 28 | 29 | if self.round_to == "half": 30 | stars = round(stars*2)/2 31 | elif self.round_to == "quarter": 32 | stars = round(stars*4)/4 33 | else: 34 | stars = round(stars) 35 | 36 | fraction, integer = math.modf(stars) 37 | integer = int(integer) 38 | output = [] 39 | 40 | for whole_star in range(integer): 41 | output.append(PATH_TO_WHOLE_STAR) 42 | if self.round_to == 'half' and fraction == .5: 43 | output.append(PATH_TO_HALF_STAR) 44 | elif self.round_to == 'quarter': 45 | if fraction == .25: 46 | output.append(PATH_TO_QUARTER_STAR) 47 | elif fraction == .5: 48 | output.append(PATH_TO_HALF_STAR) 49 | elif fraction == .75: 50 | output.append(PATH_TO_THREE_QUARTER_STAR) 51 | 52 | if fraction: 53 | integer += 1 54 | 55 | blanks = int(self.total_stars - integer) 56 | 57 | for blank_star in range(blanks): 58 | output.append(PATH_TO_BLANK_STAR) 59 | 60 | return "".join(output) 61 | 62 | """ show_stars context_var of 5 round to half """ 63 | def do_show_stars(parser, token): 64 | args = token.contents.split() 65 | if len(args) != 7: 66 | raise TemplateSyntaxError('%s tag requires exactly six arguments' % args[0]) 67 | if args[2] != 'of': 68 | raise TemplateSyntaxError("second argument to '%s' tag must be 'of'" % args[0]) 69 | if args[4] != 'round': 70 | raise TemplateSyntaxError("fourth argument to '%s' tag must be 'round'" % args[0]) 71 | if args[5] != 'to': 72 | raise TemplateSyntaxError("fourth argument to '%s' tag must be 'to'" % args[0]) 73 | return ShowStarsNode(args[1], args[3], args[6]) 74 | 75 | register.tag('show_stars', do_show_stars) 76 | -------------------------------------------------------------------------------- /update_feeds.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | logfile="/home/mloss/tmp/update_feeds.log" 4 | cp /dev/null $logfile 5 | echo "This is a message from update_feeds.sh `date`" >> $logfile 6 | cd ~/django/mloss 7 | export PYTHONPATH=/home/mloss/django: 8 | python update_feeds.py --settings='mloss.settings' >> $logfile 2>&1 9 | -------------------------------------------------------------------------------- /urls.py: -------------------------------------------------------------------------------- 1 | from django.views.static import serve 2 | from django.conf.urls import url, include 3 | from django.conf import settings 4 | from django.contrib.auth.models import User 5 | from django.contrib import admin 6 | from django.views.generic.list import ListView 7 | from django.views.generic import TemplateView 8 | from django.views.generic import RedirectView 9 | 10 | from forshow.views import newsindex 11 | from forshow.views import faqindex 12 | 13 | admin.autodiscover() 14 | 15 | urlpatterns = [ 16 | # administration 17 | url(r'^admin/', include(admin.site.urls)), 18 | 19 | # software and revision 20 | url(r'^software/', include('software.urls')), 21 | url(r'^revision/', include('revision.urls')), 22 | 23 | # Using registration 24 | url(r'^accounts/', include('registration.backends.default.urls')), 25 | url(r'^accounts/', include('registration.backends.simple.urls')), 26 | url(r'^community/', include('community.urls')), 27 | url(r'^user/', include('user.urls')), 28 | 29 | 30 | # Display News and FAQ- simplest possible dynamic page 31 | url(r'^news/', newsindex), 32 | url(r'^faq/', faqindex), 33 | 34 | # redirect the root to news 35 | url(r'^$', RedirectView.as_view(url='/software/')), 36 | 37 | # Enable comments 38 | url(r'^comments/', include('django_comments.urls')), 39 | ] 40 | 41 | if settings.DEBUG and not settings.PRODUCTION: 42 | urlpatterns += [url(r'^media/(?P.*)$', serve, {'document_root': settings.MEDIA_ROOT}),] 43 | -------------------------------------------------------------------------------- /user/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/open-machine-learning/mloss/61d929f2066752c81c669c639025a3931af4a138/user/__init__.py -------------------------------------------------------------------------------- /user/urls.py: -------------------------------------------------------------------------------- 1 | 2 | from django.conf.urls import url, include 3 | 4 | from user.views import ShowUserList 5 | from user.views import show_user 6 | from user.views import update_user 7 | 8 | # General softwares views. 9 | urlpatterns = [ 10 | url(r'^$', ShowUserList.as_view()), 11 | url(r'^view/(?P\d+)/$', show_user), 12 | url(r'^update/(?P\d+)/$', update_user), 13 | ] 14 | -------------------------------------------------------------------------------- /wfwfeed.py: -------------------------------------------------------------------------------- 1 | from django.contrib.sites.models import Site 2 | from django.contrib.syndication.views import Feed 3 | from django.utils.feedgenerator import rfc2822_date, SyndicationFeed 4 | from django.utils.xmlutils import SimplerXMLGenerator 5 | 6 | class WellFormedWebRss(SyndicationFeed): 7 | mime_type = 'application/rss+xml' 8 | def write(self, outfile, encoding): 9 | handler = SimplerXMLGenerator(outfile, encoding) 10 | handler.startDocument() 11 | handler.startElement(u"rss", {u"version": self._version, u"xmlns:wfw": u"http://wellformedweb.org/CommentAPI/"}) 12 | handler.startElement(u"channel", {}) 13 | handler.addQuickElement(u"title", self.feed['title']) 14 | handler.addQuickElement(u"link", self.feed['link']) 15 | handler.addQuickElement(u"description", self.feed['description']) 16 | if self.feed['language'] is not None: 17 | handler.addQuickElement(u"language", self.feed['language']) 18 | for cat in self.feed['categories']: 19 | handler.addQuickElement(u"category", cat) 20 | if self.feed['feed_copyright'] is not None: 21 | handler.addQuickElement(u"copyright", self.feed['feed_copyright']) 22 | handler.addQuickElement(u"lastBuildDate", rfc2822_date(self.latest_post_date()).decode('ascii')) 23 | self.write_items(handler) 24 | self.endChannelElement(handler) 25 | handler.endElement(u"rss") 26 | 27 | def endChannelElement(self, handler): 28 | handler.endElement(u"channel") 29 | 30 | _version = u"2.0" 31 | def write_items(self, handler): 32 | for item in self.items: 33 | handler.startElement(u"item", {}) 34 | handler.addQuickElement(u"title", item['title']) 35 | handler.addQuickElement(u"link", item['link']) 36 | if item['description'] is not None: 37 | handler.addQuickElement(u"description", item['description']) 38 | 39 | # Author information. 40 | if item["author_name"] and item["author_email"]: 41 | handler.addQuickElement(u"author", "%s (%s)" % \ 42 | (item['author_email'], item['author_name'])) 43 | elif item["author_email"]: 44 | handler.addQuickElement(u"author", item["author_email"]) 45 | elif item["author_name"]: 46 | handler.addQuickElement(u"dc:creator", item["author_name"], {"xmlns:dc": u"http://purl.org/dc/elements/1.1/"}) 47 | 48 | if item['pubdate'] is not None: 49 | handler.addQuickElement(u"pubDate", rfc2822_date(item['pubdate']).decode('ascii')) 50 | if item['comments'] is not None: 51 | handler.addQuickElement(u"comments", item['comments']) 52 | if item.has_key('wfw_commentRss') and item['wfw_commentRss'] is not None: 53 | handler.addQuickElement(u"wfw:commentRss", item['wfw_commentRss']) 54 | if item['unique_id'] is not None: 55 | handler.addQuickElement(u"guid", item['unique_id']) 56 | 57 | # Enclosure. 58 | if item['enclosure'] is not None: 59 | handler.addQuickElement(u"enclosure", '', 60 | {u"url": item['enclosure'].url, u"length": item['enclosure'].length, 61 | u"type": item['enclosure'].mime_type}) 62 | 63 | # Categories. 64 | for cat in item['categories']: 65 | handler.addQuickElement(u"category", cat) 66 | 67 | handler.endElement(u"item") 68 | 69 | def add_commentRss(self, c): 70 | self.items[-1]['wfw_commentRss']=c 71 | --------------------------------------------------------------------------------