#ARC-18 add reserve models

remotes/origin/setup
Mukhtar 10 years ago
parent a0fe73f49a
commit c8e216f428
  1. 2
      api/urls.py
  2. 18
      api/views.py
  3. 1
      archilance/settings/base.py
  4. 4
      assets/css/extra.css
  5. 12
      chat/filters.py
  6. 17
      chat/serializers.py
  7. 124
      chat/templates/chat_contractor.html
  8. 113
      chat/templates/chat_customer.html
  9. 22
      projects/migrations/0005_auto_20160726_1957.py
  10. 27
      projects/migrations/0006_auto_20160727_1835.py
  11. 21
      projects/migrations/0007_auto_20160727_1835.py
  12. 3
      projects/models.py
  13. 2
      users/serializers.py
  14. 34
      users/templates/contractor_profile.html
  15. 20
      users/templates/portfolio_create_form.html
  16. 8
      users/templates/worksell_create_form.html
  17. 0
      wallets/__init__.py
  18. 5
      wallets/admin.py
  19. 5
      wallets/apps.py
  20. 36
      wallets/migrations/0001_initial.py
  21. 22
      wallets/migrations/0002_auto_20160727_1835.py
  22. 0
      wallets/migrations/__init__.py
  23. 26
      wallets/models.py
  24. 3
      wallets/tests.py
  25. 3
      wallets/views.py
  26. 1
      work_sell/serialize.py

@ -8,6 +8,7 @@ from .views import (
UserViewSet,
MessageViewSet,
StageViewSet,
NoteViewSet,
)
@ -20,5 +21,6 @@ router.register(r'realties', RealtyViewSet)
router.register(r'specializations', SpecializationViewSet)
router.register(r'users', UserViewSet)
router.register(r'message', MessageViewSet)
router.register(r'note', NoteViewSet)
urlpatterns = router.urls

@ -18,9 +18,9 @@ from common.models import Location
from common.serializers import LocationSerializer
from common.filters import LocationFilterSet
from chat.models import Message
from chat.serializers import MessageSerializer
from chat.filters import MessageFilterSet
from chat.models import Message, Notes
from chat.serializers import MessageSerializer, NoteSerializer
from chat.filters import MessageFilterSet, NoteFilterSet
class StageViewSet(ModelViewSet):
@ -29,10 +29,6 @@ class StageViewSet(ModelViewSet):
filter_class = StageFilterSet
permission_classes = (permissions.IsAuthenticatedOrReadOnly,)
# def put(self, request, *args, **kwargs):
# # import code; code.interact(local=dict(globals(), **locals()))
# return super().update(request, *args, **kwargs)
class ProjectViewSet(ModelViewSet):
queryset = Project.objects.all()
@ -40,6 +36,12 @@ class ProjectViewSet(ModelViewSet):
filter_class = ProjectFilterSet
class NoteViewSet(ModelViewSet):
queryset = Notes.objects.all()
serializer_class = NoteSerializer
filter_class = NoteFilterSet
class MessageViewSet(ModelViewSet):
queryset = Message.objects.all()
serializer_class = MessageSerializer
@ -57,14 +59,12 @@ class MessageViewSet(ModelViewSet):
return queryset
class RealtyViewSet(ModelViewSet):
queryset = Realty.objects.all()
serializer_class = RealtySerializer
filter_class = RealtyFilterSet
class SpecializationViewSet(ModelViewSet):
queryset = Specialization.objects.root_nodes()[0].get_descendants()
# queryset = Specialization.objects # Migrate with this enabled

@ -52,6 +52,7 @@ LOCAL_APPS = [
'users',
'reviews',
'chat',
'wallets',
]
INSTALLED_APPS = DJANGO_APPS + THIRD_PARTY_APPS + LOCAL_APPS

@ -64,3 +64,7 @@
background-color: #00bb7b;
font-size: 17px;
}
.textAreaBlock2 input[type="text"] {
margin: 0;
}

@ -1,6 +1,6 @@
from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import Message
from .models import Message, Notes
class MessageFilterSet(FilterSet):
@ -12,3 +12,13 @@ class MessageFilterSet(FilterSet):
class Meta:
model = Message
class NoteFilterSet(FilterSet):
text = AllLookupsFilter()
created = AllLookupsFilter()
sender = RelatedFilter('users.filters.UserFilterSet')
recipent = RelatedFilter('users.filters.UserFilterSet')
class Meta:
model = Notes

@ -20,7 +20,16 @@ class MessageSerializer(ModelSerializer):
)
# class NotesSerializer(ModelSerializer):
#
# class Meta:
# model = Notes
class NoteSerializer(ModelSerializer):
class Meta:
model = Notes
fields = (
'text',
'created',
'order',
'sender',
'recipent',
)

@ -8,6 +8,7 @@
<div class="col-lg-12 allProjects">
<h1>Чат {{ request.user }} {{ request.user.pk }}</h1>
</div>
<div class="btnReadyBlock disTab">
<div class="triangle1"></div>
<div class="col-lg-6 col-lg-offset-3 tabsChat">
@ -29,7 +30,9 @@
</div>
</div>
</div>
<div class="tab-content">
<!-- Tab1 contacts block -->
<div class="chatBlock disTab tab-pane fade in active" id="tab1">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
@ -56,102 +59,46 @@
</div>
</div>
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space">
</div>
<div class="col-lg-6 commChat" id="contact-chat">
<div id="message-chat-space"></div>
<form id="contact-chat-form">
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderId"/>
<input type="hidden" value="" name="recipentId" id="recipentId"/>
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing">
<p>Прикрепить файл</p>
<span>
Не более 10 файлов с общим объемом 500мб
</span>
<span>Не более 10 файлов с общим объемом 500мб</span>
</div>
<a id="contact-chat-add-message" href="javascript:void(0)">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
<div class="message">
<div class="imgMess">
<img src="img/mess.png" alt="mess-image">
</div>
<p class="nameMess">
<a href="#">Иванов Петр Иванович</a>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
</div>
</div>
<div class="col-lg-12 startChat">
<div class="insetSC1">
Начало:
<span>Срок сдачи:</span>
</div>
<div class="insetSC2">
13.0.2016
<span>13.0.2016</span>
</div>
</div>
<div class="col-lg-12 documentsChat">
<p>Входящие документы</p>
<ul>
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
<a href="javascript:void(0)">
Распечатать с помощью ресурса
</a>
</div>
<div class="col-lg-3 wrChat1">
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a>
</div>
<div class="closeChat closeChat1">
<a href="javascript:void(0)">
Закрыть проект<br>и оставить отзыв
</a>
</div>
<div class="closeChat closeChat2">
<a href="javascript:void(0)">
Закрыть проект<br>и оставить отзыв
</a>
</div>
</div>
</div>
<!-- End block Tab1 -->
<!-- Tab2 chat order block -->
<div class="chatBlock disTab tab-pane fade" id="tab2">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for order in orders %}
<div class="orderBlock box-sizing order-block"
data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<div class="orderBlock box-sizing order-block" data-recipent-id="{{ order.project.customer.pk }}" data-id="{{ order.id }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ order }}
</p>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span>Испонитель:</span> {{ request.user.get_full_name }}
</p>
<p class="pOB">
<span>Чаты:</span> Иванов, Петров, Пенкин
</p>
<p class="pOB"><span>Испонитель:</span> {{ request.user.get_full_name }}</p>
<p class="pOB"><span>Чаты:</span> Иванов, Петров</p>
<a href="javascript:void(0)" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
@ -163,27 +110,24 @@
</div>
<div class="col-lg-6 commChat">
<div id="message-chat-order-space">
</div>
<div id="message-chat-order-space"></div>
<form id="chat-contractor-order">
<input type="text" id="orderId"/>
<input type="text" id="senderOrderId" value="{{ request.user.pk }}"/>
<input type="text" id="recipentOrderId"/>
<input type="hidden" id="orderId"/>
<input type="hidden" id="senderOrderId" value="{{ request.user.pk }}"/>
<input type="hidden" id="recipentOrderId"/>
<textarea id="chat" class="box-sizing"></textarea>
<div class="bunChat">
<div class="setChat box-sizing">
<p>Прикрепить файл</p>
<span>
Не более 10 файлов с общим объемом 500мб
</span>
<span>Не более 10 файлов с общим объемом 500мб</span>
</div>
<a href="javascript:void(0)" id="order-chat-add-message">отправить</a>
</div>
</form>
</div>
<div class="col-lg-3 wrTAB">
</div>
<div class="col-lg-3 wrstepschat">
<p>Этапы работы</p>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">1 / Согласование условий</p>
@ -193,16 +137,20 @@
</div>
<div id="order-stages"></div>
<div class="textAreaBlock2 FFD box-sizing disTab">
<a id="approve-stages" href="javascript:void()">согласовать</a>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a>
</div>
<div class="linkChatB box-sizing disTab">
<a href="javascript:void(0)">предложить проект</a>
</div>
</div>
</div>
<!-- End block Tab2-->
<!-- Tab3 groups block -->
<div class="chatBlock disTab tab-pane fade" id="tab3">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
@ -272,6 +220,7 @@
</div>
</div>
</div>
<!-- End block Tab3-->
</div>
{% include 'partials/footer.html' %}
</div>
@ -282,10 +231,6 @@
{% block js_block %}
{# <script type="text/javascript" src="{% static 'js/chat.js' %}"></script>#}
<script type="text/javascript">
/**
* Created by mukhtar on 04.07.16.
*/
var SocketHandler = function () {
var userId = {{ request.user.pk }};
@ -339,7 +284,6 @@
sock.send(JSON.stringify(data));
var textareaMessage = document.getElementById("message");
textareaMessage.value = "";
}
}
@ -350,6 +294,13 @@
var form = document.getElementById('message_form');
var csrftoken = getCookie('csrftoken');
$("#approve-stages").on('click', function(){
$(".stage-block-approve").each(function(){
var stageId = $(this).attr('data-id');
alert(stageId);
});
});
// Вытащить сообщения для чата заказа
$('.order-block').on('click', function () {
var orderId = $(this).attr('data-id');
@ -366,7 +317,6 @@
dataType: 'json',
success: function (json) {
$.each(json.results, function (i, v) {
var senderName = 'Вы';
var className = 'youChat';
if (v.sender.id !== currentChatUser) {
@ -390,7 +340,7 @@
console.log(json.results);
var htmlInbox = "";
$.each(json.results, function (i, v) {
htmlInbox += '<div class="numberStepp box-sizing"><div class="insetNumStepp">' +
htmlInbox += '<div data-id="'+ v.id +'" class="numberStepp box-sizing stage-block-approve"><div class="insetNumStepp">' +
'<p class="titleNumStepp"><span>Этап '+ v.pos +'</span>'+ v.name +'</p>' +
'<p class="textNumStepp">Результаты этапа:'+ v.result+'</p><div>' +
'<p>до 16.03.2015</p><span>'+ v.cost +'<i class="fa fa-rub"></i></span></div></div></div>';

@ -24,6 +24,7 @@
</div>
</div>
<div class="tab-content">
<!-- Tab1 (contacts block)-->
<div class="chatBlock disTab tab-pane fade in active" id="tab1">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
@ -52,8 +53,8 @@
<div id="message-chat-space">
</div>
<form id="contact-chat-form">
<input type="text" value="{{ request.user.pk }}" name="senderId" id="senderId"/>
<input type="text" value="" name="recipentId" id="recipentId"/>
<input type="hidden" value="{{ request.user.pk }}" name="senderId" id="senderId"/>
<input type="hidden" value="" name="recipentId" id="recipentId"/>
<textarea id="chat" name="chat_message" class="box-sizing"></textarea>
<div class="bunChat">
@ -71,77 +72,29 @@
</div>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Контакты</p>
<div class="message">
<div class="imgMess">
<img src="img/mess.png" alt="mess-image">
</div>
<p class="nameMess">
<a href="#">Иванов Петр Иванович</a>
</p>
<a href="javascript:void(0)" class="conMess">Контакты</a>
</div>
</div>
<div class="col-lg-12 startChat">
<div class="insetSC1">
Начало:
<span>Срок сдачи:</span>
</div>
<div class="insetSC2">
13.0.2016
<span>13.0.2016</span>
</div>
</div>
<div class="col-lg-12 documentsChat">
<p>Входящие документы</p>
<ul>
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
<a href="javascript:void(0)">
Распечатать с помощью ресурса
</a>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
<a href="javascript:void()">сохранить</a>
</div>
<div class="closeChat closeChat1">
<a href="javascript:void(0)">
Закрыть проект<br>и оставить отзыв
</a>
</div>
<div class="closeChat closeChat2">
<a href="javascript:void(0)">
Закрыть проект<br>и оставить отзыв
</a>
</div>
</div>
</div>
<!-- End block Tab1(contacts block)-->
<!-- Tab2 (chat order block)-->
<div class="chatBlock disTab tab-pane fade" id="tab2">
<div class="col-lg-3 wrMessages">
<div class="messageBlock box-sizing disTab">
<p>Заказы</p>
{% for order in orders %}
<div class="orderBlock box-sizing order-block"
data-recipent-id="{{ order.order.contractor.pk }}" data-id="{{ order.order.id }}">
<span class="dimovChat"></span>
<p class="titleOB">
{{ order }}
</p>
<p class="titleOB">{{ order }}</p>
<div class="hideOBB">
<p class="pOB">
<span>Испонитель:</span> {{ order.order.contractor.get_full_name }}
</p>
{# <p class="pOB">#}
{# <span>Чаты:</span> Иванов, Петров, Пенкин#}
{# </p>#}
<a href="javascript:void(0)" class="linkChat11">
<span class="glyphicon glyphicon-info-sign" aria-hidden="true"></span>
Полное описание заказа
@ -181,14 +134,13 @@
<p class="textStepss">
Обсуджение задания и условий выполнения работы. Подтверждение заказа исполнителем.
</p>
<p></p>
</div>
<div class="stepssBlock box-sizing disTab">
<p class="textStepss">
Какое кол-во этапов подразумевает работа? <input type="text" id="countStage" size="3"/>
</p>
<div id="formsetStage" class="numberStepp box-sizing" style="display: none;">
<div id="formsetStage" class="numberStepp box-sizing" style="display: none;">
<div class="insetNumStepp" id="stage1">
<p class="titleNumStepp">
<span>Этап </span>
@ -207,7 +159,7 @@
</div>
<div class="textAreaBlock2 box-sizing disTab">
<a href="javascript:void()" id="addStagesForm">сохранить</a>
<a href="javascript:void()" id="addStagesForm">отправить на согласование</a>
</div>
</div>
@ -218,6 +170,49 @@
<div id="order-stages"></div>
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">2 / Резервирование</p>
<p class="textStepss">
Резервирование заказчиком суммы оплаты по заказ. Деньги перечисляются и хранятся на сайте.
</p>
<div class="textAreaBlock2 FFD box-sizing disTab">
<a href="#" data-toggle="modal" data-target="#reserve-stage-modal">Зарезирвировать</a>
</div>
</div>
<!-- Зарезервировать средства (модальное окно)-->
<div id="reserve-stage-modal" class="modal fade">
<div class="modal-dialog" style="width:900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Зарезервировать средства</h4>
</div>
<div class="modal-body">
<div class="textAreaBlock2 text-nn box-sizing disTab">
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить">
</div>
</div>
<div class="modal-footer"></div>
</div>
</div>
</div>
<!-- Конец блока -->
<div class="stepssBlock box-sizing disTab">
<p class="titleStepss">3 / Выполнение работы</p>
<p class="textStepss">
Процесс выполнения задания в заказе до получения заказчиком итогового результата работы.
</p>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<p>Для заметок</p>
<textarea id="chat2"></textarea>
@ -228,6 +223,7 @@
</div>
</div>
</div>
<!-- End block (chat order block) -->
</div>
{% include 'partials/footer.html' %}
</div>
@ -324,6 +320,7 @@
dataType: 'json',
success: function (json) {
var htmlInbox = "";
console.log(json.results.length);
$.each(json.results, function (i, v) {
if (v.status == "not_agreed") {
htmlInbox += '<div class="numberStepp box-sizing">' +

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-26 16:57
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('projects', '0004_auto_20160726_1931'),
]
operations = [
migrations.AlterField(
model_name='stage',
name='created',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 26, 16, 57, 39, 517305, tzinfo=utc)),
),
]

@ -0,0 +1,27 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-27 15:35
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('projects', '0005_auto_20160726_1957'),
]
operations = [
migrations.AddField(
model_name='stage',
name='is_paid',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='stage',
name='created',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 27, 15, 35, 21, 468300, tzinfo=utc)),
),
]

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-27 15:35
from __future__ import unicode_literals
from django.db import migrations, models
import django.utils.timezone
class Migration(migrations.Migration):
dependencies = [
('projects', '0006_auto_20160727_1835'),
]
operations = [
migrations.AlterField(
model_name='stage',
name='created',
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

@ -165,8 +165,9 @@ class Stage(models.Model):
term = models.IntegerField(default=0)
term_type = models.CharField(max_length=10, choices=TERMS, default='hour')
status = models.CharField(choices=STATUSES, max_length=30, default='not_agreed')
created = models.DateTimeField(default=timezone.now())
created = models.DateTimeField(default=timezone.now)
pos = models.IntegerField(default=0, null=True, blank=True)
is_paid = models.BooleanField(default=False)
def __str__(self):
return self.name

@ -10,7 +10,7 @@ class UserSerializer(ModelSerializer):
fields = (
'avatar',
'contractor_financial_info',
'financial_info',
'contractor_specializations',
'contractor_status',
'created',

@ -287,7 +287,34 @@
<div class="pluss-block">
{{ contractor.contractor_resume.text }}
<a href="#" data-toggle="modal" data-target="#resume-text-edit">Редактировать</a>
</div>
<!-- Редактирование текста резюме (модальное окно)-->
<div id="resume-text-edit" class="modal fade">
<div class="modal-dialog" style="width:900px;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">Редактировать текст резюме</h4>
</div>
<div class="modal-body">
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Описание резюме</p>
<textarea name="" id="text-new">{{ contractor.contractor_resume.text }}</textarea>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Сохранить">
</div>
</div>
<div class="modal-footer"></div>
</div>
</div>
</div>
<!-- Конец блока (resume-modal)-->
<div class="gal-pluss">
<div class="inset-gp">
<p class="title-gp">Дипломы / Сертификаты</p>
@ -459,8 +486,6 @@
});
});
var url = '/work_sell/basic/';
var csrftoken = $.cookie('csrftoken');
$('#fileupload').fileupload({
@ -476,6 +501,11 @@
console.log(data);
$.each(data.result.files, function (index, file) {
var img = $('<img style="width:200px;height:200px;">').attr('src', file.url).appendTo("#files");
console.log(file);
var currentValue = $("#upload-files-pk").val();
currentValue += file.id + ';';
$("#upload-files-pk").val(currentValue);
});
},
progressall: function (e, data) {

@ -77,9 +77,27 @@
</div>
<div class="polsF1 polsF2 disTab">
<input type="file" name="{{ portfolio_form.img.html_name }}" >
<input type="hidden" name="" id="upload-files-pk" value="" />
</div>
<!-- The fileinput-button span is used to style the file input field as button -->
<span class="btn btn-success fileinput-button">
<i class="glyphicon glyphicon-plus"></i>
<span>Выберите файлы</span>
<!-- The file input field used as target for the file upload widget -->
<input id="fileupload" type="file" name="file" multiple>
</span>
<br>
<br>
<!-- The global progress bar -->
<div id="progress" class="progress">
<div class="progress-bar progress-bar-success"></div>
</div>
<!-- The container for the uploaded files -->
<div id="files" class="files"></div>
<br>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить портфолио">
</div>

@ -72,12 +72,12 @@
</div>
<div class="polsF1 polsF2 disTab">
<input type="text" name="{{ worksell_form.contractor.html_name }}" value="{{ request.user.pk }}" />
<input type="hidden" name="{{ worksell_form.contractor.html_name }}" value="{{ request.user.pk }}" />
</div>
<div class="polsF1 polsF2 disTab">
<input type="file" name="{{ worksell_form.img.html_name }}" >
</div>
{# <div class="polsF1 polsF2 disTab">#}
{# <input type="file" name="{{ worksell_form.img.html_name }}" >#}
{# </div>#}
<!-- The fileinput-button span is used to style the file input field as button -->

@ -0,0 +1,5 @@
from django.contrib import admin
from .models import InvoiceHistory
admin.site.register(InvoiceHistory)

@ -0,0 +1,5 @@
from django.apps import AppConfig
class WalletsConfig(AppConfig):
name = 'wallets'

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-27 15:35
from __future__ import unicode_literals
import datetime
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
from django.utils.timezone import utc
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='InvoiceHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('comment', models.TextField(blank=True)),
('created', models.DateTimeField(default=datetime.datetime(2016, 7, 27, 15, 35, 21, 502073, tzinfo=utc))),
('sum', models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True)),
('type', models.CharField(max_length=20)),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='invoice_history', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Счет(История)',
'verbose_name_plural': 'Счет(История)',
},
),
]

@ -0,0 +1,22 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.7 on 2016-07-27 15:35
from __future__ import unicode_literals
import datetime
from django.db import migrations, models
from django.utils.timezone import utc
class Migration(migrations.Migration):
dependencies = [
('wallets', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='invoicehistory',
name='created',
field=models.DateTimeField(default=datetime.datetime(2016, 7, 27, 15, 35, 53, 331650, tzinfo=utc)),
),
]

@ -0,0 +1,26 @@
from django.db import models
from django.utils import timezone
from users.models import User
TYPES = (
('minus', 'Снятие'),
('plus', 'Приход'),
)
class InvoiceHistory(models.Model):
comment = models.TextField(blank=True)
created = models.DateTimeField(default=timezone.now)
sum = models.DecimalField(max_digits=10, decimal_places=0, default=0, null=True, blank=True)
type = models.CharField(max_length=20)
user = models.ForeignKey(User, related_name='invoice_history')
def __str__(self):
return self.pk
class Meta:
verbose_name = 'Счет(История)'
verbose_name_plural = 'Счет(История)'

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.

@ -5,6 +5,7 @@ from django.core.urlresolvers import reverse
def serialize(instance, file_attr='file'):
obj = getattr(instance, file_attr)
return {
'id': instance.id,
'url': obj.url,
'name': obj.name,
'type': mimetypes.guess_type(obj.path)[0] or 'image/png',

Loading…
Cancel
Save