diff --git a/accounts/admin.py b/accounts/admin.py index a7264559..40b4f044 100644 --- a/accounts/admin.py +++ b/accounts/admin.py @@ -8,8 +8,6 @@ from forms import UserCreationForm, UserChangeForm - - class UserAdmin(UserAdmin): form = UserChangeForm @@ -23,7 +21,7 @@ class UserAdmin(UserAdmin): (None, {'fields': ('url', 'country', 'city', 'position', 'about', 'phone', 'avatar', 'web_page', 'social', 'title', 'descriptions', 'keywords', - 'is_admin', 'is_active')}), + 'is_admin', 'is_active', 'is_translator', 'is_organiser')}), ) add_fieldsets = ( diff --git a/accounts/forms.py b/accounts/forms.py index 7ff16427..3934bcf8 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -6,6 +6,8 @@ from country.models import Country from city.models import City from company.models import Company from organiser.models import Organiser +#functions +from functions.form_check import translit_with_separator class UserCreationForm(forms.ModelForm): password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(render_value=False)) @@ -35,7 +37,6 @@ class UserCreationForm(forms.ModelForm): return password2 - def save(self, commit=True): user = super(UserCreationForm, self).save(commit=False) 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) descriptions = 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: model = User exclude = ('last_login', 'password', 'is_active', 'is_admin', 'is_superuser', 'is_staff' @@ -98,4 +100,4 @@ class UserForm(forms.ModelForm): class TranslatorForm(forms.ModelForm): class Meta: model = TranslatorProfile - exclude = ('user') + exclude = ('user') \ No newline at end of file diff --git a/accounts/models.py b/accounts/models.py index 5be4fe25..07f0b386 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -1,9 +1,13 @@ # -*- coding: utf-8 -*- from django.db import models +from hvad.models import TranslatableModel, TranslatedFields from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.core.mail import send_mail from django.utils import timezone 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 hashlib import md5 @@ -49,6 +53,7 @@ class UserManager(BaseUserManager): return user + class User(AbstractBaseUser, PermissionsMixin): """ 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 = models.EmailField( verbose_name = 'Электронная почта', max_length = 255, @@ -64,11 +71,15 @@ class User(AbstractBaseUser, PermissionsMixin): ) first_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_staff = models.BooleanField(default=0) is_admin = models.BooleanField(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_registered = models.DateTimeField(blank=True, null=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') city = models.ForeignKey('city.City', verbose_name='Город', 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 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) about = models.TextField(verbose_name='О себе', 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) + def set_url(self, st): + """ + + """ + self.url = translit_with_separator(u'%s'%st) + + + def __unicode__(self): return self.email @@ -120,40 +137,10 @@ class User(AbstractBaseUser, PermissionsMixin): def has_module_perms(self, app_label): 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): """ - Extra information about tranlators + Extra information about translators """ #required field, relation with user model user = models.ForeignKey(User, related_name='translator') @@ -185,4 +172,36 @@ def create_translator_profile(sender, **kw): except: pass -post_save.connect(create_translator_profile, sender=User) \ No newline at end of file +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 +""" diff --git a/functions/form_check.py b/functions/form_check.py index 7c0e41c1..93f03cdd 100644 --- a/functions/form_check.py +++ b/functions/form_check.py @@ -19,6 +19,8 @@ def translit_with_separator(string, separator='-'): usage: translit_with_separator('введите, слово', '_') return 'vvedite_slovo' + string must be unicode + """ #make string translit diff --git a/organiser/models.py b/organiser/models.py index f0990830..ef555cdd 100644 --- a/organiser/models.py +++ b/organiser/models.py @@ -1,17 +1,23 @@ # -*- coding: utf-8 -*- from django.db import models from hvad.models import TranslatableModel, TranslatedFields +from accounts.models import User +from django.db.models.signals import post_save #custom functions from functions.custom_fields import LocationField +from functions.form_check import translit_with_separator + class Organiser(TranslatableModel): """ - Create Company model + Create Organiser model 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 country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True) city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) @@ -28,24 +34,42 @@ class Organiser(TranslatableModel): foundation = 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) - own_place = models.BooleanField(verbose_name='Собственные площадки', default=0) - place = models.ManyToManyField('place_exposition.PlaceExposition', blank=True, null=True, - related_name='organiser_place') + place_exposition = models.ManyToManyField('place_exposition.PlaceExposition', blank=True, null=True, + related_name='organiser_place_exposition') + place_conference = models.ManyToManyField('place_conference.PlaceConference', blank=True, null=True, + related_name='organiser_place_conference') #translation fields 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), description = models.TextField(verbose_name='Описание', blank=True), representation = models.TextField(verbose_name='Представительства', blank=True), address_inf = models.TextField(verbose_name='Доп инф по адресу', blank=True), #-----meta - title = models.CharField(max_length=255), - descriptions = models.CharField(max_length=255), - keywords = models.CharField(max_length=255), + title = models.CharField(max_length=255, blank=True), + descriptions = models.CharField(max_length=255, blank=True), + keywords = models.CharField(max_length=255, blank=True), ) #fields saves information about creating and changing model created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) def __unicode__(self): - return self.lazy_translation_getter('name', self.pk) \ No newline at end of file + 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)