bound organiser with user model and create signal which create organiser model when user is organiser

remotes/origin/1203
Nazar Kotjuk 12 years ago
parent b89ccb3516
commit c1d578982d
  1. 4
      accounts/admin.py
  2. 4
      accounts/forms.py
  3. 85
      accounts/models.py
  4. 2
      functions/form_check.py
  5. 42
      organiser/models.py

@ -8,8 +8,6 @@ from forms import UserCreationForm, UserChangeForm
class UserAdmin(UserAdmin): class UserAdmin(UserAdmin):
form = UserChangeForm form = UserChangeForm
@ -23,7 +21,7 @@ class UserAdmin(UserAdmin):
(None, {'fields': ('url', 'country', 'city', 'position', (None, {'fields': ('url', 'country', 'city', 'position',
'about', 'phone', 'avatar', 'web_page', 'about', 'phone', 'avatar', 'web_page',
'social', 'title', 'descriptions', 'keywords', 'social', 'title', 'descriptions', 'keywords',
'is_admin', 'is_active')}), 'is_admin', 'is_active', 'is_translator', 'is_organiser')}),
) )
add_fieldsets = ( add_fieldsets = (

@ -6,6 +6,8 @@ from country.models import Country
from city.models import City from city.models import City
from company.models import Company from company.models import Company
from organiser.models import Organiser from organiser.models import Organiser
#functions
from functions.form_check import translit_with_separator
class UserCreationForm(forms.ModelForm): class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(render_value=False)) password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(render_value=False))
@ -35,7 +37,6 @@ class UserCreationForm(forms.ModelForm):
return password2 return password2
def save(self, commit=True): def save(self, commit=True):
user = super(UserCreationForm, self).save(commit=False) user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data['password2']) user.set_password(self.cleaned_data['password2'])
@ -62,6 +63,7 @@ class UserForm(forms.ModelForm):
title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
descriptions = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) descriptions = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
keywords = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) keywords = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False)
class Meta: class Meta:
model = User model = User
exclude = ('last_login', 'password', 'is_active', 'is_admin', 'is_superuser', 'is_staff' exclude = ('last_login', 'password', 'is_active', 'is_admin', 'is_superuser', 'is_staff'

@ -1,9 +1,13 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from hvad.models import TranslatableModel, TranslatedFields
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin
from django.core.mail import send_mail from django.core.mail import send_mail
from django.utils import timezone from django.utils import timezone
from django.db.models.signals import post_save from django.db.models.signals import post_save
#custom functions
from functions.custom_fields import LocationField
from functions.form_check import translit_with_separator
""" """
from django.contrib.auth.hashers import check_password from django.contrib.auth.hashers import check_password
from hashlib import md5 from hashlib import md5
@ -49,6 +53,7 @@ class UserManager(BaseUserManager):
return user return user
class User(AbstractBaseUser, PermissionsMixin): class User(AbstractBaseUser, PermissionsMixin):
""" """
Implementing a fully featured User model with Implementing a fully featured User model with
@ -56,6 +61,8 @@ class User(AbstractBaseUser, PermissionsMixin):
Email, first name, last name and password are required. Other fields are optional. Email, first name, last name and password are required. Other fields are optional.
""" """
email = models.EmailField( email = models.EmailField(
verbose_name = 'Электронная почта', verbose_name = 'Электронная почта',
max_length = 255, max_length = 255,
@ -64,11 +71,15 @@ class User(AbstractBaseUser, PermissionsMixin):
) )
first_name = models.CharField(verbose_name='Имя', max_length=255) first_name = models.CharField(verbose_name='Имя', max_length=255)
last_name = models.CharField(verbose_name='Фамилия', max_length=255) last_name = models.CharField(verbose_name='Фамилия', max_length=255)
url = models.SlugField(blank=True)
# #
is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле
is_staff = models.BooleanField(default=0) is_staff = models.BooleanField(default=0)
is_admin = models.BooleanField(default=0) is_admin = models.BooleanField(default=0)
is_translator = models.BooleanField(verbose_name='Переводчик', default=0) is_translator = models.BooleanField(verbose_name='Переводчик', default=0)
is_organiser = models.BooleanField(verbose_name='Организатор', default=0)
date_joined = models.DateTimeField(auto_now_add=True) date_joined = models.DateTimeField(auto_now_add=True)
date_registered = models.DateTimeField(blank=True, null=True)# date_registered = models.DateTimeField(blank=True, null=True)#
date_modified = models.DateTimeField(auto_now=True) date_modified = models.DateTimeField(auto_now=True)
@ -76,10 +87,8 @@ class User(AbstractBaseUser, PermissionsMixin):
country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, related_name='users') country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, related_name='users')
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True)
company = models.ForeignKey('company.Company', blank=True, null=True) company = models.ForeignKey('company.Company', blank=True, null=True)
organiser = models.ForeignKey('organiser.Organiser', blank=True, null=True)
#other user information #other user information
phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True) phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True)
url = models.CharField(verbose_name='URL', max_length=255, blank=True)
position = models.CharField(verbose_name='Должность', max_length=255, blank=True) position = models.CharField(verbose_name='Должность', max_length=255, blank=True)
about = models.TextField(verbose_name='О себе', blank=True) about = models.TextField(verbose_name='О себе', blank=True)
avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True) avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True)
@ -101,6 +110,14 @@ class User(AbstractBaseUser, PermissionsMixin):
""" """
return u'%s %s'%(self.first_name, self.last_name) return u'%s %s'%(self.first_name, self.last_name)
def set_url(self, st):
"""
"""
self.url = translit_with_separator(u'%s'%st)
def __unicode__(self): def __unicode__(self):
return self.email return self.email
@ -120,40 +137,10 @@ class User(AbstractBaseUser, PermissionsMixin):
def has_module_perms(self, app_label): def has_module_perms(self, app_label):
return True return True
"""
class MyUserAuthBackend(object):
def check_md5_password(self, db_password, supplied_password):
return md5(supplied_password).hex_digest(), db_password
def authenticate(self, username=None, password=None, **kwargs):
# Authenticate a user based on email address as the user name.
UserModel = get_user_model()
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
user = UserModel._default_manager.get_by_natural_key(username)
if check_password(password, user.password):
# user.set_password(password)
# user.save()
return user
#if user.check_password(password):
# return user
except UserModel.DoesNotExist:
return None
def get_user(self, user_id):
try:
UserModel = get_user_model()
return UserModel._default_manager.get(pk=user_id)
except UserModel.DoesNotExist:
return None
"""
class TranslatorProfile(models.Model): class TranslatorProfile(models.Model):
""" """
Extra information about tranlators Extra information about translators
""" """
#required field, relation with user model #required field, relation with user model
user = models.ForeignKey(User, related_name='translator') user = models.ForeignKey(User, related_name='translator')
@ -186,3 +173,35 @@ def create_translator_profile(sender, **kw):
post_save.connect(create_translator_profile, sender=User) post_save.connect(create_translator_profile, sender=User)
"""
class MyUserAuthBackend(object):
def check_md5_password(self, db_password, supplied_password):
return md5(supplied_password).hex_digest(), db_password
def authenticate(self, username=None, password=None, **kwargs):
# Authenticate a user based on email address as the user name.
UserModel = get_user_model()
if username is None:
username = kwargs.get(UserModel.USERNAME_FIELD)
try:
user = UserModel._default_manager.get_by_natural_key(username)
if check_password(password, user.password):
# user.set_password(password)
# user.save()
return user
#if user.check_password(password):
# return user
except UserModel.DoesNotExist:
return None
def get_user(self, user_id):
try:
UserModel = get_user_model()
return UserModel._default_manager.get(pk=user_id)
except UserModel.DoesNotExist:
return None
"""

@ -19,6 +19,8 @@ def translit_with_separator(string, separator='-'):
usage: translit_with_separator('введите, слово', '_') return 'vvedite_slovo' usage: translit_with_separator('введите, слово', '_') return 'vvedite_slovo'
string must be unicode
""" """
#make string translit #make string translit

@ -1,17 +1,23 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from django.db import models from django.db import models
from hvad.models import TranslatableModel, TranslatedFields from hvad.models import TranslatableModel, TranslatedFields
from accounts.models import User
from django.db.models.signals import post_save
#custom functions #custom functions
from functions.custom_fields import LocationField from functions.custom_fields import LocationField
from functions.form_check import translit_with_separator
class Organiser(TranslatableModel): class Organiser(TranslatableModel):
""" """
Create Company model Create Organiser model
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
""" """
url = models.CharField(verbose_name='URL', max_length=255) user = models.ForeignKey(User, related_name='organiser')
url = models.SlugField(verbose_name='URL', blank=True)
#relations #relations
country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True) country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True)
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True)
@ -28,20 +34,21 @@ class Organiser(TranslatableModel):
foundation = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True) foundation = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True)
events_number = models.PositiveIntegerField(verbose_name='Количество мероприятий', blank=True, null=True) events_number = models.PositiveIntegerField(verbose_name='Количество мероприятий', blank=True, null=True)
staff_number = models.PositiveIntegerField(verbose_name='Количество сотрудников', blank=True, null=True) staff_number = models.PositiveIntegerField(verbose_name='Количество сотрудников', blank=True, null=True)
own_place = models.BooleanField(verbose_name='Собственные площадки', default=0) place_exposition = models.ManyToManyField('place_exposition.PlaceExposition', blank=True, null=True,
place = models.ManyToManyField('place_exposition.PlaceExposition', blank=True, null=True, related_name='organiser_place_exposition')
related_name='organiser_place') place_conference = models.ManyToManyField('place_conference.PlaceConference', blank=True, null=True,
related_name='organiser_place_conference')
#translation fields #translation fields
translations = TranslatedFields( translations = TranslatedFields(
name = models.CharField(verbose_name='Название', max_length=255), name = models.CharField(verbose_name='Название', max_length=255, blank=True),
specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True), specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True),
description = models.TextField(verbose_name='Описание', blank=True), description = models.TextField(verbose_name='Описание', blank=True),
representation = models.TextField(verbose_name='Представительства', blank=True), representation = models.TextField(verbose_name='Представительства', blank=True),
address_inf = models.TextField(verbose_name='Доп инф по адресу', blank=True), address_inf = models.TextField(verbose_name='Доп инф по адресу', blank=True),
#-----meta #-----meta
title = models.CharField(max_length=255), title = models.CharField(max_length=255, blank=True),
descriptions = models.CharField(max_length=255), descriptions = models.CharField(max_length=255, blank=True),
keywords = models.CharField(max_length=255), keywords = models.CharField(max_length=255, blank=True),
) )
#fields saves information about creating and changing model #fields saves information about creating and changing model
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
@ -49,3 +56,20 @@ class Organiser(TranslatableModel):
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', self.pk) return self.lazy_translation_getter('name', self.pk)
def create_organiser(sender, **kw):
"""
create Organiser profile if "is_organiser" field in User model true
if it's false delete Organiser profile connected to User
"""
user = kw["instance"]
if user.is_organiser:
organiser = Organiser(user=user)
organiser.save()
else:
try:
Organiser.objects.get(user = user).delete()
except: pass
post_save.connect(create_organiser, sender=User)

Loading…
Cancel
Save