From 207bf7bd7a984fa519e5ca1fa59f5852b3e4725b Mon Sep 17 00:00:00 2001 From: Matthew Smith Date: Wed, 2 Oct 2019 21:12:24 +0100 Subject: [PATCH] Added dependency django-polymorphic Model change to take advantage of said polymorphism Implemented asset search --- assets/migrations/0008_auto_20191002_1931.py | 98 ++++++++++++++++++++ assets/models.py | 13 +-- assets/static/js/ajax_form.js | 16 ---- assets/templates/asset_list.html | 13 +-- assets/urls.py | 1 - assets/views.py | 51 +++------- requirements.txt | 1 + 7 files changed, 118 insertions(+), 75 deletions(-) create mode 100644 assets/migrations/0008_auto_20191002_1931.py diff --git a/assets/migrations/0008_auto_20191002_1931.py b/assets/migrations/0008_auto_20191002_1931.py new file mode 100644 index 00000000..5a33befa --- /dev/null +++ b/assets/migrations/0008_auto_20191002_1931.py @@ -0,0 +1,98 @@ +# Generated by Django 2.0.13 on 2019-10-02 18:31 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0002_remove_content_type_name'), + ('assets', '0007_auto_20190108_0202'), + ] + + operations = [ + migrations.AlterModelOptions( + name='asset', + options={'base_manager_name': 'objects'}, + ), + migrations.AlterModelOptions( + name='cable', + options={'base_manager_name': 'objects'}, + ), + migrations.RemoveField( + model_name='asset', + name='length', + ), + migrations.RemoveField( + model_name='cable', + name='asset_id', + ), + migrations.RemoveField( + model_name='cable', + name='category', + ), + migrations.RemoveField( + model_name='cable', + name='comments', + ), + migrations.RemoveField( + model_name='cable', + name='date_acquired', + ), + migrations.RemoveField( + model_name='cable', + name='date_sold', + ), + migrations.RemoveField( + model_name='cable', + name='description', + ), + migrations.RemoveField( + model_name='cable', + name='id', + ), + migrations.RemoveField( + model_name='cable', + name='is_cable', + ), + migrations.RemoveField( + model_name='cable', + name='next_sched_maint', + ), + migrations.RemoveField( + model_name='cable', + name='parent', + ), + migrations.RemoveField( + model_name='cable', + name='purchase_price', + ), + migrations.RemoveField( + model_name='cable', + name='purchased_from', + ), + migrations.RemoveField( + model_name='cable', + name='salvage_value', + ), + migrations.RemoveField( + model_name='cable', + name='serial_number', + ), + migrations.RemoveField( + model_name='cable', + name='status', + ), + migrations.AddField( + model_name='asset', + name='polymorphic_ctype', + field=models.ForeignKey(editable=False, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='polymorphic_assets.asset_set+', to='contenttypes.ContentType'), + ), + migrations.AddField( + model_name='cable', + name='asset_ptr', + field=models.OneToOneField(auto_created=True, default=0, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='assets.Asset'), + preserve_default=False, + ), + ] diff --git a/assets/models.py b/assets/models.py index b95f45de..37a57628 100644 --- a/assets/models.py +++ b/assets/models.py @@ -1,5 +1,6 @@ from django.db import models from django.urls import reverse +from polymorphic.models import PolymorphicModel import datetime @@ -36,9 +37,7 @@ class Supplier(models.Model): return self.name -class BaseAsset(models.Model): - class Meta: - abstract = True +class Asset(PolymorphicModel): parent = models.ForeignKey(to='self', related_name='asset_parent', blank=True, null=True, on_delete=models.SET_NULL) asset_id = models.CharField(max_length=10) @@ -56,7 +55,6 @@ class BaseAsset(models.Model): # Cable assets is_cable = models.BooleanField(default=False) - length = models.DecimalField(decimal_places=1, max_digits=10, blank=True, null=True) def get_absolute_url(self): return reverse('asset_detail', kwargs={'pk': self.pk}) @@ -64,11 +62,6 @@ class BaseAsset(models.Model): def __str__(self): return str(self.asset_id) + ' - ' + self.description - -class Asset(BaseAsset): - pass - - class Connector(models.Model): description = models.CharField(max_length=80) current_rating = models.DecimalField(decimal_places=2, max_digits=10, help_text='Amps') @@ -79,7 +72,7 @@ class Connector(models.Model): return self.description -class Cable(BaseAsset): +class Cable(Asset): plug = models.ForeignKey(Connector, on_delete=models.SET_NULL, related_name='plug', null=True) socket = models.ForeignKey(Connector, on_delete=models.SET_NULL, related_name='socket', null=True) length = models.DecimalField(decimal_places=1, max_digits=10, blank=True, null=True, help_text='m') diff --git a/assets/static/js/ajax_form.js b/assets/static/js/ajax_form.js index b9b06e25..f4ffcf43 100644 --- a/assets/static/js/ajax_form.js +++ b/assets/static/js/ajax_form.js @@ -1,20 +1,4 @@ -function filterAssetTable() { - $.ajax({ - url : "/asset/filter/", // the endpoint - type : "POST", // http method - data : { - form: $('#asset-filter-form').serialize() - }, - traditional: true, - success : function(data) { - // console.log(data); - $('#asset_table_body').html(data) - }, - - error : function(xhr) {console.log(xhr.status + ": " + xhr.responseText)} - }); -} diff --git a/assets/templates/asset_list.html b/assets/templates/asset_list.html index ded3e939..4f40d576 100644 --- a/assets/templates/asset_list.html +++ b/assets/templates/asset_list.html @@ -8,10 +8,10 @@

Asset List

-
+ {% csrf_token %}
- +
@@ -40,12 +40,5 @@ {% endblock %} -{% block script %} - +{% block js %} {% endblock %} diff --git a/assets/urls.py b/assets/urls.py index 68727f9f..dcdf5569 100644 --- a/assets/urls.py +++ b/assets/urls.py @@ -13,7 +13,6 @@ urlpatterns = [ path('asset/create/', views.AssetEdit.as_view(), name='asset_create'), path('asset//edit/', views.AssetEdit.as_view(), name='asset_update'), path('asset/delete/', views.asset_delete, name='ajax_asset_delete'), - path('asset/filter/', views.asset_filter, name='ajax_asset_filter'), path('asset/update/', views.asset_update, name='ajax_asset_update'), path('supplier/list', views.SupplierList.as_view(), name='supplier_list'), diff --git a/assets/views.py b/assets/views.py index bebb6482..ba6e8b58 100644 --- a/assets/views.py +++ b/assets/views.py @@ -13,27 +13,24 @@ from dateutil import parser import simplejson as json from assets import models, forms - -class Login(auth_views.LoginView): - template_name = 'registration/login.html' - - -class Logout(auth_views.LogoutView): - template_name = 'registration/logout.html' - - -class PasswordChange(auth_views.PasswordChangeView): - template_name = 'registration/password_change.html' - - def get_success_url(self): - return reverse_lazy('profile_detail', kwargs={'pk': self.request.user.id}) - class AssetList(LoginRequiredMixin, generic.ListView): model = models.Asset template_name = 'asset_list.html' paginate_by = 40 ordering = ['-pk'] - + + def get_queryset(self): + q = self.request.GET.get('q', "") + if len(q) >= 3: + return self.model.objects.filter(Q(asset_id__icontains=q) | Q(description__icontains=q) | Q(comments__icontains=q)) + else: + return self.model.objects.all() + + def get_context_data(self, **kwargs): + q = self.request.GET.get('q', "") + context = super(AssetList, self).get_context_data(**kwargs) + context["searchName"] = q + return context; class AssetDetail(LoginRequiredMixin, generic.DetailView): model = models.Asset @@ -45,7 +42,6 @@ class AssetDetail(LoginRequiredMixin, generic.DetailView): # template_name = 'asset_update.html' # # success_url = reverse_lazy('asset_list') - class AssetEdit(LoginRequiredMixin, generic.TemplateView): template_name = 'asset_update.html' @@ -68,7 +64,6 @@ class AssetEdit(LoginRequiredMixin, generic.TemplateView): return context - @login_required() def asset_update(request): context = dict() @@ -117,26 +112,6 @@ def asset_delete(request): return HttpResponse(json.dumps(context), content_type='application/json') - -@login_required() -def asset_filter(request): - context = dict() - - if request.method == 'POST' and request.is_ajax(): - defaults = QueryDict(request.POST['form'].encode('ASCII')).dict() - defaults.pop('csrfmiddlewaretoken') - - context['object_list'] = models.Asset.objects.filter( - Q(pk__icontains=defaults.get('asset_id')) | - Q(asset_id__icontains=defaults.get('asset_id')) - ) - - if request.POST.get('sender', None) == 'asset_update': - return render(request, template_name='asset_update_search_results.html', context=context) - else: - return render(request, template_name='asset_list_table_body.html', context=context) - - class SupplierList(generic.ListView): model = models.Supplier template_name = 'supplier_list.html' diff --git a/requirements.txt b/requirements.txt index 8e71022d..6cb60466 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ django-recaptcha==1.4.0 django-registration-redux==2.4 django-reversion==2.0.13 django-toolbelt==0.0.1 +django-polymorphic==2.1.2 djangorestframework==3.9.0 premailer==3.2.0 git+git://github.com/jazzband/django-widget-tweaks.git@1.4.2