remotes/origin/setup
ArturBaybulatov 10 years ago
commit f3a5cfce68
  1. 10
      archilance/settings/base.py
  2. 20
      chat/migrations/0005_message_is_new.py
  3. 1
      chat/models.py
  4. 8
      chat/templates/chat_contractor.html
  5. 5
      chat/templates/chat_customer.html
  6. 2
      chat/views.py
  7. 20
      projects/migrations/0002_candidate_position.py
  8. 20
      projects/migrations/0003_auto_20160812_1512.py
  9. 1
      projects/models.py
  10. 2
      projects/urls.py
  11. 76
      templates/partials/base.html
  12. 10
      templates/registration/registration_form.html
  13. 25
      users/migrations/0008_auto_20160812_1151.py
  14. 23
      users/pipeline.py
  15. 3
      users/templates/contractor_office.html
  16. 44
      users/templates/contractor_profile.html
  17. 2
      users/templates/register_social_mail.html
  18. 2
      users/templates/register_social_mail.txt
  19. 2
      users/templates/worksell_create_form.html
  20. 23
      work_sell/forms.py
  21. 21
      work_sell/migrations/0003_auto_20160812_1151.py
  22. 4
      work_sell/urls.py

@ -123,10 +123,10 @@ DATABASES = {
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'},
{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
# {'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator'},
# {'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator'},
# {'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator'},
# {'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator'},
]
AUTHENTICATION_BACKENDS = (
@ -188,7 +188,7 @@ SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details',
'users.pipeline.test_contractor',
'users.pipeline.success_social_register',
)
FIELDS_STORED_IN_SESSION = ['user_type']

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-12 12:08
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('chat', '0004_auto_20160804_1806'),
]
operations = [
migrations.AddField(
model_name='message',
name='is_new',
field=models.BooleanField(default=True),
),
]

@ -13,6 +13,7 @@ class Message(models.Model):
recipent = models.ForeignKey(User, related_name='recipent_messages')
private_type = models.BooleanField(default=False)
team = models.ForeignKey(Team, related_name='messages', null=True, blank=True)
is_new = models.BooleanField(default=True)
def __str__(self):
return self.text

@ -253,7 +253,10 @@
var SocketHandler = function () {
var userId = {{ request.user.pk }};
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain +':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@ -581,7 +584,6 @@
});
//Добавить сообщение для исполнителей в группе
$("#add-team-chat-message").on('click', function(){
@ -607,8 +609,6 @@
}
});
$("#team-chat-form #chatText").val("");
});

@ -523,7 +523,10 @@
var userId = '{{ request.user.pk }}';
var SocketHandler = function () {
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain +':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {

@ -56,6 +56,8 @@ class ChatUserView(View):
if request.user.is_owner_team():
team_orders = request.user.team.orders.all()
else:
team_orders = []
self.template_name = 'chat_contractor.html'
return render(request, self.template_name, {'orders': orders,

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-12 12:11
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0001_squashed_0015_merge'),
]
operations = [
migrations.AddField(
model_name='candidate',
name='position',
field=models.PositiveIntegerField(default=0, max_length=10),
),
]

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-12 12:12
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0002_candidate_position'),
]
operations = [
migrations.AlterField(
model_name='candidate',
name='position',
field=models.PositiveIntegerField(default=0),
),
]

@ -203,6 +203,7 @@ class Candidate(models.Model):
answer = models.ForeignKey(Answer, related_name='candidates')
project = models.ForeignKey(Project, related_name='candidates')
status = models.BooleanField(default=False)
position = models.PositiveIntegerField(default=0)
def __str__(self):
return self.answer.user.get_full_name()

@ -34,7 +34,7 @@ urlpatterns = [
urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'),
urls.url(r'^candidate/add/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', add_candidate, name='add-candidate'),
urls.url(r'^candidate/comparison/(?P<pk>\d+)$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^candidate/comparison/(?P<pk>\d+)/$', ProjectComparisonView.as_view(), name='comparison'),
urls.url(r'^offerorder/(?P<answer_id>(\d+))/(?P<project_id>(\d+))/$', OfferOrderView.as_view(), name='offer-order'),

@ -3,41 +3,43 @@
<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge, chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<!--<meta name='viewport' content='initial-scale=1.0, user-scalable=no, maximum-scale=1'>-->
<title>Archilance</title>
{% load compress %}
{% compress css %}
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "css/reset.css" %}'>
<link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'>
<link rel='stylesheet' href='{% static "lib/select2/select2.css" %}'> <!-- Tmp -->
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
<link rel="stylesheet" type="text/css" href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css" />
<link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->
<link rel='stylesheet' href='{% static "css/dev-colors.css" %}'> <!-- Dev-time only, temporary!!! -->
{% endcompress %}
<meta charset='utf-8'>
<meta http-equiv='X-UA-Compatible' content='IE=edge, chrome=1'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<!--<meta name='viewport' content='initial-scale=1.0, user-scalable=no, maximum-scale=1'>-->
<title>Archilance</title>
{% load compress %}
{% compress css %}
<link rel='stylesheet' href='{% static "css/bootstrap.css" %}'>
<link rel='stylesheet' href='{% static "css/font-awesome.min.css" %}'>
<link rel='stylesheet' href='{% static "css/reset.css" %}'>
<link rel='stylesheet' href='{% static "lib/bootstrap-select/css/bootstrap-select.css" %}'>
<link rel='stylesheet' href='{% static "lib/select2/select2.css" %}'> <!-- Tmp -->
<link rel='stylesheet' href='{% static "css/swiper.min.css" %}'>
<link rel='stylesheet' href='{% static "lib/jquery.fileupload/css/jquery.fileupload.css" %}'>
<link rel='stylesheet' href='{% static "js/magnific-popup.css" %}'>
<link rel="stylesheet" type="text/css"
href="//cdnjs.cloudflare.com/ajax/libs/jquery-jgrowl/1.4.1/jquery.jgrowl.min.css"/>
<link rel='stylesheet' href='{% static "css/main.css" %}'>
<link rel='stylesheet' href='{% static "css/extra.css" %}'> <!-- Our additional CSS -->
<link rel='stylesheet' href='{% static "css/dev-colors.css" %}'> <!-- Dev-time only, temporary!!! -->
{% endcompress %}
</head>
<body>
{% if messages %}
{% for message in messages %}
<div class="c" style="position: relative; padding: 10px; margin-bottom: 6px; z-index: 100">{{ message|safe }}</div>
<div class="c"
style="position: relative; padding: 10px; margin-bottom: 6px; z-index: 100">{{ message|safe }}</div>
{% endfor %}
{% endif %}
<div style="position: absolute; left: 0; top: 0; padding: 6px; color: black; background-color: #BADA55; z-index: 50">
{{ request.user }}<br>
{% if request.user.is_authenticated %}
<b>PK:</b> {{ request.user.pk }}<br>
<b>Groups:</b> {{ request.user.groups.all }}
@ -73,8 +75,14 @@
{% endblock %}
<script type="text/javascript">
var SocketHandlerMain = function (userId) {
var url = 'ws://127.0.0.1:8888/chat/' + userId + '/';
var SocketHandlerMain = function (userId) {
var domain = '{{ request.META.HTTP_HOST }}';
var port = '{{ request.META.SERVER_PORT }}';
var queryString = '{{ request.get_full_path }}';
if (queryString.indexOf('/chat') != 0) {
domain = domain.replace(':' + port, '');
var url = 'ws://' + domain + ':8888/chat/' + userId + '/';
var sock = new WebSocket(url);
var intervalId;
sock.onopen = function () {
@ -88,14 +96,14 @@
var notificationData = JSON.parse(event.data);
$.jGrowl("Вам пришло новое сообщение!" + notificationData.msg, {sticky: true});
};
}
$(function () {
var userId = '{{ request.user.pk }}';
if (userId) {
var socketMain = new SocketHandlerMain(userId);
}
});
}
$(function () {
var userId = '{{ request.user.pk }}';
if (userId) {
var socketMain = new SocketHandlerMain(userId);
}
});
</script>
</body>
</html>

@ -17,7 +17,7 @@
{% else %}
<div class="col-lg-12 select-reg polsF1">
<select class="selectpicker3" name="group_id">
<option>Выберете вашу роль</option>
<option>Выберете вашу роль </option>
<option value="Исполнители">Исполнитель</option>
<option value="Заказчики">Заказчик</option>
</select>
@ -25,12 +25,12 @@
{% endif %}
</div>
<div class="col-lg-12 select-reg">
<input type="text" name="{{ form.username.name }}" class="box-sizing email-reg"
<input type="text" name="{{ form.username.name }}" value="{{ form.username.value }}" class="box-sizing email-reg"
placeholder="Nickname">
</div>
<div class="col-lg-12 select-reg">
<input type="text" name="{{ form.email.name }}" class="box-sizing email-reg"
placeholder="Электронная почта">
value="{{ form.email.value }}" placeholder="Электронная почта">
</div>
<div class="col-lg-12 select-reg">
<input type="password" name="{{ form.password1.name }}" class="box-sizing pass-reg"
@ -51,13 +51,13 @@
<div class="btn-group" role="group">
<div class="pull-left -social -fb">
<a href="{% url 'social:begin' 'facebook' %}?user_type=contractor">
<a href="{% url 'social:begin' 'facebook' %}?user_type={% if request.GET.type == 'customer' %}Заказчики{% else %}Исполнители{% endif %}">
<img src="http://nepesh.com/static/img/social/fb.png" alt="fb">
</a>
</div>
<div class="pull-left -social -tw">
<a href="{% url 'social:begin' 'twitter' %}?user_type=contractor">
<a href="{% url 'social:begin' 'twitter' %}?user_type={% if request.GET.type == 'customer' %}Заказчики{% else %}Исполнители{% endif %}">
<img src="http://nepesh.com/static/img/social/tw.png" alt="tw">
</a>
</div>

@ -0,0 +1,25 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-12 08:51
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('users', '0007_auto_20160808_1557'),
]
operations = [
migrations.AlterField(
model_name='contractorresumefiles',
name='title',
field=models.CharField(blank=True, max_length=255),
),
migrations.AlterField(
model_name='contractorresumefiles',
name='type',
field=models.CharField(choices=[('diplom', 'Дипломы/Сертификаты'), ('cro', 'Допуск CPO')], default='diplom', max_length=50),
),
]

@ -1,18 +1,37 @@
from django.shortcuts import redirect, render_to_response
from django.core.mail import EmailMultiAlternatives
from django.template.loader import get_template, render_to_string
from social.pipeline.partial import partial
from django.contrib.auth.models import Group
from users.models import ContractorResume
def send_user_mail(user):
ctx_dict = {
'user': user,
}
subject, from_email, to = 'Регистрация черз социальные сети', 'mukhtar@mukhtar', user.email
text_content = render_to_string('register_social_mail.txt', ctx_dict)
html_content = get_template('register_social_mail.html').render(ctx_dict)
msg = EmailMultiAlternatives(subject, text_content, from_email, [to])
msg.attach_alternative(html_content, "text/html")
msg.send()
@partial
def test_contractor(backend, details, response, user,is_new=False, *args, **kwargs):
def success_social_register(backend, details, response, user,is_new=False, *args, **kwargs):
if is_new:
group_name = 'Исполнители'
group_name = backend.strategy.session_get('user_type')
# group_name = 'Исполнители'
g = Group.objects.get(name=group_name)
g.user_set.add(user)
if group_name == 'Исполнители':
resume = ContractorResume.objects.create(text='Здесь должна быть описание вашего резюме')
user.contractor_resume = resume
user.save()
#Отправка письма на почту
send_user_mail(user)
@partial
def add_email_for_user(backend, details, response, is_new=False, *args, **kwargs):

@ -89,7 +89,7 @@
</div>
</div>
</div>
{% if contractor.is_owner_team %}
<div class="projectsBlock disTab">
<div class="col-lg-12">
<div class="col-lg-3 divCol3">
@ -276,6 +276,7 @@
</div>
</div>
{% endif %}
{% include 'partials/footer.html' %}
</div>
</div>

@ -249,10 +249,14 @@
<div id="tab13" class="tab-pane fade">
<div class="col-lg-9 resume">
<form enctype="multipart/form-data">
<input type="hidden" name="text" value="Hello">
<div class="upload2 up-l1">
<input type="file" name="upload">
<input type="file" name="upload" id="upload-resume">
<p>Загрузить резюме</p>
</div>
</form>
{#w#}
</div>
<div class="col-lg-9 resume-block">
@ -267,12 +271,13 @@
<div class="col-lg-9">
<div class="top-summary">
<p class="name-summ">{{ user.get_full_name }}</p>
<div id="resume-success"></div>
{% if contractor.contractor_resume.resume_file %}
<a href="{{ contractor.contractor_resume.resume_file.url }}"
<a style="display:{% if contractor.contractor_resume.resume_file %}block{% else %}none{% endif %};"href="{% if contractor.contractor_resume.resume_file %}{{ contractor.contractor_resume.resume_file.url }}{% endif %}"
class="download-summ">скачать резюме</a>
{% endif %}
<p class="who-summ">
{# Мужчина, 24 года, {{ user.date_of_birth }}#}
Мужчина, 24 года, {{ user.date_of_birth }}#}
</p>
<div class="list-summ-block">
<div class="col-lg-4">
@ -504,7 +509,7 @@
e.preventDefault();
var dataSerializer = $(this).serialize();
$.ajax({
url: '/work_sell/test/',
url: '/work_sell/create/',
method: 'POST',
data: dataSerializer,
dataType: 'json',
@ -512,9 +517,11 @@
if (data.status == 'ok') {
location.reload();
}
},
error: function (jqXHR, exception) {
console.log(jqXHR.statusCode);
console.log(jqXHR);
}
})
@ -524,6 +531,7 @@
$('#portfolio-add-form').on('submit', function (e) {
e.preventDefault();
var dataSerializer = $(this).serialize();
$.ajax({
url: '/projects/portfolio/create/',
method: 'POST',
@ -549,6 +557,34 @@
var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken');
$("#upload-resume").on('change',function(e){
$("#resume-success").html("");
var formData = new FormData($(this).closest("form"));
formData.append('resume_file', e.target.files[0]);
console.log(formData);
console.log(e.target.files[0]);
$.ajax({
url:'/api/contractorresume/{{ contractor.contractor_resume.pk }}/',
method:'PUT',
beforeSend: function (xhr) {
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
},
data: formData,
cache: false,
dataType: 'json',
processData: false,
contentType: false,
success: function(data){
$("#resume-success").html("Файл для резюме успешно загружен!");
$(".download-summ").css('display','block').attr('href',data.resume_file);
console.log(data);
},
error: function(jqXHR){
console.log(jqXHR);
}
});
});
$('#fileupload').fileupload({
url: url,
crossDomain: false,

@ -0,0 +1,2 @@
Регистрация через соцсети
{{ user.username }}

@ -0,0 +1,2 @@
Регистрация через соцсети
{{ user.username }}

@ -76,7 +76,7 @@
</div>
<div class="polsF1 polsF2 disTab">
<input type="text" name="images-ids" id="upload-files-worksell-pk" />
<input type="hidden" name="images-ids" id="upload-files-worksell-pk" />
</div>

@ -15,16 +15,27 @@ class ContractorWorkSellTrashForm(forms.Form):
class WorkSellForm(forms.ModelForm):
class Meta:
model = WorkSell
fields = '__all__'
fields = (
'budget',
'building_classification',
'construction_type',
'contractor',
'currency',
'description',
'location',
'name',
'specialization',
'term',
'term_type',
)
widgets = {
'construction_type': forms.Select(attrs={'class':'selectpicker'}),
'building_classification': forms.Select(attrs={'class':'selectpicker'}),
'currency': forms.Select(attrs={'class':'selectpicker'}),
'term_type': forms.Select(attrs={'class':'selectpicker'}),
'construction_type': forms.Select(attrs={'class': 'selectpicker'}),
'building_classification': forms.Select(attrs={'class': 'selectpicker'}),
'currency': forms.Select(attrs={'class': 'selectpicker'}),
'term_type': forms.Select(attrs={'class': 'selectpicker'}),
}
def __init__(self, *args, **kwargs):

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-08-12 08:51
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('work_sell', '0002_auto_20160805_1736'),
]
operations = [
migrations.AlterField(
model_name='worksell',
name='created',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

@ -18,12 +18,12 @@ app_name = 'work_sell'
urlpatterns = [
urls.url(r'^$', WorkSellsView.as_view(), name='list'),
urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'),
# urls.url(r'^create/$', WorkSellCreateView.as_view(), name='create'),
urls.url(r'^upload/$', UploadView.as_view(), name='upload'),
urls.url(r'^(?P<pk>\d+)/edit/$',WorkSellUpdateView.as_view(), name='edit'),
urls.url(r'^(?P<pk>\d+)/delete/$',WorkSellDeleteView.as_view(), name='delete'),
urls.url(r'^(?P<pk>\d+)/trash/$', ContractorWorkSellTrashView.as_view(), name='contractor-worksell-trash'),
urls.url(r'^test/$', work_sell_create, name='test'),
urls.url(r'^create/$', work_sell_create, name='create'),
urls.url(r'^basic/$', BasicCreateView.as_view(), name='upload-basic'),
urls.url(r'^new/$', PictureCreateView.as_view(), name='upload-new'),
urls.url(r'^(?P<pk>\d+)/$', WorkSellDetail.as_view(), name='detail'),

Loading…
Cancel
Save