remotes/origin/PR-39
PekopT 9 years ago
parent 669d1d5db0
commit 73471e1b3c
  1. 2
      archilance/settings/base.py
  2. 4
      assets/css/main.css
  3. 56
      assets/index.js
  4. 9
      projects/models.py
  5. 15
      projects/templates/_trash/project_form.html
  6. 4
      specializations/admin.py
  7. 2
      specializations/serializers.py
  8. 20
      users/migrations/0019_user_is_staff.py
  9. 7
      users/models.py

@ -173,8 +173,8 @@ AUTHENTICATION_BACKENDS = (
'social.backends.vk.VKOAuth2', 'social.backends.vk.VKOAuth2',
'social.backends.odnoklassniki.OdnoklassnikiOAuth2', 'social.backends.odnoklassniki.OdnoklassnikiOAuth2',
'social.backends.mailru.MailruOAuth2', 'social.backends.mailru.MailruOAuth2',
# 'django.contrib.auth.backends.ModelBackend',
'users.backend.EmailOrUsernameModelBackend', 'users.backend.EmailOrUsernameModelBackend',
'django.contrib.auth.backends.ModelBackend',
) )
# SOCIAL_AUTH_FACEBOOK_KEY = '222531191461451' # SOCIAL_AUTH_FACEBOOK_KEY = '222531191461451'

@ -5996,10 +5996,10 @@ a.linkS2[data-target="#withdraw-money"]{
line-height: 15px; line-height: 15px;
} }
.tooltip.top{ .tooltip.top{
margin-top: 0px; margin-top: 0;
} }
.changeBlock { .changeBlock {
min-height: 450px; min-height: 500px;
display: table; display: table;
padding: 143px 20px 120px 20px; padding: 143px 20px 120px 20px;
} }

@ -1,10 +1,10 @@
// Constants ----------------------------------------------- // Constants -----------------------------------------------
var API_PAGE_SIZE = 100 var API_PAGE_SIZE = 100;
var LIVE_IMAGE_UPLOAD_URL = '/common/live-image-upload/create/' var LIVE_IMAGE_UPLOAD_URL = '/common/live-image-upload/create/';
var STUB_IMAGE_URL = '/static/img/profile.jpg' var STUB_IMAGE_URL = '/static/img/profile.jpg';
var DEFAULT_WORK_TYPE = 403;
// Plugins init -------------------------------------------- // Plugins init --------------------------------------------
@ -90,32 +90,32 @@ $('[data-tooltip]').tooltip({
var $workTypeSelect = $container.find('.-project-work-type-select-field').first() var $workTypeSelect = $container.find('.-project-work-type-select-field').first()
if (!_.isEmpty($workTypeSelect)) { if (!_.isEmpty($workTypeSelect)) {
var workTypeId = Number($workTypeSelect.find('option:selected').first().val()) || 1 var workTypeId = Number($workTypeSelect.find('option:selected').first().val()) || DEFAULT_WORK_TYPE;
$workTypeSelect.on('change', function($evt) { $workTypeSelect.on('change', function($evt) {
var $that = $(this) var $that = $(this)
var workTypeId = Number($that.val()) var workTypeId = Number($that.val())
reinitSpecializationsByWorkType(specSelects, workTypeId).then(function(rootSpec) { reinitSpecializationsByWorkType(specSelects, workTypeId).then(function(rootSpec) {
updateSpecializationWidgets(rootSpec.id, $container, $chosenSpecId, specSelects) updateSpecializationWidgets(workTypeId, $container, $chosenSpecId, specSelects)
}) })
}) })
} else { } else {
var $workTypeRadios = $container.find('.-project-work-type-radios-container').first().find('input[type=radio]') var $workTypeRadios = $container.find('.-project-work-type-radios-container').first().find('input[type=radio]')
if (!_.isEmpty($workTypeRadios)) { if (!_.isEmpty($workTypeRadios)) {
var workTypeId = Number($workTypeRadios.filter(':checked').val()) || 1 var workTypeId = Number($workTypeRadios.filter(':checked').val()) || DEFAULT_WORK_TYPE;
$workTypeRadios.on('change', function($evt) { $workTypeRadios.on('change', function($evt) {
var $that = $(this) var $that = $(this)
var workTypeId = Number($that.val()) var workTypeId = Number($that.val())
reinitSpecializationsByWorkType(specSelects, workTypeId).then(function(rootSpec) { reinitSpecializationsByWorkType(specSelects, workTypeId).then(function(rootSpec) {
updateSpecializationWidgets(rootSpec.id, $container, $chosenSpecId, specSelects) updateSpecializationWidgets(workTypeId, $container, $chosenSpecId, specSelects)
}) })
}) })
} else { } else {
var workTypeId = 1 var workTypeId = DEFAULT_WORK_TYPE;
} }
} }
@ -142,29 +142,35 @@ $('[data-tooltip]').tooltip({
function reinitSpecializationsByWorkType(specSelects, workTypeId) { function reinitSpecializationsByWorkType(specSelects, workTypeId) {
return $.get('/api/specializations/?parent__name=_root') return $.get('/api/specializations/?parent__id='+workTypeId)
.then(function(res) { .then(function(res) {
var rootSpecs = res.results var rootSpecs = res.results;
console.log('workTypeId', workTypeId)
if (workTypeId == null) { if (workTypeId == null) {
var url = '/api/specializations/' var url = '/api/specializations/';
var specId = null // var specId = null
} else { } else {
var rootSpec = ({1: rootSpecs[0], 2: rootSpecs[1], 3: rootSpecs[2]})[workTypeId] var specializations = {};
var specId = rootSpec.id $.each(rootSpecs, function(key, spec) {
specializations[spec.id] = spec;
});
// var rootSpec = specializations[workTypeId];
var rootSpec = rootSpecs[0].parent;
console.log('rootSpec', rootSpec);
// var specId = rootSpec.id
var url = format('/api/specializations/?lft__gte=%s&rght__lte=%s', rootSpec.lft, rootSpec.rght) var url = format('/api/specializations/?lft__gte=%s&rght__lte=%s', rootSpec.lft, rootSpec.rght)
} }
specSelects[0].select2(_.merge(specSelectOptions, {ajax: {url: url}})) specSelects[0].select2(_.merge(specSelectOptions, {ajax: {url: url}}));
specSelects[1].select2(_.merge(specSelectOptions, {ajax: {url: null}})) specSelects[1].select2(_.merge(specSelectOptions, {ajax: {url: null}}));
specSelects[2].select2(_.merge(specSelectOptions, {ajax: {url: null}})) specSelects[2].select2(_.merge(specSelectOptions, {ajax: {url: null}}));
specSelects[3].select2(_.merge(specSelectOptions, {ajax: {url: null}})) specSelects[3].select2(_.merge(specSelectOptions, {ajax: {url: null}}));
// TODO: Hardcoded: // TODO: Hardcoded:
specSelects[0].select2('container').closest('.-single-spec-select').css('display', workTypeId === 2 ? 'none' : 'block') // specSelects[0].select2('container').closest('.-single-spec-select').css('display', workTypeId === 2 ? 'none' : 'block');
specSelects[1].select2('container').closest('.-single-spec-select').find('.-dynamic-label').first().text(workTypeId === 2 ? 'Перечень услуг' : 'Стадия проекта') specSelects[1].select2('container').closest('.-single-spec-select').find('.-dynamic-label').first().text(workTypeId === 2 ? 'Перечень услуг' : 'Стадия проекта');
return rootSpec return rootSpec
@ -176,9 +182,9 @@ $('[data-tooltip]').tooltip({
return getSpecializationTree(specId).then(function(specs) { return getSpecializationTree(specId).then(function(specs) {
var spec = specs.spec var spec = specs.spec
specSelects[1].select2(_.merge(specSelectOptions, {ajax: {url: specs.urlLevel2}})) specSelects[1].select2(_.merge(specSelectOptions, {ajax: {url: specs.urlLevel2}}));
specSelects[2].select2(_.merge(specSelectOptions, {ajax: {url: specs.urlLevel3}})) specSelects[2].select2(_.merge(specSelectOptions, {ajax: {url: specs.urlLevel3}}));
specSelects[3].select2(_.merge(specSelectOptions, {ajax: {url: specs.urlLevel4}})) specSelects[3].select2(_.merge(specSelectOptions, {ajax: {url: specs.urlLevel4}}));
var specLevel1 = specs.specLevel1; var specLevel1 = specs.specLevel1;
var specLevel2 = specs.specLevel2; var specLevel2 = specs.specLevel2;

@ -83,11 +83,7 @@ class Realty(models.Model):
class Project(models.Model, HitCountMixin): class Project(models.Model, HitCountMixin):
WORK_TYPES = ( WORK_TYPES = tuple([(x.pk, x.name) for x in Specialization.objects.filter(level=1)])
(1, 'Проектирование'),
(2, 'Техническое сопровождение'),
# (3, 'Устранение замечаний в проекте'),
)
DEAL_TYPES = ( DEAL_TYPES = (
('secure_deal', 'Безопасная сделка'), # "Безопасная сделка (с резервированием бюджета)" ('secure_deal', 'Безопасная сделка'), # "Безопасная сделка (с резервированием бюджета)"
@ -117,6 +113,9 @@ class Project(models.Model, HitCountMixin):
text = models.TextField(blank=True) text = models.TextField(blank=True)
work_type = models.IntegerField(default=1, choices=WORK_TYPES) work_type = models.IntegerField(default=1, choices=WORK_TYPES)
def __init__(self, *args, **kwargs):
super(Project, self).__init__(*args, **kwargs)
def __str__(self): def __str__(self):
return self.name return self.name

@ -45,15 +45,12 @@
</div> </div>
<p class="type-work">{% trans 'project_stage0' %}:</p> <p class="type-work">{% trans 'project_stage0' %}:</p>
<div class="mail-block type-work-inset"> <div class="mail-block type-work-inset">
<div class="inset-mb"> {% for type in project_form.work_type.choices %}
<label><input type="radio" value="1" name="{{ project_form.type_work.name }}"><span></span></label> <div class="inset-mb">
<p>Проектирование</p> <label><input type="radio" value="{{ x.0 }}" name="{{ project_form.type_work.name }}"><span></span></label>
</div> <p>{{ x.1 }}</p>
</div>
<div class="inset-mb"> {% endfor %}
<label><input type="radio" value="2" name="{{ project_form.type_work.name }}"><span></span></label>
<p>Техническое сопровождение</p>
</div>
</div> </div>
<div class="textAreaBlock2 box-sizing disTab"> <div class="textAreaBlock2 box-sizing disTab">
<a href="javascriptt:void(0)" class="new-link new-lw">+ Добавить раздел</a> <a href="javascriptt:void(0)" class="new-link new-lw">+ Добавить раздел</a>

@ -6,7 +6,9 @@ from .models import Specialization
class SpecializationAdmin(MPTTModelAdmin): class SpecializationAdmin(MPTTModelAdmin):
readonly_fields = ('pk', 'lft', 'rght', 'tree_id', 'level') readonly_fields = ('pk', 'lft', 'rght', 'tree_id', 'level')
list_display = ('pk', 'name', 'order') list_display = ('pk', 'name', 'order', 'level', 'parent')
list_filter = ('level', )
def get_queryset(self, request): def get_queryset(self, request):
qs = super(SpecializationAdmin, self).get_queryset(request) qs = super(SpecializationAdmin, self).get_queryset(request)

@ -30,7 +30,7 @@ class SpecializationSerializer(ModelSerializer):
fields = ( fields = (
'children', 'children',
'parent', 'parent',
'projects', # 'projects',
'id', 'id',
'level', 'level',

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-10-15 00:53
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0018_auto_20160913_0215'),
]
operations = [
migrations.AddField(
model_name='user',
name='is_staff',
field=models.BooleanField(default=False),
),
]

@ -142,6 +142,7 @@ class User(AbstractBaseUser, PermissionsMixin):
first_name = models.CharField(max_length=255, blank=True) first_name = models.CharField(max_length=255, blank=True)
gender = models.CharField(max_length=30, choices=GENDERS, blank=True, null=True) gender = models.CharField(max_length=30, choices=GENDERS, blank=True, null=True)
is_active = models.BooleanField(default=True) is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
last_name = models.CharField(max_length=255, blank=True) last_name = models.CharField(max_length=255, blank=True)
last_time_visit = models.DateTimeField(default=timezone.now) last_time_visit = models.DateTimeField(default=timezone.now)
location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True) location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True)
@ -162,9 +163,9 @@ class User(AbstractBaseUser, PermissionsMixin):
elif self.location.level == 1: elif self.location.level == 1:
return self.location.name return self.location.name
@property # @property
def is_staff(self): # def is_staff(self):
return self.is_superuser # return self.is_superuser
def __str__(self): def __str__(self):
return self.email return self.email

Loading…
Cancel
Save