RelatedFieldWidgetCanAdd

This commit is contained in:
Anastasia
2015-08-04 15:20:54 +05:00
parent a1acf76886
commit aaab305aba
9 changed files with 100 additions and 24 deletions

View File

@@ -10,6 +10,7 @@ from asuzr.models import Attendance
from asuzr.models import Schedule from asuzr.models import Schedule
from asuzr.models import OrderCosts from asuzr.models import OrderCosts
from asuzr.models import CostItem from asuzr.models import CostItem
from asuzr.forms import *
# Register your models here. # Register your models here.

View File

@@ -2,8 +2,35 @@
from django import forms from django import forms
from django.forms import ModelForm from django.forms import ModelForm
from datetime import date from datetime import date
from django.contrib.admin.widgets import AdminDateWidget from django.contrib.admin.widgets import AdminDateWidget, FilteredSelectMultiple, RelatedFieldWidgetWrapper
from asuzr.models import Order from django.forms.extras.widgets import Select
from django.db.models.fields.related import ManyToOneRel
from asuzr.models import *
from django.core.urlresolvers import reverse
from django.utils.safestring import mark_safe
from django.forms import widgets
from django.conf import settings
class RelatedFieldWidgetCanAdd(widgets.Select):
def __init__(self, related_model, related_url=None, *args, **kw):
super(RelatedFieldWidgetCanAdd, self).__init__(*args, **kw)
if not related_url:
rel_to = related_model
info = (rel_to._meta.app_label, rel_to._meta.object_name.lower())
related_url = 'admin:%s_%s_add' % info
# Be careful that here "reverse" is not allowed
self.related_url = related_url
def render(self, name, value, *args, **kwargs):
self.related_url = reverse(self.related_url)
output = [super(RelatedFieldWidgetCanAdd, self).render(name, value, *args, **kwargs)]
output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % (self.related_url, name))
output.append(u'<img src="%sadmin/img/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.STATIC_URL, ('Add Another')))
return mark_safe(u''.join(output))
class DateForm (forms.Form): class DateForm (forms.Form):
date = forms.DateField(widget = AdminDateWidget, label = u'Дата', initial = date.today) date = forms.DateField(widget = AdminDateWidget, label = u'Дата', initial = date.today)
@@ -15,5 +42,24 @@ class DiapDateForm (forms.Form):
class OrderForm(ModelForm): class OrderForm(ModelForm):
class Meta: class Meta:
model = Order model = Order
fields = ['product', 'price', 'paid', 'address', 'deadline', 'delivery', 'lifting'] fields = ['product', 'price', 'paid', 'address', 'designer', 'deadline', 'delivery', 'lifting']
product = forms.ModelChoiceField(
required=False,
queryset = Product.objects.all(),
widget=RelatedFieldWidgetCanAdd(Product)
)
class ProdTableForm(ModelForm):
class Meta:
model = OrderCosts
fields = ['cost_item', 'value']
cost_item = forms.ModelChoiceField(
required=False,
queryset = CostItem.objects.all(),
widget=RelatedFieldWidgetCanAdd(CostItem)
)

View File

@@ -171,7 +171,7 @@ class OrderCosts(models.Model):
formula = models.CharField(max_length=150, null=True, blank = True) formula = models.CharField(max_length=150, null=True, blank = True)
def __unicode__(self): def __unicode__(self):
return ', '.join((self.order.product.name, self.cost_item.name)) return ', '.join((str(self.order.id), self.order.product.name, self.cost_item.name))
############################################################################################ ############################################################################################
@@ -204,7 +204,7 @@ def construct_log_entry(**kwargs):
log_entry['object_id'] = instance.id log_entry['object_id'] = instance.id
return log_entry return log_entry
@receiver(post_save) #@receiver(post_save)
def after_save(*args, **kwargs): def after_save(*args, **kwargs):
instance = kwargs['instance'] instance = kwargs['instance']
if isinstance(instance, LogEntry): return if isinstance(instance, LogEntry): return
@@ -214,7 +214,7 @@ def after_save(*args, **kwargs):
entry = LogEntry(**log_entry) entry = LogEntry(**log_entry)
entry.save() entry.save()
@receiver(post_delete) #@receiver(post_delete)
def after_delete(*args, **kwargs): def after_delete(*args, **kwargs):
log_entry = construct_log_entry(**kwargs) log_entry = construct_log_entry(**kwargs)
log_entry['action_flag'] = DELETION log_entry['action_flag'] = DELETION

View File

@@ -229,7 +229,7 @@ class ProductionTable(tables.Table):
class Meta: class Meta:
attrs = {'class': 'paleblue'} attrs = {'class': 'paleblue'}
template = 'asuzr/totals_table.html' template = 'asuzr/table_with_form.html'
class LogTable(tables.Table): class LogTable(tables.Table):
def render_action_flag(self, value): def render_action_flag(self, value):

View File

@@ -119,7 +119,7 @@ def visit_view(request):
orders_table = get_day_orders_table(curr_date, 'orders-') orders_table = get_day_orders_table(curr_date, 'orders-')
RequestConfig(request).configure(orders_table) RequestConfig(request).configure(orders_table)
order_form = OrderForm() order_form = OrderForm(initial = {'designer': request.user})
title = u'Таблица посещаемости на %s' % dateformat.format(curr_date, 'F Y') title = u'Таблица посещаемости на %s' % dateformat.format(curr_date, 'F Y')
return render(request, 'asuzr/table2.html', { return render(request, 'asuzr/table2.html', {
@@ -128,7 +128,8 @@ def visit_view(request):
'additional_info': add_info, 'additional_info': add_info,
'title': title, 'title': title,
'dateform': form, 'dateform': form,
'model_form': order_form 'add_form': order_form,
'form_action': 'add-order'
}) })
@login_required @login_required
@@ -219,7 +220,7 @@ def sketches(request, order_id):
'title': u'Эскизы заказа %s' % curr_order}) 'title': u'Эскизы заказа %s' % curr_order})
def add_order(request): def add_order(request):
new_order = Order(date=date.today(), designer = request.user) new_order = Order(date=date.today())
form = OrderForm(request.POST, instance = new_order) form = OrderForm(request.POST, instance = new_order)
form.save() form.save()
return redirect(visit_view) return redirect(visit_view)
@@ -264,8 +265,20 @@ def production_table(request, order_id):
costs_sum = order_costs.aggregate(Sum('value')) costs_sum = order_costs.aggregate(Sum('value'))
table.set_summary(costs_sum['value__sum'] or 0) table.set_summary(costs_sum['value__sum'] or 0)
table.set_balance(curr_order.price - (costs_sum['value__sum'] or 0)) table.set_balance(curr_order.price - (costs_sum['value__sum'] or 0))
form = ProdTableForm()
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render(request, 'asuzr/table.html', {'table': table, 'title': title}) return render(request, 'asuzr/table.html',
{'table': table, 'title': title, 'add_form': form, 'form_action': 'add-cost-items', 'params': order_id})
def production_table_add_item(request, order_id):
curr_order = Order.objects.get(pk = order_id)
new_item = OrderCosts(order=curr_order)
form = ProdTableForm(request.POST, instance = new_item)
form.save()
return redirect(production_table, order_id = order_id)
@login_required @login_required
def prod_plan_view(request): def prod_plan_view(request):

View File

@@ -20,6 +20,7 @@ urlpatterns = patterns('',
url(r'^orders/(?P<archive>\d+)/$', 'asuzr.views.orders',name='asuzr-orders'), url(r'^orders/(?P<archive>\d+)/$', 'asuzr.views.orders',name='asuzr-orders'),
url(r'^desreport/$', 'asuzr.views.desreport'), url(r'^desreport/$', 'asuzr.views.desreport'),
url(r'^production_table/(?P<order_id>\d+)/$', 'asuzr.views.production_table'), url(r'^production_table/(?P<order_id>\d+)/$', 'asuzr.views.production_table'),
url(r'^production_table/add_item/(?P<order_id>\d+)$', 'asuzr.views.production_table_add_item', name = 'add-cost-items'),
url(r'^sketches/(?P<order_id>\d+)/$', 'asuzr.views.sketches'), url(r'^sketches/(?P<order_id>\d+)/$', 'asuzr.views.sketches'),
url(r'^sketches/delete/$', 'asuzr.views.delete_sketch', name = 'asuzr-del-sketch'), url(r'^sketches/delete/$', 'asuzr.views.delete_sketch', name = 'asuzr-del-sketch'),
url(r'^prodplan/$', 'asuzr.views.prod_plan_view'), url(r'^prodplan/$', 'asuzr.views.prod_plan_view'),

View File

@@ -8,6 +8,22 @@
{% inplace_static %} {% inplace_static %}
<link rel="stylesheet" href="{{ STATIC_URL }}django_tables2/themes/paleblue/css/screen.css" /> <link rel="stylesheet" href="{{ STATIC_URL }}django_tables2/themes/paleblue/css/screen.css" />
<link rel="stylesheet" href="{{ STATIC_URL }}admin/css/base.css" /> <link rel="stylesheet" href="{{ STATIC_URL }}admin/css/base.css" />
<script type="text/javascript" src="/static/admin/js/admin/RelatedObjectLookups.js">
function showAddAnotherPopup(triggeringLink) {
var name = triggeringLink.id.replace(/^add_/, '');
name = id_to_windowname(name);
href = triggeringLink.href
if (href.indexOf('?') == -1) {
href += '?_popup=1';
} else {
href += '&_popup=1';
}
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes');
win.focus();
return false;
}
</script>
<style> <style>
#menu { #menu {
margin: 0; /* Обнуляем значение отступов */ margin: 0; /* Обнуляем значение отступов */

View File

@@ -3,8 +3,8 @@
{% load render_table from django_tables2 %} {% load render_table from django_tables2 %}
{% block page %} {% block page %}
<div class="inline" style="width:38%;"><div><h3>{{ table1.verbose_name }}</h3></div>{% render_table table1 %}</div> <div class="inline"><div><h3>{{ table1.verbose_name }}</h3></div>{% render_table table1 %}</div>
<div class="inline" style="width:20%;"><div><h3>{{ table2.verbose_name }}</h3></div>{% render_table table2 %}</div> <div class="inline"><div><h3>{{ table2.verbose_name }}</h3></div>{% render_table table2 %}</div>
{% if order_form %} {% if order_form %}
<form action="{% url 'add-order' %}" method="POST" > <form action="{% url 'add-order' %}" method="POST" >
{% csrf_token %} {% csrf_token %}

View File

@@ -2,6 +2,7 @@
{% load django_tables2 %} {% load django_tables2 %}
{% load i18n %} {% load i18n %}
{% block table.tbody %} {% block table.tbody %}
<tbody> <tbody>
{% for row in table.page.object_list|default:table.rows %} {# support pagination #} {% for row in table.page.object_list|default:table.rows %} {# support pagination #}
{% block table.tbody.row %} {% block table.tbody.row %}
@@ -18,21 +19,19 @@
{% endblock table.tbody.empty_text %} {% endblock table.tbody.empty_text %}
{% endif %} {% endif %}
{% endfor %} {% endfor %}
{% if model_form %} {% if add_form %}
<form action="{% url 'add-order' %}" method="POST" > {% if params %}
<form action="{% url form_action params %}" method="POST" >
{% else %}
<form action="{% url form_action %}" method="POST" >
{% endif %}
{% csrf_token %} {% csrf_token %}
<tr> <tr>
<td>{{model_form.product}}</td> {% for field in add_form %}
<td>{{model_form.price}}</td> <td>{{field}}</td>
<td>{{model_form.paid}}</td> {% endfor %}
<td>{{model_form.address}}</td>
<td></td>
<td>{{model_form.deadline}}</td>
<td>{{model_form.delivery}}</td>
<td>{{model_form.lifting}}</td>
</tr> </tr>
<tr> <tr>
<td></td><td></td><td></td><td></td><td></td><td></td><td></td>
<td><input type="submit" text="Добавить заказ"></td> <td><input type="submit" text="Добавить заказ"></td>
</tr> </tr>
</form> </form>