Base work for teams.
parent
6d0544caab
commit
29fed4e6eb
|
@ -108,6 +108,7 @@ INSTALLED_APPS = (
|
||||||
'storages',
|
'storages',
|
||||||
'taggit',
|
'taggit',
|
||||||
'tastypie',
|
'tastypie',
|
||||||
|
'teams',
|
||||||
'typogrify',
|
'typogrify',
|
||||||
'user-admin',
|
'user-admin',
|
||||||
'utils',
|
'utils',
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
from django.contrib import admin
|
||||||
|
from teams.models import Team
|
||||||
|
|
||||||
|
|
||||||
|
class TeamAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'owner', 'created', 'modified')
|
||||||
|
ordering = ('-created',)
|
||||||
|
|
||||||
|
admin.site.register(Team, TeamAdmin)
|
|
@ -0,0 +1,28 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Team',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
|
||||||
|
('name', models.CharField(max_length=255)),
|
||||||
|
('slug', models.SlugField(max_length=255, blank=True)),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('modified', models.DateTimeField(auto_now=True)),
|
||||||
|
('members', models.ManyToManyField(related_name='member', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('owner', models.ForeignKey(related_name='owner', to=settings.AUTH_USER_MODEL)),
|
||||||
|
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('teams', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='team',
|
||||||
|
name='email',
|
||||||
|
field=models.EmailField(default='nick@snipt.net', max_length=255),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('teams', '0002_team_email'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='team',
|
||||||
|
name='user',
|
||||||
|
field=models.OneToOneField(null=True, blank=True, to=settings.AUTH_USER_MODEL),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,23 @@
|
||||||
|
from django.contrib.auth.models import User
|
||||||
|
from django.db import models
|
||||||
|
from snipts.utils import slugify_uniquely
|
||||||
|
|
||||||
|
|
||||||
|
class Team(models.Model):
|
||||||
|
user = models.OneToOneField(User, blank=True, null=True)
|
||||||
|
owner = models.ForeignKey(User, related_name='owner')
|
||||||
|
name = models.CharField(max_length=255)
|
||||||
|
email = models.EmailField(max_length=255)
|
||||||
|
slug = models.SlugField(max_length=255, blank=True)
|
||||||
|
members = models.ManyToManyField(User, related_name='member')
|
||||||
|
|
||||||
|
created = models.DateTimeField(auto_now_add=True, editable=False)
|
||||||
|
modified = models.DateTimeField(auto_now=True, editable=False)
|
||||||
|
|
||||||
|
def save(self, *args, **kwargs):
|
||||||
|
if not self.slug:
|
||||||
|
self.slug = slugify_uniquely(self.name, User, 'username')
|
||||||
|
return super(Team, self).save(*args, **kwargs)
|
||||||
|
|
||||||
|
def __unicode__(self):
|
||||||
|
return self.name
|
60
views.py
60
views.py
|
@ -2,7 +2,6 @@ import datetime
|
||||||
import hashlib
|
import hashlib
|
||||||
import os
|
import os
|
||||||
import stripe
|
import stripe
|
||||||
import requests
|
|
||||||
|
|
||||||
from accounts.models import UserProfile
|
from accounts.models import UserProfile
|
||||||
from annoying.decorators import ajax_request, render_to
|
from annoying.decorators import ajax_request, render_to
|
||||||
|
@ -10,7 +9,6 @@ from blogs.views import blog_list
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth.decorators import login_required
|
from django.contrib.auth.decorators import login_required
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core.mail import send_mail
|
|
||||||
from django.db.models import Count
|
from django.db.models import Count
|
||||||
from django.http import HttpResponseRedirect, HttpResponseBadRequest
|
from django.http import HttpResponseRedirect, HttpResponseBadRequest
|
||||||
from django.shortcuts import render_to_response
|
from django.shortcuts import render_to_response
|
||||||
|
@ -18,6 +16,7 @@ from django.template import RequestContext
|
||||||
from snipts.models import Snipt
|
from snipts.models import Snipt
|
||||||
from snipts.utils import get_lexers_list
|
from snipts.utils import get_lexers_list
|
||||||
from taggit.models import Tag
|
from taggit.models import Tag
|
||||||
|
from teams.models import Team
|
||||||
|
|
||||||
|
|
||||||
@render_to('for-teams.html')
|
@render_to('for-teams.html')
|
||||||
|
@ -31,59 +30,16 @@ def for_teams(request):
|
||||||
|
|
||||||
@render_to('for-teams-complete.html')
|
@render_to('for-teams-complete.html')
|
||||||
def for_teams_complete(request):
|
def for_teams_complete(request):
|
||||||
|
if request.method == 'POST' and request.user.is_authenticated():
|
||||||
|
|
||||||
if request.method == 'POST':
|
team = Team(name=request.POST['name'],
|
||||||
|
email='nick@snipt.net',
|
||||||
if 'g-recaptcha-response' not in request.POST:
|
owner=request.user)
|
||||||
return HttpResponseBadRequest()
|
user = User.objects.create_user(team.slug, team.email, 'password')
|
||||||
|
team.user = user
|
||||||
payload = {
|
team.save()
|
||||||
'secret': settings.RECAPTCHA_SECRET,
|
|
||||||
'response': request.POST['g-recaptcha-response'],
|
|
||||||
'remoteip': request.META.get('REMOTE_ADDR')
|
|
||||||
}
|
|
||||||
r = requests.post('https://www.google.com/recaptcha/api/siteverify',
|
|
||||||
data=payload)
|
|
||||||
|
|
||||||
if not r.json()['success']:
|
|
||||||
return HttpResponseBadRequest()
|
|
||||||
|
|
||||||
if request.user.is_authenticated():
|
|
||||||
name = request.POST['name']
|
|
||||||
members = request.POST['members']
|
|
||||||
info = request.POST['info']
|
|
||||||
send_mail('[Snipt] New Snipt for Teams beta request.', """
|
|
||||||
User: %s (%s)
|
|
||||||
Team name: %s
|
|
||||||
Team members: %s
|
|
||||||
Info:
|
|
||||||
|
|
||||||
%s
|
|
||||||
""" % (request.user.username, request.user.email, name, members,
|
|
||||||
info), 'support@snipt.net',
|
|
||||||
['nick@nicksergeant.com'], fail_silently=False)
|
|
||||||
|
|
||||||
profile = request.user.profile
|
|
||||||
profile.teams_beta_applied = True
|
|
||||||
profile.save()
|
|
||||||
else:
|
|
||||||
username = request.POST['username']
|
|
||||||
email = request.POST['email']
|
|
||||||
name = request.POST['name']
|
|
||||||
members = request.POST['members']
|
|
||||||
info = request.POST['info']
|
|
||||||
send_mail('[Snipt] New Snipt for Teams beta request.', """
|
|
||||||
User: %s (%s) (not authenticated)
|
|
||||||
Team name: %s
|
|
||||||
Team members: %s
|
|
||||||
Info:
|
|
||||||
|
|
||||||
%s
|
|
||||||
""" % (username, email, name, members, info), 'support@snipt.net',
|
|
||||||
['nick@nicksergeant.com'], fail_silently=False)
|
|
||||||
|
|
||||||
return {}
|
return {}
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return HttpResponseBadRequest()
|
return HttpResponseBadRequest()
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue