Skip to content
This repository has been archived by the owner on Jul 25, 2018. It is now read-only.

Commit

Permalink
Add create banner and banner listing pages.
Browse files Browse the repository at this point in the history
  • Loading branch information
Michael Kelly committed Jul 27, 2012
1 parent 8b9ade4 commit 229af5c
Show file tree
Hide file tree
Showing 9 changed files with 203 additions and 3 deletions.
20 changes: 20 additions & 0 deletions apps/facebook/decorators.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from django.utils.functional import wraps

from facebook.models import FacebookUser
from shared.utils import redirect


def fb_login_required(func):
"""
View decorator that checks to see that the user is logged in via Facebook.
If the user isn't, then we redirect them to the homepage as they most likely
stumbled onto this part of the site by accident.
"""
@wraps(func)
def inner(request, *args, **kwargs):
if (request.user.is_authenticated() and
isinstance(request.user, FacebookUser)):
return func(request, *args, **kwargs)
else:
return redirect('home')
return inner
29 changes: 29 additions & 0 deletions apps/facebook/forms.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple

from facebook.models import FacebookBanner, FacebookBannerInstance
from shared.forms import AdminModelForm
from shared.models import ENGLISH_LANGUAGE_CHOICES


class FacebookBannerInstanceForm(forms.ModelForm):
class Meta:
model = FacebookBannerInstance
fields = ('banner', 'text', 'can_be_an_ad')


class FacebookBannerAdminForm(AdminModelForm):
locales = forms.MultipleChoiceField(
required=False,
choices=ENGLISH_LANGUAGE_CHOICES,
widget=FilteredSelectMultiple('locales', is_stacked=False))

class Meta:
model = FacebookBanner

def __init__(self, *args, **kwargs):
"""Populate locale field from instance."""
super(FacebookBannerAdminForm, self).__init__(*args, **kwargs)

locales = self.instance.locale_set.all()
self.fields['locales'].initial = [l.locale for l in locales]
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# -*- coding: utf-8 -*-
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models


class Migration(SchemaMigration):

def forwards(self, orm):

# Changing field 'FacebookBannerInstance.created'
db.alter_column('facebook_facebookbannerinstance', 'created', self.gf('django.db.models.fields.DateTimeField')())
# Adding field 'FacebookBanner.name'
db.add_column('facebook_facebookbanner', 'name',
self.gf('django.db.models.fields.CharField')(default='Banner', max_length=256),
keep_default=False)


def backwards(self, orm):

# Changing field 'FacebookBannerInstance.created'
db.alter_column('facebook_facebookbannerinstance', 'created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True))
# Deleting field 'FacebookBanner.name'
db.delete_column('facebook_facebookbanner', 'name')


models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'facebook.facebookbanner': {
'Meta': {'object_name': 'FacebookBanner'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'image': ('django.db.models.fields.files.ImageField', [], {'max_length': '250'}),
'locale': ('shared.models.LocaleField', [], {'default': "'en-US'", 'max_length': '32'}),
'name': ('django.db.models.fields.CharField', [], {'default': "'Banner'", 'max_length': '256'})
},
'facebook.facebookbannerinstance': {
'Meta': {'object_name': 'FacebookBannerInstance'},
'banner': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['facebook.FacebookBanner']"}),
'can_be_an_ad': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'created': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'leaderboard_position': ('django.db.models.fields.IntegerField', [], {}),
'text': ('django.db.models.fields.CharField', [], {'max_length': '256'}),
'total_clicks': ('django.db.models.fields.IntegerField', [], {}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'banner_instance_set'", 'to': "orm['facebook.FacebookUser']"})
},
'facebook.facebookuser': {
'Meta': {'object_name': 'FacebookUser'},
'affiliates_user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True'}),
'id': ('django.db.models.fields.CharField', [], {'max_length': '128', 'primary_key': 'True'})
}
}

complete_apps = ['facebook']
2 changes: 2 additions & 0 deletions apps/facebook/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@ def fb_banner_rename(instance, filename):

class FacebookBanner(ModelBase):
"""A banner that users can customize and share on Facebook."""
name = models.CharField(max_length=255, default='Banner', unique=True,
verbose_name='Banner name')
image = models.ImageField(upload_to=fb_banner_rename,
storage=OverwritingStorage(),
max_length=settings.MAX_FILEPATH_LENGTH)
Expand Down
13 changes: 13 additions & 0 deletions apps/facebook/templates/facebook/banner_list.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
{% extends 'facebook/base.html' %}

{% block content %}
<h1>My Banners</h1>
<ol>
{% for banner_instance in banner_instances %}
<li>
<img src="{{ banner_instance.banner.image.url }}">
<p>{{ banner_instance.text }}</p>
</li>
{% endfor %}
</ol>
{% endblock %}
19 changes: 19 additions & 0 deletions apps/facebook/templates/facebook/create_banner.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
{% extends 'facebook/base.html' %}

{% block content %}
<h1>Create a Banner</h1>
<form method="post">
{{ csrf() }}
<ul>
{% for field_key in ['banner', 'text', 'can_be_an_ad'] %}
{% set field = form[field_key] %}
<li>
{{ field.label_tag() }}
{{ field }}
{{ field.errors }}
</li>
{% endfor %}
</ul>
<button type="submit">Create Banner &raquo;</button>
</form>
{% endblock %}
2 changes: 1 addition & 1 deletion apps/facebook/templates/facebook/first_run.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
{% block content %}
<p>First Run Page!</p>
<nav class="wizard">
<a class="next" href="#">Next &raquo;</a>
<a class="next" href="{{ url('facebook.create_banner') }}">Next &raquo;</a>
</nav>
{% endblock %}
6 changes: 5 additions & 1 deletion apps/facebook/urls.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
from django.conf.urls.defaults import patterns, url

from facebook import views


urlpatterns = patterns('facebook.views',
url(r'^/?', 'load_app', name='facebook.load_app'),
url(r'^/?$', views.load_app, name='facebook.load_app'),
url(r'^create_banner/?$', views.create_banner, name='facebook.create_banner'),
url(r'^banner_list/?$', views.banner_list, name='facebook.banner_list'),
)
25 changes: 24 additions & 1 deletion apps/facebook/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
from commonware.response.decorators import xframe_allow

from facebook.auth import login
from facebook.decorators import fb_login_required
from facebook.forms import FacebookBannerInstanceForm
from facebook.models import FacebookUser
from facebook.utils import decode_signed_request
from shared.utils import redirect
Expand Down Expand Up @@ -48,4 +50,25 @@ def load_app(request):
return jingo.render(request, 'facebook/first_run.html')

# TODO: Replace with actual app landing page.
return HttpResponse('Yay!')
return banner_list(request)


@fb_login_required
@xframe_allow
def create_banner(request):
form = FacebookBannerInstanceForm(request.POST or None)
if request.method == 'POST' and form.is_valid():
banner_instance = form.save(commit=False)
banner_instance.user = request.user
banner_instance.save()
return banner_list(request)

return jingo.render(request, 'facebook/create_banner.html', {'form': form})


@fb_login_required
@xframe_allow
def banner_list(request):
banner_instances = request.user.banner_instance_set.all()
return jingo.render(request, 'facebook/banner_list.html',
{'banner_instances': banner_instances})

0 comments on commit 229af5c

Please sign in to comment.