From 00d4420bc8e1d13220f0977be941be4c1440357a Mon Sep 17 00:00:00 2001 From: Nazar Kotjuk Date: Fri, 23 Oct 2015 13:41:32 +0300 Subject: [PATCH] refactor accounts --- accounts/edit_forms.py | 32 +- accounts/forms.py | 74 +-- accounts/management/__init__.py | 1 - accounts/management/commands/__init__.py | 1 - accounts/management/commands/load_accounts.py | 82 --- accounts/models.py | 127 ++--- accounts/search_indexes.py | 21 - accounts/urls.py | 22 +- accounts/user_catalog_urls.py | 7 +- accounts/views.py | 117 +---- company/management/__init__.py | 1 - company/management/commands/__init__.py | 1 - .../commands/company_from_old_db.py | 97 ---- company/management/commands/company_test.py | 77 --- functions/views_help.py | 20 +- import_xls/excel_settings.py | 2 +- registration/backends/default/views.py | 26 +- templates/client/accounts/feed.html | 11 +- templates/client/accounts/fill_company.html | 481 ------------------ templates/client/accounts/messages.html | 2 +- templates/client/accounts/new_profile.html | 436 ---------------- templates/client/accounts/profile.html | 366 ------------- 22 files changed, 122 insertions(+), 1882 deletions(-) delete mode 100644 accounts/management/__init__.py delete mode 100644 accounts/management/commands/__init__.py delete mode 100644 accounts/management/commands/load_accounts.py delete mode 100644 accounts/search_indexes.py delete mode 100644 company/management/__init__.py delete mode 100644 company/management/commands/__init__.py delete mode 100644 company/management/commands/company_from_old_db.py delete mode 100644 company/management/commands/company_test.py delete mode 100644 templates/client/accounts/fill_company.html delete mode 100644 templates/client/accounts/new_profile.html delete mode 100644 templates/client/accounts/profile.html diff --git a/accounts/edit_forms.py b/accounts/edit_forms.py index 14f2860e..cb687a90 100644 --- a/accounts/edit_forms.py +++ b/accounts/edit_forms.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +# forms for editing user data from django import forms from django.utils.translation import ugettext as _ from models import User, Profile @@ -6,13 +7,16 @@ from country.models import Country from city.models import City from company.models import Company + class AvatarForm(forms.ModelForm): avatar = forms.ImageField(label=_(u'Выберите файл (GIF, JPG, PNG. Размер 100 × 100 пикселей)'), required=False, widget=forms.FileInput(attrs={'class': 'input'})) + class Meta: model = Profile fields = ('avatar',) + class NameForm(forms.ModelForm): first_name = forms.CharField(label=_(u'Введите ваше имя')) last_name = forms.CharField(label=_(u'Введите вашу фамилию')) @@ -22,17 +26,19 @@ class NameForm(forms.ModelForm): fields = ('first_name', 'last_name') def get_full_name(self): - return u'%s %s'%(self.instance.first_name, self.instance.last_name,) + return u'%s %s' % (self.instance.first_name, self.instance.last_name,) class HomeForm(forms.ModelForm): city = forms.CharField(label='Город', required=False, widget=forms.HiddenInput(attrs={'class': 'select2'})) - country = forms.ChoiceField(label=_(u'Страна'), choices=[(c.id, c.name) for c in Country.objects.all()], required=False, - widget=forms.Select(attrs={'class': 'select2'})) + country = forms.ChoiceField(label=_(u'Страна'), choices=[(c.id, c.name) for c in Country.objects.all()], + required=False, widget=forms.Select(attrs={'class': 'select2'})) + def __init__(self, *args, **kwargs): super(HomeForm, self).__init__(*args, **kwargs) if self.instance.city: + # city uses ajax select2 widget self.fields['city'].widget = forms.HiddenInput(attrs={'class': 'select2', 'data-init-text': self.instance.city.name}) class Meta: @@ -48,7 +54,6 @@ class HomeForm(forms.ModelForm): except City.DoesNotExist: return None - def clean_country(self): try: return Country.objects.get(id=self.cleaned_data['country']) @@ -56,19 +61,18 @@ class HomeForm(forms.ModelForm): return None - class WorkForm(forms.ModelForm): position = forms.CharField(label=_(u'Укажите вашу должность'), required=False, widget=forms.TextInput()) company = forms.CharField(label=_(u'Укажите вашу компанию'), required=False, - widget=forms.HiddenInput(attrs={'class': 'select2'})) + widget=forms.HiddenInput(attrs={'class': 'select2'})) def __init__(self, *args, **kwargs): super(WorkForm, self).__init__(*args, **kwargs) if self.instance.company: + # for ajax select2 widget self.fields['company'].widget = forms.HiddenInput(attrs={'class': 'select2', 'data-init-text': self.instance.company.name}) - class Meta: model = User fields = ('position', 'company') @@ -84,7 +88,8 @@ class WorkForm(forms.ModelForm): class AboutCompanyForm(forms.ModelForm): about_company = forms.CharField(label=_(u'Описание компании'), required=False, - widget=forms.Textarea(attrs={'cols':'30'})) + widget=forms.Textarea(attrs={'cols': '30'})) + class Meta: model = Profile fields = ('about_company',) @@ -99,11 +104,11 @@ class PhoneForm(forms.ModelForm): fields = ('phone', 'show_phone') def clean_phone(self): - phone = self.cleaned_data['phone'] - if not phone: + phone = self.cleaned_data['phone'] + if not phone: return - deduct = ('-','(',')','.',' ', '+') + deduct = ('-', '(', ')', '.', ' ', '+') for elem in deduct: phone = phone.replace(elem, '') if phone.isdigit(): @@ -112,7 +117,6 @@ class PhoneForm(forms.ModelForm): raise forms.ValidationError(_(u'Введите правильный телефон')) - class EmailForm(forms.ModelForm): email = forms.EmailField(label=_(u'Ваш e-mail'), required=False) @@ -120,6 +124,7 @@ class EmailForm(forms.ModelForm): model = User fields = ('email',) + class WebPageForm(forms.ModelForm): web_page = forms.URLField(label=_(u'Адрес вашего сайта'), required=False) @@ -127,17 +132,18 @@ class WebPageForm(forms.ModelForm): model = User fields = ('web_page',) + class SocialForm(forms.ModelForm): facebook = forms.CharField(label=_(u'Facebook'), required=False) twitter = forms.CharField(label=_(u'Twitter'), required=False) vk = forms.CharField(label=_(u'В контакте'), required=False) linkedin = forms.CharField(label=_(u'LinkedIn'), required=False) - class Meta: model = Profile fields = ('facebook', 'twitter', 'vk', 'linkedin') + class AboutForm(forms.ModelForm): about = forms.CharField(label=_(u'Немного о себе'), required=False, widget=forms.Textarea(attrs={'cols':'30'})) diff --git a/accounts/forms.py b/accounts/forms.py index 2e9bc922..8ab13b3e 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -6,16 +6,14 @@ from django.contrib.auth.forms import ReadOnlyPasswordHashField from django.forms.util import ErrorList from django.utils.translation import ugettext as _ from django.conf import settings -from models import User, Profile +from models import User +from django.db.models import Q from theme.models import Theme, Tag from country.models import Area -from django.utils import translation 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, is_latin +from functions.form_check import is_latin def clean_relation_field(inst, field_name, model): @@ -137,17 +135,6 @@ class UserForm(forms.ModelForm): profile.save() return user - #def clean_url(self): - # url = self.cleaned_data.get('url') - # if url: - # if User.objects.get(url=translit_with_separator(url)): - # raise forms.ValidationError('Такой урл уже занят') - # else: - # return url - - #def clean_organiser(self): - # return clean_relation_field(self, 'organiser', Organiser) - def clean_company(self): return clean_relation_field(self, 'company', Company) @@ -174,21 +161,6 @@ class UserForm(forms.ModelForm): else: raise forms.ValidationError('Введите правильный код страны') - """ - def clean_web_page(self): - cleaned_data = super(UserForm, self).clean() - web_page = cleaned_data.get('web_page') - if not web_page: - return web_page - - import socket - try: - socket.getaddrinfo(web_page, 80) - return web_page - except: - return forms.ValidationError('Введите правильный адрес страници') - """ - class ChangePasswordForm(forms.Form): """ @@ -319,24 +291,6 @@ class SocialRegistrationCompleteForm(RegistrationCompleteForm): return user -class RecoveryForm(forms.Form): - email = forms.EmailField(widget=forms.TextInput(attrs={'placeholder': _(u'Email')})) - - def get_user(self): - email = self.cleaned_data['email'] - return User.objects.get(email=email) - - def clean_email(self): - email = self.cleaned_data['email'] - try: - return User.objects.get(email=email) - except User.DoesNotExist: - raise forms.ValidationError(_(u'Пользователь с таким емейлом не зарегестрирован')) - - -from django.db.models import Q - - class UserFilterForm(forms.Form): model = User search_req = forms.CharField(label=_(u'Введите e-mail, имя или фамилию для запроса'), required=False) @@ -450,21 +404,21 @@ class FeedFilterForm(forms.Form): area = self.cleaned_data['area'] country = self.cleaned_data['co'] city = self.cleaned_data['ci'] - filter = self.filter + filter_obj = self.filter - filter.theme.clear() - filter.theme.add(*Theme.objects.filter(id__in=theme)) + filter_obj.theme.clear() + filter_obj.theme.add(*Theme.objects.filter(id__in=theme)) - filter.tag.clear() - filter.tag.add(*Tag.objects.filter(id__in=tag)) + filter_obj.tag.clear() + filter_obj.tag.add(*Tag.objects.filter(id__in=tag)) - filter.area.clear() - filter.area.add(*Area.objects.filter(id__in=area)) - filter.country.clear() - filter.country.add(*Country.objects.filter(id__in=country)) + filter_obj.area.clear() + filter_obj.area.add(*Area.objects.filter(id__in=area)) + filter_obj.country.clear() + filter_obj.country.add(*Country.objects.filter(id__in=country)) - filter.city.clear() - filter.city.add(*City.objects.filter(id__in=city)) + filter_obj.city.clear() + filter_obj.city.add(*City.objects.filter(id__in=city)) def clean_tg(self): diff --git a/accounts/management/__init__.py b/accounts/management/__init__.py deleted file mode 100644 index 3ed9fd0f..00000000 --- a/accounts/management/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'root' diff --git a/accounts/management/commands/__init__.py b/accounts/management/commands/__init__.py deleted file mode 100644 index 3ed9fd0f..00000000 --- a/accounts/management/commands/__init__.py +++ /dev/null @@ -1 +0,0 @@ -__author__ = 'root' diff --git a/accounts/management/commands/load_accounts.py b/accounts/management/commands/load_accounts.py deleted file mode 100644 index 6d2147fb..00000000 --- a/accounts/management/commands/load_accounts.py +++ /dev/null @@ -1,82 +0,0 @@ -import os -import MySQLdb -from MySQLdb.cursors import DictCursor -from django.core.management.base import BaseCommand -from accounts.models import User - -def create_new_user(data): - email = data['email'] - firstname = data['firstname'] - lastname = data['lastname'] - position = data['position'] - web_page = data['web_page'] - fb = data['fb'] - li = data['li'] - sk = data['sk'] - about = data['about'] - password = data['password'] - url = data['url'] - if not url: - url = str(data['id']) - - user = User(username=email, first_name=firstname, last_name=lastname, email=email, - is_staff=False, is_active=True, is_superuser=False, password=password, position=position, url=url) - - try: - user.save() - except: - return - profile = user.profile - - profile.web_page = web_page - profile.facebook = fb - profile.linkedin = li - profile.skype = sk - profile.about = about - try: - profile.save() - except: - pass - - return - - -class Command(BaseCommand): - def handle(self, *args, **options): - db = MySQLdb.connect(host="localhost", - user="expomap", - passwd="7FbLtAGjse", - db="old_db", - charset='utf8', - cursorclass=DictCursor) - cursor = db.cursor() - sql = """ - SELECT customers_id as id, customers_email_address as email, customers_password as password, customers_firstname as firstname , - customers_lastname as lastname , customers_telephone as phone, customers_job as `position`, customers_web as web_page, - customers_facebook as fb, customers_linkedin as li, customers_skype as sk, customers_about as about, - url - FROM `customers` - where customers_email_address!='' - - """ - - - - - cursor.execute(sql) - result = cursor.fetchall() - - #user.password = result[0]['customers_password'] - - for res in result: - email = res['email'] - print(email) - try: - user = User.objects.get(username=email) - except User.DoesNotExist: - user = None - create_new_user(res) - if user: - password = res['password'] - user.password = password - user.save() diff --git a/accounts/models.py b/accounts/models.py index 2c83a17b..9db37057 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -1,7 +1,5 @@ # -*- coding: utf-8 -*- -import random, string from django.db import models -from django.core.validators import email_re from django.db.models import Q from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin from django.core.mail import send_mail @@ -9,19 +7,9 @@ from django.utils import timezone from django.utils.translation import ugettext as _ from django.db.models.signals import post_save from django.db.models.loading import get_model -#custom functions from functions.form_check import translit_with_separator - -""" -from django.contrib.auth.hashers import check_password -from hashlib import md5 -from django.contrib.auth import get_user_model - -from django.db.models import get_model -""" - class UserManager(BaseUserManager): """ Creates and saves a User with the given email, first_name, last_name and password. @@ -31,10 +19,10 @@ class UserManager(BaseUserManager): if not email: raise ValueError('Вы должни ввести электронную почту') - user= self.model( - email = UserManager.normalize_email(email), - first_name = first_name,last_name = last_name, - username = UserManager.normalize_email(email), + user = self.model( + email=UserManager.normalize_email(email), + first_name=first_name,last_name = last_name, + username=UserManager.normalize_email(email), is_staff=False, is_active=False, is_superuser=False, last_login=now, date_joined=now, **extra_fields ) @@ -43,29 +31,6 @@ class UserManager(BaseUserManager): user.save(using=self._db) return user - def create_social_user(self, username, first_name, last_name, password=None, **extra_fields): - now = timezone.now() - # generate random password - digits = random.sample(('0', '1', '2', '3', '4', '5', '6', '7', '8', '9'), 4) - chars = random.sample(string.lowercase[:], 4) - password = chars + digits - random.shuffle(password) - password = ''.join(password) - - - user= self.model(first_name=first_name, last_name=last_name, username=username, - is_staff=False, is_active=True, is_superuser=False, - last_login=now, date_joined=now, **extra_fields) - - check = True if email_re.match(username) else False - if check: - user.email = UserManager.normalize_email(username) - - user.set_password(password) - user.save(using=self._db) - return user - - def create_superuser(self, username, first_name, last_name, password, **extra_fields): if not username: raise ValueError('Вы должни ввести электронную почту') @@ -73,9 +38,9 @@ class UserManager(BaseUserManager): username = UserManager.normalize_email(username) user = self.create_user( - email = username, - first_name = first_name,last_name = last_name, - password = password, **extra_fields + email=username, + first_name=first_name, last_name=last_name, + password=password, **extra_fields ) user.is_staff = True @@ -85,7 +50,6 @@ class UserManager(BaseUserManager): user.save(using=self._db) return user - def safe_get(self, **kwargs): model = self.model try: @@ -108,23 +72,21 @@ class User(AbstractBaseUser, PermissionsMixin): catalog = '/user/' email = models.EmailField( - verbose_name = u'Email', - max_length = 255, + verbose_name=u'Email', + max_length=255, #unique = True, - db_index = True, + db_index=True, ) username = models.CharField(verbose_name='Email', max_length=255, unique=True, db_index=True) first_name = models.CharField(verbose_name='First name', max_length=255) last_name = models.CharField(verbose_name='Last name', max_length=255) rating = models.IntegerField(default=100)# добавить индекс в базе - url = models.SlugField(blank=True)#, unique=True, null=True) - # - is_active = models.BooleanField(default=0) # СДЕЛАТЬ проверку на емейле + url = models.SlugField(blank=True) + is_active = models.BooleanField(default=0) is_staff = models.BooleanField(default=0) is_admin = models.BooleanField(default=0) - 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) #relations organiser = models.ForeignKey('organiser.Organiser', verbose_name='Организатор', blank=True, null=True, @@ -142,10 +104,7 @@ class User(AbstractBaseUser, PermissionsMixin): REQUIRED_FIELDS = ['first_name', 'last_name'] class Meta: - ordering=['-rating'] - - def is_organiser(self): - return bool(self.organiser) + ordering = ['-rating'] def get_full_name(self): """ @@ -154,16 +113,13 @@ 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 def get_short_name(self): - "Returns the short name for the user." + """Returns the short name for the user.""" return self.first_name def email_user(self, subject, message, from_email=None): @@ -172,7 +128,6 @@ class User(AbstractBaseUser, PermissionsMixin): """ send_mail(subject, message, from_email, [self.email]) - def has_perm(self, perm, obj=None): return True @@ -201,62 +156,37 @@ class User(AbstractBaseUser, PermissionsMixin): return n def get_permanent_url(self): - - if self.url: - return '/%s/'%self.url - #return self.catalog+self.url+'/' - return '/%d/'%self.id - #return self.catalog+str(self.id)+'/' - - def get_translator_url(self): if self.url: - return '/translators/%s/'%self.url - return '/translators/%d/'%self.id + return '/%s/' % self.url + return '/%d/' % self.id def get_expos(self): """ - return information about expos and them related data by 1 query + return information about expos and them related data by 1 query(reverse connection) """ return self.exposition_users.language().select_related('country', 'city', 'place').all() def get_confs(self): """ - return information about confs and them related data by 1 query + return information about confs and them related data by 1 query(reverse connection) """ return self.conference_users.language().select_related('country', 'city', 'place').all() - def get_seminars(self): - """ - return information about seminars and them related data by 1 query - - """ - return self.seminar_users.language().select_related('country', 'city').all() - def remove_from_calendar(self, data): expo = data['expo'] conf = data['conf'] - seminar = data['seminar'] - webinar = data['webinar'] calendar = self.calendar if expo: calendar.expositions.remove(*expo) if conf: calendar.conferences.remove(*conf) - if seminar: - calendar.seminars.remove(*seminar) - if webinar: - calendar.webinars.remove(*webinar) - - - class Profile(models.Model): """ stores additional information about users - """ user = models.OneToOneField(User) country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, @@ -264,7 +194,6 @@ class Profile(models.Model): city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True, on_delete=models.PROTECT) about_company = models.TextField(verbose_name=_(u'Описание компании'), blank=True) - phone = models.BigIntegerField(verbose_name=_(u'Телефон'), blank=True, null=True) show_phone = models.NullBooleanField(verbose_name=_(u'Показывать телефон'), blank=True, null=True, default=1) web_page = models.URLField(verbose_name='Вебсайт',blank=True) @@ -275,7 +204,6 @@ class Profile(models.Model): twitter = models.URLField(verbose_name=_(u'Twitter'), blank=True,max_length=255) linkedin = models.URLField(verbose_name=_(u'LinkedIn'), blank=True, max_length=255) vk = models.URLField(verbose_name=_(u'В контакте'), blank=True, max_length=255) - # meta title = models.CharField(max_length=255, blank=True) descriptions = models.CharField(max_length=255, blank=True) @@ -354,6 +282,9 @@ class EventFilter(models.Model): to = models.DateField(blank=True, null=True) def get_queryset(self): + """ + get filtered queryset + """ Exposition = get_model('exposition', 'Exposition') qs = Exposition.enable.upcoming() themes = self.theme.all() @@ -380,9 +311,11 @@ class EventFilter(models.Model): return qs.order_by('data_begin') - - def calculate_rating(user): + """ + calculates user rating depending og user filled information + calls in post save signal of profile model + """ user_rating_fields = {'position': 5, 'company': 5, 'url': 10} profile_rating_fields = {'country': 5, 'city': 5, 'phone': 10, 'facebook': 5, 'twitter': 5, 'linkedin': 5, 'vk': 5, 'web_page': 10, 'avatar': 20, 'about': 15} @@ -396,7 +329,6 @@ def calculate_rating(user): if getattr(user, key): rating += value - for key, value in profile_rating_fields.iteritems(): if getattr(user.profile, key): rating += value @@ -409,6 +341,9 @@ def calculate_rating(user): def create_user_inf(sender, instance, created, **kwargs): + """ + create default models that is required for users + """ if created: Calendar.objects.create(user=instance) Profile.objects.create(user=instance) @@ -416,10 +351,10 @@ def create_user_inf(sender, instance, created, **kwargs): calculate_rating(instance) + def post_profile(sender, instance, created, **kwargs): user = instance.user calculate_rating(user) post_save.connect(create_user_inf, sender=User) -post_save.connect(post_profile, sender=Profile) - +post_save.connect(post_profile, sender=Profile) \ No newline at end of file diff --git a/accounts/search_indexes.py b/accounts/search_indexes.py deleted file mode 100644 index 0b9b391d..00000000 --- a/accounts/search_indexes.py +++ /dev/null @@ -1,21 +0,0 @@ -from haystack import indexes -from models import User - -""" -class UserIndex(indexes.SearchIndex, indexes.Indexable): - text = indexes.CharField(document=True, use_template=True) -# first_name = indexes.CharField(model_attr='first_name') -# last_name = indexes.CharField(model_attr='last_name') - email = indexes.NgramField(model_attr='email') - #email = indexes.CharField(model_attr='email') - - - - def get_model(self): - return User - - - def index_queryset(self, using=None): - - return self.get_model().objects.filter(is_active=True) -""" \ No newline at end of file diff --git a/accounts/urls.py b/accounts/urls.py index 2345511f..ff555df6 100644 --- a/accounts/urls.py +++ b/accounts/urls.py @@ -1,18 +1,12 @@ # -*- coding: utf-8 -*- from django.conf.urls import patterns, url from django.contrib.auth.decorators import login_required -from views import SettingsView, ProfileView, CalendarView, UserView, UserExpositionsView, UserConferenceView, UserSeminarView +from views import SettingsView, CalendarView from views import NameView, HomeView, AvatarView, WorkView, AboutCompanyView, PhoneView, WebPageView,\ SocialView, AboutView, ProfileCompanyView, Feed -# -from django.http import HttpResponse -def test(request): - return HttpResponse('123') - urlpatterns = patterns('', - url(r'^profile/$', login_required(ProfileView.as_view())), url(r'^profile/company/$', login_required(ProfileCompanyView.as_view())), url(r'^profile/settings/$', login_required(SettingsView.as_view())), url(r'^profile/calendar/remove/$', 'accounts.views.remove_from_calendar'), @@ -20,20 +14,8 @@ urlpatterns = patterns('', url(r'^profile/calendar/$', login_required(CalendarView.as_view())), url(r'^profile/feed/page/(?P\d+)/$', Feed.as_view()), url(r'^profile/feed/$', login_required(Feed.as_view())), - url(r'^user/(?P.*)/expositions/(?P\d+)/$', UserExpositionsView.as_view()), - url(r'^user/(?P.*)/expositions/$', UserExpositionsView.as_view()), - url(r'^user/(?P.*)/seminars/(?P\d+)/$', UserSeminarView.as_view()), - url(r'^user/(?P.*)/seminars/$', UserSeminarView.as_view()), - url(r'^user/(?P.*)/conferences/(?P\d+)/$', UserConferenceView.as_view()), - url(r'^user/(?P.*)/conferences/$', UserConferenceView.as_view()), - url(r'^user/(?P.*)/events/(?P\d+)/$', UserView.as_view()), - url(r'^user/(?P.*)/events/$', UserView.as_view()), - url(r'^user/(?P.*)/$', UserView.as_view()), url(r'^inactive-user/$', 'registration.backends.default.views.inactive_user_message'), - #url(r'^profile/messages/(?P.*)/$', login_required(MessagesView.as_view())), - #url(r'^profile/messages/$', login_required(MessagesView.as_view())), - # ajax url(r'^profile/update/name/$', login_required(NameView.as_view())), url(r'^profile/update/home/$', login_required(HomeView.as_view())), @@ -46,4 +28,4 @@ urlpatterns = patterns('', url(r'^profile/update/about/$', login_required(AboutView.as_view())), url(r'^profile/change-password/', 'accounts.views.change_password'), -) +) \ No newline at end of file diff --git a/accounts/user_catalog_urls.py b/accounts/user_catalog_urls.py index 60fdaf9d..1f8c302f 100644 --- a/accounts/user_catalog_urls.py +++ b/accounts/user_catalog_urls.py @@ -1,16 +1,11 @@ from django.conf.urls import patterns, url -from django.contrib.auth.decorators import login_required -from views import SettingsView, ProfileView, CalendarView, UserView, UserExpositionsView, UserConferenceView, UserSeminarView +from views import UserView, UserExpositionsView, UserConferenceView urlpatterns = patterns('', url(r'^(?P.*)/expositions/(?P\d+)/$', UserExpositionsView.as_view(), {'meta_id': 72}), url(r'^(?P.*)/expositions/$', UserExpositionsView.as_view(), {'meta_id': 72}), - url(r'^(?P.*)/seminars/(?P\d+)/$', UserSeminarView.as_view()), - url(r'^(?P.*)/seminars/$', UserSeminarView.as_view()), url(r'^(?P.*)/conferences/(?P\d+)/$', UserConferenceView.as_view(), {'meta_id': 73}), url(r'^(?P.*)/conferences/$', UserConferenceView.as_view(), {'meta_id': 73}), - url(r'^(?P.*)/events/(?P\d+)/$', UserView.as_view()), - url(r'^(?P.*)/events/$', UserView.as_view()), url(r'^(?P.*)/$', UserView.as_view(), {'meta_id': 71}), ) diff --git a/accounts/views.py b/accounts/views.py index c6cc53b5..cb486a5a 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -1,22 +1,29 @@ # -*- coding: utf-8 -*- import dateutil.relativedelta as rdelta -import json, datetime +import json +import datetime import calendar as python_calendar from django.shortcuts import get_object_or_404 from django.http import HttpResponseRedirect, HttpResponse, Http404 from django.contrib.auth.decorators import login_required from django.utils.translation import ugettext as _, get_language -from django.utils import timezone from django_messages.forms import SendForm from django.views.generic import TemplateView, FormView +from django.conf import settings from functions.custom_views import ListView +from functions.views_help import dates_range, get_user from sorl.thumbnail import get_thumbnail +from exposition.models import Exposition from .forms import ChangePasswordForm, EmailAnnouncementForm, FeedFilterForm from company.forms import CreateCompanyForm from .models import User from .edit_forms import AvatarForm, NameForm, HomeForm, WorkForm, AboutCompanyForm, PhoneForm, EmailForm,\ WebPageForm, SocialForm, AboutForm - +from company.edit_forms import NameForm as CompNameForm, HomeForm as CompHomeForm, PhoneForm as CompPhoneForm,\ + EmailForm as CompEmailForm, WebPageForm as CompWebPageForm, SocialForm as CompSocialForm,\ + TagForm as CompTagForm, DescriptionForm as CompDescr, StaffForm as CompStaff, \ + FoundationForm as CompFound, SpecializationForm as CompSpec, AddressForm as CompAddress +from meta.views import MetadataMixin class SettingsView(TemplateView): @@ -25,19 +32,14 @@ class SettingsView(TemplateView): password, email notifications, social settings, subscription """ - template_name = 'accounts/settings.html' + template_name = 'client/accounts/settings.html' + def get_context_data(self, **kwargs): context = super(SettingsView, self).get_context_data(**kwargs) context['change_password_form'] = ChangePasswordForm() context['email_announcement_form'] = EmailAnnouncementForm() return context -def dates_range(date1, date2): - delta = date2 - date1 - dates = [] - for i in range(delta.days + 1): - dates.append(date1 + datetime.timedelta(days=i)) - return dates class CalendarView(TemplateView): """ @@ -54,7 +56,6 @@ class CalendarView(TemplateView): - events - events in current months - days - days in current month - current_day - """ context = super(CalendarView, self).get_context_data(**kwargs) now = datetime.datetime.now().replace(microsecond=0, second=0, minute=0, hour=0) @@ -72,32 +73,27 @@ class CalendarView(TemplateView): number_of_days = python_calendar.monthrange(now.year, now.month)[1] # number of days in current month days = [datetime.datetime(now.year, now.month, i+1) for i in range(number_of_days)] - #context['days'] = days calendar = self.request.user.calendar # events in current month context['events'] = calendar.events_by_month(now) else: - number_of_days = python_calendar.monthrange(year, month)[1] + # days in current month days = [datetime.datetime(year, month, i+1) for i in range(number_of_days)] - # number of days in current month - #context['days'] = days + calendar = self.request.user.calendar now = now.replace(year=year, month=month, day=1) # events in current month context['events'] = calendar.events_by_month(now) - - # add days from previous mondey to next sunday - + # add days from previous monday to next sunday first_day = days[0] if first_day.weekday() != 0: past_monday = first_day + rdelta.relativedelta(days=-1, weekday=rdelta.MO(-1)) a = [past_monday + datetime.timedelta(days=x) for x in range((first_day - past_monday).days)] days = a + days - last_day = days[-1] if last_day != 6: @@ -106,9 +102,6 @@ class CalendarView(TemplateView): days += b events = context['events'] context['days'] = days - #days = context['days'] - event_in_day = False - counter = 0 dates_with_events = [] for event in events: dates_with_events += dates_range(event.data_begin, event.data_end) @@ -138,39 +131,6 @@ class CalendarView(TemplateView): return context - -class ProfileView(TemplateView): - """ - display template with user information forms - - in template forms handles dynamically by ajax - """ - template_name = 'accounts/new_profile.html' - - def get_context_data(self, **kwargs): - context = super(ProfileView, self).get_context_data(**kwargs) - user = self.request.user - profile = user.profile - - profile_forms = { - 'avatar_form': AvatarForm(instance=profile), 'name_form': NameForm(instance=user), - 'home_form': HomeForm(instance=profile), 'work_form': WorkForm(instance=user), - 'about_company_form': AboutCompanyForm(instance=profile), 'phone_form': PhoneForm(instance=profile), - 'email_form': EmailForm(instance=user), 'web_page_form': WebPageForm(instance=profile), - 'social_form': SocialForm(instance=profile), 'about_form': AboutForm(instance=profile) - } - if not user.company: - company_form = {'company_form': CreateCompanyForm()} - context.update(company_form) - - context.update(profile_forms) - return context - -from company.edit_forms import NameForm as CompNameForm, HomeForm as CompHomeForm, PhoneForm as CompPhoneForm,\ - EmailForm as CompEmailForm, WebPageForm as CompWebPageForm, SocialForm as CompSocialForm,\ - TagForm as CompTagForm, DescriptionForm as CompDescr, StaffForm as CompStaff, \ - FoundationForm as CompFound, SpecializationForm as CompSpec, AddressForm as CompAddress - class ProfileCompanyView(TemplateView): """ display template with user company information forms @@ -205,10 +165,6 @@ class ProfileCompanyView(TemplateView): return context - - - -from meta.views import MetadataMixin class UserView(MetadataMixin, TemplateView): """ display user information for another users @@ -243,8 +199,6 @@ class UserView(MetadataMixin, TemplateView): context.update(profile_forms) - - context['message_form'] = SendForm() context['member'] = user return context @@ -272,6 +226,7 @@ class BaseProfileView(ProfileInvalidView): response = {'success': True, 'rating': profile.user.rating} return HttpResponse(json.dumps(response), content_type='application/json') + class WorkView(ProfileInvalidView): """ instance user @@ -282,13 +237,11 @@ class WorkView(ProfileInvalidView): user = self.request.user form = self.form_class(self.request.POST, instance=user) user = form.save() - #company = user.company - - #response = {'success': True, 'url':company.get_permanent_url()} response = {'success': True, 'rating': user.rating} return HttpResponse(json.dumps(response), content_type='application/json') + class AvatarView(BaseProfileView): """ instance profile. save user avatar. @@ -350,6 +303,7 @@ class AboutView(BaseProfileView): """ form_class = AboutForm + class NameView(ProfileInvalidView): """ instance user @@ -364,25 +318,14 @@ class NameView(ProfileInvalidView): return HttpResponse(json.dumps(response), content_type='application/json') -from exposition.models import Exposition - - -def get_user(url): - try: - url = int(url) - user = get_object_or_404(User, id=url) - except ValueError: - user = get_object_or_404(User, url=url) - return user class UserEventView(ListView): model = Exposition - template_name = 'accounts/user_events.html' + template_name = 'client/accounts/user_events.html' paginate_by = 10 obj = None event_type = None - def get_queryset(self): url = self.kwargs.get('url') user = get_user(url) @@ -395,6 +338,7 @@ class UserEventView(ListView): context['event_type'] = self.event_type return context + class UserExpositionsView(MetadataMixin, UserEventView): """ return template with list of expos that user joined @@ -422,17 +366,6 @@ class UserConferenceView(MetadataMixin, UserEventView): self.kwargs['user_full_name'] = user.get_full_name() return user.get_confs() -class UserSeminarView(UserEventView): - """ - return template with list of seminars that user joined - """ - event_type = _(u'Семинары') - - def get_queryset(self): - url = self.kwargs.get('url') - user = get_user(url) - self.obj = user - return user.get_seminars() @login_required def change_password(request): @@ -462,10 +395,10 @@ def change_password(request): else: return HttpResponse(json.dumps(success), content_type='application/json') -from django.views.generic.edit import FormMixin + class Feed(ListView): template_name = 'client/accounts/feed.html' - paginate_by = 10 + paginate_by = settings.CLIENT_PAGINATION model = Exposition filter_form = FeedFilterForm success_url = '/profile/feed/' @@ -477,11 +410,9 @@ class Feed(ListView): form.filter_save() return HttpResponseRedirect(self.success_url) - def get_queryset(self): - filter = self.request.user.eventfilter - qs = filter.get_queryset() - + filter_obj = self.request.user.eventfilter + qs = filter_obj.get_queryset() return qs def get_context_data(self, **kwargs): diff --git a/company/management/__init__.py b/company/management/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/company/management/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/company/management/commands/__init__.py b/company/management/commands/__init__.py deleted file mode 100644 index 8b137891..00000000 --- a/company/management/commands/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/company/management/commands/company_from_old_db.py b/company/management/commands/company_from_old_db.py deleted file mode 100644 index 15d6e68a..00000000 --- a/company/management/commands/company_from_old_db.py +++ /dev/null @@ -1,97 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -from company.models import Company -from theme.models import Theme, Tag -from accounts.models import User -from functions.form_check import translit_with_separator -import datetime - -import MySQLdb -from MySQLdb.cursors import DictCursor - -def convert_to_int(st): - if not st: - return None - deduct = ('-','(',')','.',' ') - for elem in deduct: - st = st.replace(elem, '') - if st.isdigit(): - return int(st) - else: - return None - -class Command(BaseCommand): - def handle(self, *args, **options): - db = MySQLdb.connect(host="localhost", - user="root", - passwd="qazedc", - db="expomap_ru", - charset='utf8', - cursorclass=DictCursor) - - cursor = db.cursor() - sql = "select * from customers_company" - cursor.execute(sql) - - res = cursor.fetchall() - - - for c in res: - - phone = convert_to_int(c.get('phone')) - fax = convert_to_int(c.get('fax')) - url = c['url'] - if not url: - url = translit_with_separator(c.get('title')) - - - company = Company(id=c['company_id'], url=url, phone=phone, fax=fax, - email=c.get('email'), web_page=c.get('website'), twitter=c.get('twitter', '')) - - company.translate('ru') - company.name = c.get('title') - company.specialization = c.get('specialize') - company.description = c.get('about') - company.address_inf = c.get('adress') - user = User.objects.safe_get(id=user_id) - company.creator = user - print('not_saved: %s'%c['title']) - company.save() - user_id = c['customers_id'] - print('saved: %s'%str(company)) - - if user: - user.company = company - if not user.last_login: - now = datetime.datetime.now() - user.last_login = now - - user.save() - - theme = None - theme_id = c.get('otrasly') - if theme_id: - try: - theme = Theme.objects.get(id=theme_id) - except Theme.DoesNotExist: - continue - company.theme.add(theme) - - if not theme: - continue - - tags = c.get('tags') - if tags: - tags = tags.split(',') - if tags: - for tag_id in tags: - try: - tag = Tag.objects.get(id=tag_id) - except Tag.DoesNotExist: - continue - if tag.theme == theme: - company.tag.add(tag) - else: - continue - - #print(str(type(res[0]['phone']))) - print('success') \ No newline at end of file diff --git a/company/management/commands/company_test.py b/company/management/commands/company_test.py deleted file mode 100644 index a8060e93..00000000 --- a/company/management/commands/company_test.py +++ /dev/null @@ -1,77 +0,0 @@ -from django.core.management.base import BaseCommand, CommandError -from company.models import Company -from theme.models import Theme, Tag -from accounts.models import User -from functions.form_check import translit_with_separator -import datetime - -import MySQLdb -from MySQLdb.cursors import DictCursor - -def convert_to_int(st): - if not st: - return None - deduct = ('-','(',')','.',' ') - for elem in deduct: - st = st.replace(elem, '') - if st.isdigit(): - return int(st) - else: - return None - -class Command(BaseCommand): - def handle(self, *args, **options): - db = MySQLdb.connect(host="localhost", - user="root", - passwd="qazedc", - db="expomap_ru", - charset='utf8', - cursorclass=DictCursor) - - cursor = db.cursor() - sql = "select * from customers_company WHere otrasly>0" - cursor.execute(sql) - - res = cursor.fetchall() - print(len(res)) - - for c in res: - id = c['company_id'] - company = Company.objects.safe_get(id=id) - if not company: - continue - - theme_id = c.get('otrasly') - tags = c.get('tags') - - - if theme_id: - try: - theme = Theme.objects.get(id=theme_id) - except Theme.DoesNotExist: - continue - print(theme) - print(company) - company.theme.add(theme) - print('add %s theme to %s company'%(str(theme), str(company))) - print('123') - if not theme: - continue - - - tags = c.get('tags') - if tags: - tags = tags.split(',') - if tags: - for tag_id in tags: - try: - tag = Tag.objects.get(id=tag_id) - except Tag.DoesNotExist: - continue - if tag.theme == theme: - company.tag.add(tag) - print('add %s tag to %s company'%(str(tag), str(company))) - else: - continue - - diff --git a/functions/views_help.py b/functions/views_help.py index 3d764778..35e36cad 100644 --- a/functions/views_help.py +++ b/functions/views_help.py @@ -1,5 +1,8 @@ # -*- coding: utf-8 -*- import re +import datetime +from django.shortcuts import get_object_or_404 +from accounts.models import User def get_referer(request, default=None): referer = request.META.get('HTTP_REFERER') @@ -20,4 +23,19 @@ def split_params(st): if n != -1: params.append({'type': item[:n], 'url':item[n+1:]}) - return params \ No newline at end of file + return params + +def dates_range(date1, date2): + delta = date2 - date1 + dates = [] + for i in range(delta.days + 1): + dates.append(date1 + datetime.timedelta(days=i)) + return dates + +def get_user(url): + try: + url = int(url) + user = get_object_or_404(User, id=url) + except ValueError: + user = get_object_or_404(User, url=url) + return user \ No newline at end of file diff --git a/import_xls/excel_settings.py b/import_xls/excel_settings.py index 2754dd45..770e1561 100644 --- a/import_xls/excel_settings.py +++ b/import_xls/excel_settings.py @@ -426,7 +426,7 @@ place_exp_sett = { u'Выставочный зал': {u'field': u'exposition_hall', u'func': bool}, u'Площадь выст. зала': {u'field': u'exp_hall_area', u'func': to_int}, u'Общая вместимость': {u'field': u'total_capacity', u'func': to_int}, - u'Количество залов': {u'field': u'amount_halls', u'func': bool}, + u'Количество залов': {u'field': u'amount_halls', u'func': bool}, } # export place_settings=[ diff --git a/registration/backends/default/views.py b/registration/backends/default/views.py index 667ea2a3..bf4d2e1f 100644 --- a/registration/backends/default/views.py +++ b/registration/backends/default/views.py @@ -8,7 +8,8 @@ from registration import signals from registration.models import RegistrationProfile from registration.views import ActivationView as BaseActivationView from registration.views import RegistrationView as BaseRegistrationView -from django.views.generic import View +from accounts.forms import RegistrationCompleteForm, SocialRegistrationCompleteForm +from social.apps.django_app.default.models import UserSocialAuth import json @@ -248,8 +249,7 @@ def LoginView(request): else: HttpResponseRedirect('/') -from accounts.forms import RegistrationCompleteForm, RecoveryForm, SocialRegistrationCompleteForm -from social.apps.django_app.default.models import UserSocialAuth + def complete_registration(request): @@ -290,22 +290,4 @@ def acquire_email(request, template_name="registration/acquire_email.html"): def inactive_user_message(request): - return render(request, 'registration/social_registration_complete.html') - - - -def pswd_recovery(request): - #if request.is_ajax(): - response = {'success': False} - form = RecoveryForm(request.POST) - if form.is_valid(): - user = form.get_user() - user.se - response['success']=True - else: - response['errors'] = form.errors - return HttpResponse(json.dumps(response), content_type='application/json') - - #else: - # return HttpResponse('not ajax') - + return render(request, 'registration/social_registration_complete.html') \ No newline at end of file diff --git a/templates/client/accounts/feed.html b/templates/client/accounts/feed.html index 7b22e691..d3b7bd06 100644 --- a/templates/client/accounts/feed.html +++ b/templates/client/accounts/feed.html @@ -1,6 +1,7 @@ {% extends 'base_catalog.html' %} {% load i18n %} {% load static %} + {% block bread_scrumbs %}