Split out create and duplicate templates, got both working

This commit is contained in:
Matthew Smith
2019-10-05 14:59:15 +01:00
parent a4adc8bc7b
commit 3aa3498d3a
4 changed files with 215 additions and 46 deletions

View File

@@ -0,0 +1,187 @@
{% extends 'base_assets.html' %}
{% load widget_tweaks %}
{% load asset_templatetags %}
{% block title %}Asset {{ object.asset_id }}{% endblock %}
{% block content %}
<div class="page-header">
<h1>
{% if duplicate %}
Duplication of Asset: {{ previous_asset_id }}
{% else %}
Create Asset
{% endif %}
</h1>
</div>
{% if duplicate %}
<form method="post" id="asset_update_form" action="{% url 'asset_duplicate' pk=previous_asset_pk%}">
{% else %}
<form method="post" id="asset_update_form" action="{% url 'asset_create'%}">
{% endif %}
<div class="row" style="padding-bottom: 1em">
<div class="col-sm-12">
<div class="pull-right">
{% include 'partials/asset_buttons.html' %}
</div>
</div>
</div>
{% csrf_token %}
<input type="hidden" name="id" value="{{ object.id|default:0 }}" hidden=true>
<div class="row">
<div class="col-sm-12">
<div class="panel panel-default">
<div class="panel-heading">
Asset Details
</div>
<div class="panel-body">
<div class="form-group"
<label for="{{ form.asset_id.id_for_label }}">Asset ID</label>
{% render_field form.asset_id|add_class:'form-control' value=object.asset_id %}
</div>
<div class="form-group">
<label for="{{ form.description.id_for_label }}">Description</label>
{% render_field form.description|add_class:'form-control' value=object.description %}
</div>
<div class="form-group">
<label for="{{ form.category.id_for_label }}" >Category</label>
<select name="{{ form.category.name }}" id="{{ form.category.id_for_label }}" required class="form-control">
{% for id, choice in form.category.field.choices %}
<option value="{{ id }}"
{% if object.category.id == id %}
selected
{% endif %}>
{{ choice }}
</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<label for="{{ form.status.id_for_label }}" >Status</label>
<select class="form-control" name="{{ form.status.name }}" id="{{ form.status.id_for_label }}" required>
{% for id, choice in form.status.field.choices %}
<option value="{{ id }}"
{% if not object.status.id and choice == "Active" or object.status.id == id %}selected{% endif %}>{{ choice }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<label for="{{ form.serial_number.id_for_label }}">Serial Number</label>
{% render_field form.serial_number|add_class:'form-control' value=object.serial_number %}
</div>
<!---TODO: Lower default number of lines in comments box-->
<div class="form-group">
<label for="{{ form.comments.id_for_label }}">Comments</label>
{% render_field form.comments|add_class:'form-control' %}
</div>
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
Purchase Details
</div>
<div class="panel-body">
<div class="form-group">
<label for="{{ form.purchased_from.id_for_label }}">Purchased From</label>
<select class="form-control" name="{{ form.purchased_from.name }}" id="{{ form.purchased_from.id_for_label }}">
{% for id, choice in form.purchased_from.field.choices %}
<option value="{{ id }}"
{% if object.purchased_from.id == id %}
selected
{% endif %}>
{{ choice }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<label for="{{ form.purchase_price.id_for_label }}">Purchase Price</label>
<div class="input-group">
<span class="input-group-addon">£</span>
{% render_field form.purchase_price|add_class:'form-control' value=object.purchase_price %}
</div>
</div>
<div class="form-group">
<label for="{{ form.salvage_value.id_for_label }}">Salvage Value</label>
<div class="input-group">
<span class="input-group-addon">£</span>
{% render_field form.salvage_value|add_class:'form-control' value=object.salvage_value %}
</div>
</div>
<div class="form-group">
<label for="{{ form.date_acquired.id_for_label }}" >Date Acquired</label>
{% if object.date_acquired%}
{% with date_acq=object.date_acquired|date:"Y-m-d" %}
{% render_field form.date_acquired|add_class:'form-control'|attr:'type="date"' value=date_acq %}
{% endwith %}
{% else %}
<input type="date" name="date_acquired" value="{% now "Y-m-d" %}"
class="form-control" id="id_date_acquired">
{% endif %}
</div>
<div class="form-group">
<label for="{{ form.date_sold.id_for_label }}">Date Sold</label>
{% with date_sol=object.form.date_sold|date:"Y-m-d" %}
{% render_field form.date_sold|add_class:'form-control'|attr:'type="date"' value=date_sol %}
{% endwith %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="panel panel-default">
<div class="panel-heading">
Collection Details
</div>
<div class="panel-body">
<div class="form-group">
<label for="parent_id">Parent</label>
<input type="hidden" name="{{ form.parent.html_name }}" id="hidden_parent_id" value="{{ object.parent.id }}">
<div class="input-group">
<input type="text" id="parent_id" value="{{ object.parent|default:'' }}" disabled="" class="form-control">
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="clearParent()">Clear</button>
</span>
</div>
</div>
<div class="form-group">
<label for="parent_search">Search for asset</label>
<div class="input-group">
<input type="text" id="parent_search" class="form-control">
<span class="input-group-btn">
<button type="button" class="btn btn-default" onclick="formAssetSearch()">
<i class="glyphicon glyphicon-search"></i> Search
</button>
</span>
</div>
</div>
<div class="col s2">
<br>
</div>
<div class="col s12" id="formAssetSearchResult">
<!--Placeholder for search results-->
</div>
</div>
</div>
</div>
<div class="row">
<div class="col-md-12">
{% include 'partials/asset_buttons.html' %}
</div>
</div>
</div>
</div>
</form>
{% include 'partials/confirm_delete.html' with object=object %}
{% endblock %}

View File

@@ -14,7 +14,7 @@
{% else %}
<!--detail view-->
<a href="{% url 'asset_update' object.pk %}" class="btn btn-default"><i class="glyphicon glyphicon-edit"></i> Edit</a>
<a class="btn btn-default" href="{% url 'asset_update' object.pk %}?duplicate=true"><i class="glyphicon glyphicon-duplicate"></i> Duplicate</a>
<a class="btn btn-default" href="{% url 'asset_duplicate' object.pk %}"><i class="glyphicon glyphicon-duplicate"></i> Duplicate</a>
<a class="btn btn-danger" data-toggle="modal" data-target="#confirm_delete_modal"><i class="glyphicon glyphicon-trash"></i> Delete</a>
{% endif %}
</div>

View File

@@ -12,8 +12,8 @@ urlpatterns = [
path('asset/<int:pk>/', views.AssetDetail.as_view(), name='asset_detail'),
path('asset/create/', views.AssetCreate.as_view(), name='asset_create'),
path('asset/<int:pk>/edit/', views.AssetEdit.as_view(), name='asset_update'),
path('asset/<int:pk>/duplicate/', views.AssetDuplicate.as_view(), name='asset_duplicate'),
path('asset/delete/', views.asset_delete, name='ajax_asset_delete'),
path('asset/update/', views.asset_update, name='ajax_asset_update'),
path('supplier/list', views.SupplierList.as_view(), name='supplier_list'),
path('supplier/<int:pk>', views.SupplierDetail.as_view(), name='supplier_detail'),

View File

@@ -65,67 +65,49 @@ class AssetEdit(LoginRequiredMixin, generic.UpdateView):
context['form'] = forms.AssetForm
# context['asset_names'] = models.Asset.objects.values_list('asset_id', 'description').order_by('-date_acquired')[]
if self.request.GET.get('duplicate'):
context['duplicate'] = True
context['previous_asset_id'] = context['object'].asset_id
context['previous_asset_pk'] = context['object'].pk
context['object'].pk = 0
context['object'].asset_id = ''
context['object'].serial_number = ''
else:
context['edit'] = True
context['edit'] = True
return context
def form_invalid(self, form):
print(form.errors)
return super().form_invalid(form)
def get_success_url(self):
return reverse("asset_detail", kwargs={"pk":self.object.id})
class AssetCreate(LoginRequiredMixin, generic.CreateView):
template_name = 'asset_update.html'
template_name = 'asset_create.html'
model = models.Asset
form_class = forms.AssetForm
def get_context_data(self, **kwargs):
context = super(AssetCreate, self).get_context_data(**kwargs)
context["create"] = True
return context
def get_success_url(self):
return reverse("asset_detail", kwargs={"pk":self.object.id})
@login_required()
def asset_update(request):
context = dict()
class DuplicateMixin:
def get(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.pk = None
return self.render_to_response(self.get_context_data())
if request.method == 'POST' and request.is_ajax():
defaults = QueryDict(request.POST['form'].encode('ASCII')).dict()
defaults.pop('csrfmiddlewaretoken')
asset_pk = int(defaults.pop('id'))
if defaults['date_acquired']:
defaults['date_acquired'] = parser.parse(defaults.pop('date_acquired'))
else:
defaults['date_acquired'] = None
if defaults['date_sold']:
defaults['date_sold'] = parser.parse(defaults.pop('date_sold'))
else:
defaults['date_sold'] = None
# if defaults['parent']:
# defaults['parent'] = models.Asset.objects.get(asset_id=defaults.pop('parent'))
form = forms.AssetForm(defaults)
context['valid'] = form.is_valid()
context['errors'] = form.errors.as_json()
if asset_pk == 0:
asset = models.Asset.objects.create(**form.cleaned_data)
else:
asset, created = models.Asset.objects.update_or_create(pk=asset_pk, defaults=form.cleaned_data)
context['url'] = reverse('asset_detail', args=[asset.pk])
return HttpResponse(json.dumps(context), content_type='application/json')
class AssetDuplicate(DuplicateMixin, AssetCreate):
template_name = 'asset_create.html'
model = models.Asset
form_class = forms.AssetForm
def get_context_data(self, **kwargs):
context = super(AssetCreate, self).get_context_data(**kwargs)
context["create"] = None
context["duplicate"] = True
context['previous_asset_id'] = self.get_object().asset_id
context["previous_asset_pk"] = pk = self.kwargs.get(self.pk_url_kwarg)
return context
@login_required()
def asset_delete(request):