diff --git a/api/urls.py b/api/urls.py index 6fc2a21..e0a3b38 100755 --- a/api/urls.py +++ b/api/urls.py @@ -8,6 +8,7 @@ from .views import ( LocationViewSet, MessageViewSet, NoteViewSet, + OrderViewSet, PortfolioPhotoViewSet, PortfolioViewSet, ProjectViewSet, @@ -17,7 +18,6 @@ from .views import ( StageViewSet, TeamViewSet, UserViewSet, - OrderViewSet, ) @@ -30,10 +30,10 @@ router.register(r'documents', DocumentViewSet) router.register(r'locations', LocationViewSet) router.register(r'message', MessageViewSet) router.register(r'note', NoteViewSet) +router.register(r'orders', OrderViewSet) router.register(r'portfolio-photos', PortfolioPhotoViewSet) router.register(r'portfolios', PortfolioViewSet) router.register(r'projects', ProjectViewSet) -router.register(r'orders', OrderViewSet) router.register(r'realties', RealtyViewSet) router.register(r'reviews', ReviewViewSet) router.register(r'specializations', SpecializationViewSet) diff --git a/archilance/management/commands/generate_projects.py b/archilance/management/commands/generate_projects.py index 099330c..49daa9b 100644 --- a/archilance/management/commands/generate_projects.py +++ b/archilance/management/commands/generate_projects.py @@ -78,7 +78,7 @@ class Command(BaseCommand): project=project, contractor=_.sample((None, User.contractor_objects.order_by('?').first())), secure=_.sample((True, False)), - status=_.sample((True, False)), + status=_.sample(Order.STATUSES)[0], ) return project diff --git a/archilance/util.py b/archilance/util.py index b919d9f..361b400 100644 --- a/archilance/util.py +++ b/archilance/util.py @@ -1,4 +1,5 @@ from django.core import validators +from django.core.exceptions import ObjectDoesNotExist from django.shortcuts import _get_queryset from django.utils import timezone from pprint import pprint, pformat @@ -54,6 +55,15 @@ def get_or_none(klass, *args, **kwargs): return None +def get_related_or_none(obj, attr): + try: + rel = getattr(obj, attr) + except ObjectDoesNotExist: + rel = None + + return rel + + def get_attr_or_none(klass, *args, attr=None, **kwargs): object = get_or_none(klass, *args, **kwargs) diff --git a/assets/css/main.css b/assets/css/main.css index 23624e2..a422213 100644 --- a/assets/css/main.css +++ b/assets/css/main.css @@ -5524,7 +5524,7 @@ input[type="radio"]:checked + span { width: 216px; } .proj_answ_form .textAreaBlock2 input[name="term"]{ - width: 262px; + width: 258px; } .proj_answ_form .textAreaBlock2 p span{ position: absolute; @@ -5759,7 +5759,7 @@ input[type="radio"]:checked + span { margin-bottom: 0 !important } .infoProfile .dropdown-menu{ - height: 316px; + height: auto; } .form-regestration{ padding: 20px 0 40px 0; @@ -5819,4 +5819,46 @@ input[type="radio"]:checked + span { text-transform: initial; letter-spacing: normal; } +.fr_answer{ + width: 100%; + height: 110px; + border: 1px solid #cdcdcd; + resize: none; + padding: 10px 15px; + color: #3c1a06; + font-family: 'Arial-MT-Regular', sans-serif; + font-size: 14px; + float: left; + margin: 0px 0px 0px 55px; +} +.fr_answer_sen{ + float: left; + border-radius: 40px; + font-family: 'pfdintextcomppro-regular', sans-serif; + letter-spacing: 2px; + color: #373737; + margin: 20px 0 0 55px; + font-size: 15px; + border: 1px solid #BEBEBE; + padding: 17px 46px; + text-transform: uppercase; +} +.fa-pencil:before, .fa-times:before{ + color: #fff; +} +.mainMenu li.active > a { + border-color: #ff0029; +} +.mainMenu li.icon_tm1.active span{ + background: url('../img/listMain2.png') no-repeat !important; +} +.mainMenu li.officeList.active span { + background: url('../img/list4tml.png') no-repeat center !important; +} +.mainMenu li.icon_tm2.active span{ + background: url('../img/listMain2.png') no-repeat center !important; +} +.mainMenu li.icon_tm3.active span{ + background: url('../img/listMain2.png') no-repeat right !important; +} /*end_new*/ \ No newline at end of file diff --git a/projects/models.py b/projects/models.py index a4cebcd..bec87d0 100644 --- a/projects/models.py +++ b/projects/models.py @@ -204,12 +204,13 @@ class Order(models.Model): ('process', 'В процессе'), ('completed', 'Завершен'), ) - contractor = models.ForeignKey(User, null=True, blank=True, related_name='orders') - team = models.ForeignKey(Team, null=True, blank=True, related_name='orders') + + contractor = models.ForeignKey(User, null=True, blank=True, related_name='orders') # Related name should've been "contractor_orders" created = models.DateTimeField(default=timezone.now) project = models.OneToOneField(Project, related_name='order') secure = models.BooleanField(default=False) status = models.CharField(max_length=30, choices=STATUSES, default='created') + team = models.ForeignKey(Team, null=True, blank=True, related_name='orders') def __str__(self): return self.project.name diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html index cc50e7e..e7935fc 100644 --- a/projects/templates/project_detail.html +++ b/projects/templates/project_detail.html @@ -313,8 +313,8 @@ {% csrf_token %} -
- + + diff --git a/projects/views.py b/projects/views.py index a4f827c..0db6864 100644 --- a/projects/views.py +++ b/projects/views.py @@ -59,8 +59,7 @@ class ProjectDetailWithAnswerView(BaseMixin, View): answer = _.first(_.filter(project_answers, lambda a: a.author == contractor)) if not answer: - try: team = contractor.team - except Team.DoesNotExist: team = None + team = util.get_related_or_none(contractor, 'team') if team: answer = _.first(_.filter(project_answers, lambda a: a.author == team)) @@ -68,8 +67,10 @@ class ProjectDetailWithAnswerView(BaseMixin, View): context.update({'answer': answer}) if not answer: - try: contractor.team; context.update({'can_answer_as_team': True}) - except Team.DoesNotExist: pass + team = util.get_related_or_none(contractor, 'team') + + if team: + context.update({'can_answer_as_team': True}) if request.GET.get('answer_as_team') == 'on': context.update({'answer_as_team': True}) @@ -154,8 +155,7 @@ class ProjectAnswerCreateMessageView(BaseMixin, View): if isinstance(answer.author, User) and answer.author == request.user: message.contractor_or_team = request.user elif isinstance(answer.author, Team): - try: team = request.user.team - except Team.DoesNotExist: team = None + team = util.get_related_or_none(request.user, 'team') if team and answer.author == team: message.contractor_or_team = team diff --git a/users/models.py b/users/models.py index 432e1f2..f33bb5e 100644 --- a/users/models.py +++ b/users/models.py @@ -147,11 +147,11 @@ class User(AbstractBaseUser, PermissionsMixin): if self.location: if self.location.level == 3: return self.location.parent.parent.name + ', ' + self.location.name - else: - return None - else: - return None - + elif self.location.level == 2: + return self.location.parent.name + ', ' + self.location.name + elif self.location.level == 1: + return self.location.name + @property def is_staff(self): return self.is_superuser diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 9879f71..affc691 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -42,7 +42,7 @@ -