diff --git a/archilance/management/commands/generate_portfolios.py b/archilance/management/commands/generate_portfolios.py index c50b957..0cf8efa 100644 --- a/archilance/management/commands/generate_portfolios.py +++ b/archilance/management/commands/generate_portfolios.py @@ -38,7 +38,7 @@ class Command(BaseCommand): def create_portfolio(i): portf = Portfolio( name='Portforlio %s' % i, - description="Portforlio %s's description" % i, + description=util.lorem(_.random(5, 30)), budget=util.random_amount(), currency=_.sample(CURRENCIES)[0], term=_.random(0, 20), diff --git a/archilance/management/commands/generate_projects.py b/archilance/management/commands/generate_projects.py index 7ff5779..4ef30fe 100644 --- a/archilance/management/commands/generate_projects.py +++ b/archilance/management/commands/generate_projects.py @@ -63,7 +63,7 @@ class Command(BaseCommand): deal_type=_.sample(Project.DEAL_TYPES)[0], term=_.random(0, 20), term_type=_.sample(TERMS)[0], - text='Project %s text' % i, + text=util.lorem(_.random(5, 30)), work_type=_.sample(Project.WORK_TYPES)[0], state='active', ) diff --git a/archilance/management/commands/generate_reviews.py b/archilance/management/commands/generate_reviews.py index 649a162..d902b73 100644 --- a/archilance/management/commands/generate_reviews.py +++ b/archilance/management/commands/generate_reviews.py @@ -23,7 +23,7 @@ class Command(BaseCommand): review.project = Project.objects.order_by('?').first() review.stars = _.random(1, 5) - review.text = 'This is a review %s text' % i + review.text = util.lorem(_.random(5, 15)) review.is_secured = _.sample((True, False)) review.save() diff --git a/archilance/management/commands/generate_users.py b/archilance/management/commands/generate_users.py index e46aac1..72c81cb 100644 --- a/archilance/management/commands/generate_users.py +++ b/archilance/management/commands/generate_users.py @@ -79,7 +79,8 @@ class Command(BaseCommand): username = 'user-%s' % i return User.objects.create( - first_name='User-%s' % i, + first_name='Василий', + last_name='Пупкин', username=username, email='%s@example.com' % username, is_active=True, diff --git a/archilance/settings/base.py b/archilance/settings/base.py index 8b68b49..93ab74a 100644 --- a/archilance/settings/base.py +++ b/archilance/settings/base.py @@ -240,7 +240,7 @@ REST_FRAMEWORK = { 'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly', ], - 'PAGE_SIZE': 10, + 'PAGE_SIZE': 100, 'DEFAULT_FILTER_BACKENDS': ('rest_framework_filters.backends.DjangoFilterBackend',), # djangorestframework-filters } diff --git a/archilance/util.py b/archilance/util.py index c96141b..c2edc56 100644 --- a/archilance/util.py +++ b/archilance/util.py @@ -1,3 +1,4 @@ +from django.shortcuts import _get_queryset from django.utils import timezone from pprint import pprint, pformat import pydash as _; _.map = _.map_; _.filter = _.filter_ @@ -41,6 +42,22 @@ def random_amount(): return random.random() * random.choice((100, 1000, 10000)) +def get_or_none(klass, *args, **kwargs): + queryset = _get_queryset(klass) + + try: + return queryset.get(*args, **kwargs) + except queryset.model.DoesNotExist: + return None + + +def get_attr_or_none(klass, *args, attr=None, **kwargs): + object = get_or_none(klass, *args, **kwargs) + + if object and attr and isinstance(attr, str): + return getattr(object, attr, None) + + def model_fields(model, width=200): pprint([( f.name, diff --git a/common/utils.py b/common/utils.py deleted file mode 100644 index 4a75d6a..0000000 --- a/common/utils.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.shortcuts import _get_queryset - -def get_or_none(klass, *args, **kwargs): - queryset = _get_queryset(klass) - - try: - return queryset.get(*args, **kwargs) - except queryset.model.DoesNotExist: - return None diff --git a/projects/templates/customer_project_detail.html b/projects/templates/customer_project_detail.html index 3906342..481dce8 100644 --- a/projects/templates/customer_project_detail.html +++ b/projects/templates/customer_project_detail.html @@ -201,6 +201,7 @@ {% endfor %} +
- {{ proj }} -
-{{ proj.text }}
- - {% if TEMPLATE_DEBUG %} -{{ proj|inspect }}
Specialization: {{ proj.specialization }}
Realty location: {{ proj.realty.location }}
Constr. type: {{ proj.realty.construction_type }}
Build. classif.: {{ proj.realty.building_classification }}
+
+
+
+
+
+ + {{ proj }} +
+{{ proj.text }}
+ + {% if TEMPLATE_DEBUG %} +{{ proj|inspect }}
Specialization: {{ proj.specialization }}
Realty location: {{ proj.realty.location }}
Constr. type: {{ proj.realty.construction_type }}
Build. classif.: {{ proj.realty.building_classification }}
+ {% endif %}
+
+ + {{ proj.budget }} +
+- {{ proj.budget }} -
-
- - {{ team.name }} + + + + + {% for obj in coll %} + {% if obj|class_name == 'Team' %} + {% with team=obj %} +
+ Специализации:
- -- Специализации: -
-Есть допуск СРО
-Есть допуск СРО
######## Team owner ##########} -{#
Specializations: {{ team.owner.contractor_specializations.all }}
Location: {{ team.owner.location }}
Build. classif-s: {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}
Constr. types: {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}
CRO: {{ team.owner.cro }}
Work types: {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}
######## Team users #########
Specializations: {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}
Location: {% for u in team.users.all %}{{ u.location }}, {% endfor %}
Build. classif-s: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}
Constr. types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}
CRO: {% for u in team.users.all %}{{ u.cro }}, {% endfor %}
Work types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}
######## Team owner #########
Specializations: {{ team.owner.contractor_specializations.all }}
Location: {{ team.owner.location }}
Build. classif-s: {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}
Constr. types: {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}
CRO: {{ team.owner.cro }}
Work types: {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}
######## Team users #########
Specializations: {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}
Location: {% for u in team.users.all %}{{ u.location }}, {% endfor %}
Build. classif-s: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}
Constr. types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}
CRO: {% for u in team.users.all %}{{ u.cro }}, {% endfor %}
Work types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}
+ Специализации:
- -- Специализации: -
-Есть допуск СРО
-Есть допуск СРО
Specializations: {{ contractor.contractor_specializations.all }}
Location: {{ contractor.location }}
Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}
Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}
CRO: {{ contractor.cro }}
Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
#}
-{# Specializations: {{ contractor.contractor_specializations.all }}
Location: {{ contractor.location }}
Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}
Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}
CRO: {{ contractor.cro }}
Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
{{ review.text }}{% if TEMPLATE_DEBUG %}. {% lorem %}{% endif %}
+{{ review.text }}
- {{ object.get_full_name }} [ivanov_petr] + {{ customer.get_full_name }} [{{ customer.username }}]
-{{ object.location.name }}
- +{{ customer.location.name }}
+Произошла ошибка (form)
' + '{form}'
+ ).format(form=pformat(form.errors)))
+
+ paginator = Paginator(projects, settings.PAGE_SIZE)
+ page = request.GET.get('page')
+
+ try:
+ projects = paginator.page(page)
+ except PageNotAnInteger:
+ projects = paginator.page(1)
+ except EmptyPage:
+ projects = paginator.page(paginator.num_pages)
+
+ context.update({
+ 'form': form,
+
+ 'projects': projects,
+ 'customer': customer,
+
+ 'open_project_count': projects.paginator.count,
+ 'trashed_project_count': customer.projects.filter(state='trashed').count(),
+
+ 'is_paginated': True,
+ 'page_obj': projects,
+ })
+
+ return render(request, self.template_name, context)
-class CustomerProfileTrashedProjectsView(BaseMixin, DetailView):
- model = User
+class CustomerProfileTrashedProjectsView(BaseMixin, View):
template_name = 'customer_profile_trashed_projects.html'
- context_object_name = 'customer'
+ form_class = CustomerProfileProjectRealtyForm
- def get_context_data(self, **kwargs):
- c = super().get_context_data(**kwargs)
- c['projects'] = self.object.projects.filter(state='trashed')
- return c
+ def get(self, request, *args, **kwargs):
+ context = self.get_context_data(**_.merge({}, request.GET, kwargs))
+ customer = get_object_or_404(User.customer_objects, pk=kwargs.get('pk'))
+ form = self.form_class(request.GET, request=request, customer=customer)
+ projects = customer.projects.filter(state='trashed')
+
+ if form.is_valid():
+ realty = form.cleaned_data.get('realty')
+
+ if realty:
+ projects = projects.filter(realty=realty)
+ else:
+ if form.errors:
+ messages.info(request, (
+ 'Произошла ошибка (form)
' + '{form}'
+ ).format(form=pformat(form.errors)))
+
+ paginator = Paginator(projects, settings.PAGE_SIZE)
+ page = request.GET.get('page')
+
+ try:
+ projects = paginator.page(page)
+ except PageNotAnInteger:
+ projects = paginator.page(1)
+ except EmptyPage:
+ projects = paginator.page(paginator.num_pages)
+
+ context.update({
+ 'form': form,
+
+ 'projects': projects,
+ 'customer': customer,
+
+ 'open_project_count': customer.projects.filter(state='active').count(),
+ 'trashed_project_count': projects.paginator.count,
+
+ 'is_paginated': True,
+ 'page_obj': projects,
+ })
+
+ return render(request, self.template_name, context)
class CustomerProfileCurrentProjectsView(BaseMixin, DetailView):
@@ -319,7 +400,7 @@ class ContractorProfileEditView(CheckForUserMixin, View):
def get(self, request, *args, **kwargs):
instance = get_object_or_404(User, pk=request.user.pk)
form = self.form_class(instance=instance)
- root = get_or_none(Specialization, name='_root')
+ root = util.get_or_none(Specialization, name='_root')
nodes = root.get_descendants('lft')
return render(request, self.template_name, {'form': form, 'nodes': nodes})
diff --git a/work_sell/templates/worksells_list.html b/work_sell/templates/worksells_list.html
index 5a4ed00..bbb975b 100644
--- a/work_sell/templates/worksells_list.html
+++ b/work_sell/templates/worksells_list.html
@@ -1,8 +1,10 @@
{% extends 'partials/base.html' %}
+
{% load staticfiles %}
{% load thumbnail %}
{% block content %}
+
{% include 'partials/header.html' %}
{{ work }}
+{{ work }}
- - {% endfor %} -