CRUD and ordering

This commit is contained in:
2020-02-18 18:00:03 +00:00
parent 386fec1f01
commit c60771e613
9 changed files with 165 additions and 50 deletions

View File

@@ -23,10 +23,15 @@ class SupplierAdmin(admin.ModelAdmin):
@admin.register(assets.Asset) @admin.register(assets.Asset)
class AssetAdmin(admin.ModelAdmin): class AssetAdmin(admin.ModelAdmin):
list_display = ['id', 'asset_id', 'description', 'category', 'status'] list_display = ['id', 'asset_id', 'description', 'category', 'status']
list_filter = ['is_cable', 'category'] list_filter = ['is_cable', 'category', 'status']
search_fields = ['id', 'asset_id', 'description'] search_fields = ['id', 'asset_id', 'description']
@admin.register(assets.CableType)
class CableTypeAdmin(admin.ModelAdmin):
list_display = ['id', '__str__', 'plug', 'socket', 'cores', 'circuits']
@admin.register(assets.Connector) @admin.register(assets.Connector)
class ConnectorAdmin(admin.ModelAdmin): class ConnectorAdmin(admin.ModelAdmin):
list_display = ['id', '__str__', 'current_rating', 'voltage_rating', 'num_pins'] list_display = ['id', '__str__', 'current_rating', 'voltage_rating', 'num_pins']

View File

@@ -34,3 +34,9 @@ class SupplierForm(forms.ModelForm):
class SupplierSearchForm(forms.Form): class SupplierSearchForm(forms.Form):
query = forms.CharField(required=False) query = forms.CharField(required=False)
class CableTypeForm(forms.ModelForm):
class Meta:
model = models.CableType
fields = '__all__'

View File

@@ -3,6 +3,7 @@ from django.core.exceptions import ValidationError
from django.db import models, connection from django.db import models, connection
from django.urls import reverse from django.urls import reverse
from django.db.models import F
from django.db.models.signals import pre_save from django.db.models.signals import pre_save
from django.dispatch.dispatcher import receiver from django.dispatch.dispatcher import receiver
@@ -67,6 +68,9 @@ class Connector(models.Model):
class CableType(models.Model): class CableType(models.Model):
class Meta:
ordering = ['plug', 'socket', '-circuits']
circuits = models.IntegerField(blank=True, null=True) circuits = models.IntegerField(blank=True, null=True)
cores = models.IntegerField(blank=True, null=True) cores = models.IntegerField(blank=True, null=True)
plug = models.ForeignKey(Connector, on_delete=models.SET_NULL, plug = models.ForeignKey(Connector, on_delete=models.SET_NULL,
@@ -75,7 +79,7 @@ class CableType(models.Model):
related_name='socket', blank=True, null=True) related_name='socket', blank=True, null=True)
def __str__(self): def __str__(self):
return self.plug.description + "--->" + self.socket.description return "%s%s" % (self.plug.description, self.socket.description)
@reversion.register @reversion.register
@@ -139,7 +143,7 @@ class Asset(models.Model, RevisionMixin):
def __str__(self): def __str__(self):
out = str(self.asset_id) + ' - ' + self.description out = str(self.asset_id) + ' - ' + self.description
if self.is_cable: if self.is_cable:
out += '{} - {}m - {}'.format(self.plug, self.length, self.socket) out += '{} - {}m - {}'.format(self.cable_type.plug, self.length, self.cable_type.socket)
return out return out
def clean(self): def clean(self):
@@ -164,14 +168,16 @@ class Asset(models.Model, RevisionMixin):
errdict["length"] = ["The length of a cable must be more than 0"] errdict["length"] = ["The length of a cable must be more than 0"]
if not self.csa or self.csa <= 0: if not self.csa or self.csa <= 0:
errdict["csa"] = ["The CSA of a cable must be more than 0"] errdict["csa"] = ["The CSA of a cable must be more than 0"]
if not self.circuits or self.circuits <= 0: if not self.cable_type:
errdict["circuits"] = ["There must be at least one circuit in a cable"] errdict["cable_type"] = ["A cable must have a type"]
if not self.cores or self.cores <= 0: # if not self.circuits or self.circuits <= 0:
errdict["cores"] = ["There must be at least one core in a cable"] # errdict["circuits"] = ["There must be at least one circuit in a cable"]
if self.socket is None: # if not self.cores or self.cores <= 0:
errdict["socket"] = ["A cable must have a socket"] # errdict["cores"] = ["There must be at least one core in a cable"]
if self.plug is None: # if self.socket is None:
errdict["plug"] = ["A cable must have a plug"] # errdict["socket"] = ["A cable must have a socket"]
# if self.plug is None:
# errdict["plug"] = ["A cable must have a plug"]
if errdict != {}: # If there was an error when validation if errdict != {}: # If there was an error when validation
raise ValidationError(errdict) raise ValidationError(errdict)

View File

@@ -1,12 +1,11 @@
{% extends 'base_assets.html' %} {% extends 'base_assets.html' %}
{% load widget_tweaks %} {% load widget_tweaks %}
{% block title %}Asset {{ object.asset_id }}{% endblock %} {% block title %}Cable Type{% endblock %}
{% block content %} {% block content %}
<div class="page-header"> <div class="page-header">
<h1> <h1>
Create Cable Type {% if create %}Create{% elif edit %}Edit{% endif %} Cable Type
</h1> </h1>
</div> </div>
<form method="post" id="asset_update_form" action="{% url 'asset_create'%}"> <form method="post" id="asset_update_form" action="{% url 'asset_create'%}">
@@ -15,6 +14,7 @@
<input type="hidden" name="id" value="{{ object.id|default:0 }}" hidden=true> <input type="hidden" name="id" value="{{ object.id|default:0 }}" hidden=true>
<div class="row"> <div class="row">
<div class="col-sm-12"> <div class="col-sm-12">
{% if create or edit %}
<div class="form-group"> <div class="form-group">
<label for="{{ form.plug.id_for_label }}">Plug</label> <label for="{{ form.plug.id_for_label }}">Plug</label>
{% render_field form.plug|add_class:'form-control'%} {% render_field form.plug|add_class:'form-control'%}
@@ -31,6 +31,26 @@
<label for="{{ form.cores.id_for_label }}">Cores</label> <label for="{{ form.cores.id_for_label }}">Cores</label>
{% render_field form.cores|add_class:'form-control' value=object.cores %} {% render_field form.cores|add_class:'form-control' value=object.cores %}
</div> </div>
<div class="pull-left">
<button type="submit" class="btn btn-success"><i class="glyphicon glyphicon-floppy-disk"></i> Save</button>
<br>
<button type="reset" class="btn btn-link">Cancel</button>
</div>
{% else %}
<dl>
<dt>Socket</dt>
<dd>{{ object.socket|default_if_none:'-' }}</dd>
<dt>Plug</dt>
<dd>{{ object.plug|default_if_none:'-' }}</dd>
<dt>Circuits</dt>
<dd>{{ object.circuits|default_if_none:'-' }}</dd>
<dt>Cores</dt>
<dd>{{ object.cores|default_if_none:'-' }}</dd>
</dl>
{% endif %}
</div> </div>
</div> </div>
</form> </form>

View File

@@ -0,0 +1,41 @@
{% extends 'base_assets.html' %}
{% block title %}Supplier List{% endblock %}
{% load paginator from filters %}
{% load widget_tweaks %}
{% block content %}
<div class="page-header">
<h1>Cable Type List</h1>
</div>
<table class="table table-striped">
<thead>
<tr>
<th>Cable Type</th>
<th>Circuits</th>
<th>Cores</th>
<th>Quick Links</th>
</tr>
</thead>
<tbody>
{% for item in object_list %}
<tr>
<td>{{ item }}</td>
<td>{{ item.circuits }}</td>
<td>{{ item.cores }}</td>
<td>
<a href="{% url 'cable_type_detail' item.pk %}" class="btn btn-default"><i class="glyphicon glyphicon-eye-open"></i> View</a>
<a href="{% url 'cable_type_update' item.pk %}" class="btn btn-default"><i class="glyphicon glyphicon-edit"></i> Edit</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if is_paginated %}
<div class="text-center">
{% paginator %}
</div>
{% endif %}
{% endblock %}

View File

@@ -9,7 +9,6 @@
<label for="{{ form.cable_type.id_for_label }}">Cable Type</label> <label for="{{ form.cable_type.id_for_label }}">Cable Type</label>
<div class="input-group"> <div class="input-group">
{% render_field form.cable_type|add_class:'form-control' %} {% render_field form.cable_type|add_class:'form-control' %}
<span class="input-group-addon">{{ form.length.help_text }}</span>
</div> </div>
</div> </div>
<div class="form-group"> <div class="form-group">
@@ -28,23 +27,14 @@
</div> </div>
{% else %} {% else %}
<dl> <dl>
<dt>Socket</dt> <dt>Cable Type</dt>
<dd>{{ object.socket|default_if_none:'-' }}</dd> <dd>{{ object.cable_type|default_if_none:'-' }}</dd>
<dt>Plug</dt>
<dd>{{ object.plug|default_if_none:'-' }}</dd>
<dt>Length</dt> <dt>Length</dt>
<dd>{{ object.length|default_if_none:'-' }}m</dd> <dd>{{ object.length|default_if_none:'-' }}m</dd>
<dt>Cross Sectional Area</dt> <dt>Cross Sectional Area</dt>
<dd>{{ object.csa|default_if_none:'-' }}m^2</dd> <dd>{{ object.csa|default_if_none:'-' }}m</dd>
<dt>Circuits</dt>
<dd>{{ object.circuits|default_if_none:'-' }}</dd>
<dt>Cores</dt>
<dd>{{ object.cores|default_if_none:'-' }}</dd>
</dl> </dl>
{% endif %} {% endif %}
</div> </div>

View File

@@ -22,6 +22,11 @@ urlpatterns = [
path('activity', permission_required_with_403('assets.view_asset') path('activity', permission_required_with_403('assets.view_asset')
(views.ActivityTable.as_view()), name='asset_activity_table'), (views.ActivityTable.as_view()), name='asset_activity_table'),
path('cabletype/list/', permission_required_with_403('assets.view_cable_type')(views.CableTypeList.as_view()), name='cable_type_list'),
path('cabletype/create/', permission_required_with_403('assets.add_cable_type')(views.CableTypeCreate.as_view()), name='cable_type_create'),
path('cabletype/<int:pk>/update/', permission_required_with_403('assets.change_cable_type')(views.CableTypeUpdate.as_view()), name='cable_type_update'),
path('cabletype/<int:pk>/detail/', permission_required_with_403('assets.view_cable_type')(views.CableTypeDetail.as_view()), name='cable_type_detail'),
path('asset/search/', views.AssetSearch.as_view(), name='asset_search_json'), path('asset/search/', views.AssetSearch.as_view(), name='asset_search_json'),
path('asset/id/<str:pk>/embed/', path('asset/id/<str:pk>/embed/',
xframe_options_exempt( xframe_options_exempt(

View File

@@ -252,3 +252,38 @@ class ActivityTable(versioning.ActivityTable):
versions = versioning.RIGSVersion.objects.get_for_multiple_models( versions = versioning.RIGSVersion.objects.get_for_multiple_models(
[models.Asset, models.Supplier]) [models.Asset, models.Supplier])
return versions return versions
class CableTypeList(generic.ListView):
model = models.CableType
template_name = 'cable_type_list.html'
paginate_by = 40
# ordering = ['__str__']
class CableTypeDetail(generic.DetailView):
model = models.CableType
template_name = 'cable_type_form.html'
class CableTypeCreate(generic.CreateView):
model = models.CableType
template_name = "cable_type_form.html"
form_class = forms.CableTypeForm
def get_context_data(self, **kwargs):
context = super(CableTypeCreate, self).get_context_data(**kwargs)
context["create"] = True
return context
class CableTypeUpdate(generic.UpdateView):
model = models.CableType
template_name = "cable_type_form.html"
form_class = forms.CableTypeForm
def get_context_data(self, **kwargs):
context = super(CableTypeUpdate, self).get_context_data(**kwargs)
context["edit"] = True
return context

View File

@@ -10,29 +10,36 @@
{% endblock %} {% endblock %}
{% block titleelements %} {% block titleelements %}
{# % if perms.assets.view_asset % #} <li class="dropdown">
<li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Assets<b class="caret"></b></a>
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Assets<b class="caret"></b></a> <ul class="dropdown-menu">
<ul class="dropdown-menu"> <li><a href="{% url 'asset_list' %}"><span class="glyphicon glyphicon-list"></span> List Assets</a></li>
<li><a href="{% url 'asset_list' %}"><span class="glyphicon glyphicon-list"></span> List Assets</a></li> {% if perms.assets.add_asset %}
{% if perms.assets.add_asset %} <li><a href="{% url 'asset_create' %}"><span class="glyphicon glyphicon-plus"></span> Create Asset</a></li>
<li><a href="{% url 'asset_create' %}"><span class="glyphicon glyphicon-plus"></span> Create Asset</a></li> {% endif %}
{% endif %}
</ul> </ul>
</li> </li>
{# % endif % #} <li class="dropdown">
{# % if perms.assets.view_supplier % #} <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Suppliers<b class="caret"></b></a>
<li class="dropdown"> <ul class="dropdown-menu">
<a href="#" class="dropdown-toggle" data-toggle="dropdown"> Suppliers<b class="caret"></b></a> <li><a href="{% url 'supplier_list' %}"><span class="glyphicon glyphicon-list"></span>
<ul class="dropdown-menu"> List Suppliers</a></li>
<li><a href="{% url 'supplier_list' %}"><span class="glyphicon glyphicon-list"></span> {% if perms.assets.add_supplier %}
List Suppliers</a></li> <li><a href="{% url 'supplier_create' %}"><span class="glyphicon glyphicon-plus"></span> Create Supplier</a></li>
{% if perms.assets.add_supplier %} {% endif %}
<li><a href="{% url 'supplier_create' %}"><span class="glyphicon glyphicon-plus"></span> Create Supplier</a></li> </ul>
{% endif %} </li>
</ul> <li class="dropdown">
</li> <a href="#" class="dropdown-toggle" data-toggle="dropdown"> Cable Types<b class="caret"></b></a>
{# % endif % #} <ul class="dropdown-menu">
<li><a href="{% url 'cable_type_list' %}"><span class="glyphicon glyphicon-list"></span>
List Cable Types</a></li>
{% if perms.assets.add_cable_type %}
<li><a href="{% url 'cable_type_create' %}"><span class="glyphicon glyphicon-plus"></span> Create Cable Type</a></li>
{% endif %}
</ul>
</li>
{% if perms.assets.view_asset %} {% if perms.assets.view_asset %}
<li><a href="{% url 'asset_activity_table' %}">Recent Changes</a></li> <li><a href="{% url 'asset_activity_table' %}">Recent Changes</a></li>
{% endif %} {% endif %}