chore(material/*): reformat using ruff (#15)

mk-personal-profile
Christian Merten 2 weeks ago committed by GitHub
parent c072f5caf2
commit 9ffb6b33bb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

@ -1,15 +1,15 @@
from django.contrib import admin from django.contrib import admin
from django.utils.translation import gettext_lazy as _
from django.contrib.admin import SimpleListFilter from django.contrib.admin import SimpleListFilter
from django.db import models from django.utils.translation import gettext_lazy as _
from django import forms
from .models import MaterialPart, Ownership, MaterialCategory from .models import MaterialCategory
#from easy_select2 import apply_select2 from .models import MaterialPart
from .models import Ownership
# from easy_select2 import apply_select2
class MaterialCategoryAdmin(admin.ModelAdmin): class MaterialCategoryAdmin(admin.ModelAdmin):
fields = ['name'] fields = ["name"]
# Register your models here. # Register your models here.
@ -18,42 +18,50 @@ class OwnershipInline(admin.TabularInline):
This shows the ownership selection directly in the MaterialPart edit This shows the ownership selection directly in the MaterialPart edit
view view
""" """
model = Ownership model = Ownership
extra = 0 extra = 0
#formfield_overrides = { # formfield_overrides = {
# models.ForeignKey: {'widget': apply_select2(forms.Select)} # models.ForeignKey: {'widget': apply_select2(forms.Select)}
#} # }
class NotTooOldFilter(SimpleListFilter): class NotTooOldFilter(SimpleListFilter):
title = _('Age') title = _("Age")
parameter_name = 'age' parameter_name = "age"
def lookups(self, request, model_admin): def lookups(self, request, model_admin):
return ( return (
('too_old', _('Not too old')), ("too_old", _("Not too old")),
('not_too_old', _('Too old')), ("not_too_old", _("Too old")),
) )
def queryset(self, request, queryset): def queryset(self, request, queryset):
if self.value() == 'too_old': if self.value() == "too_old":
return queryset.filter(pk__in=[x.pk for x in queryset.all() if x.not_too_old()]) return queryset.filter(pk__in=[x.pk for x in queryset.all() if x.not_too_old()])
if self.value() == 'not_too_old': if self.value() == "not_too_old":
return queryset.filter(pk__in=[x.pk for x in queryset.all() if not x.not_too_old()]) return queryset.filter(pk__in=[x.pk for x in queryset.all() if not x.not_too_old()])
class MaterialAdmin(admin.ModelAdmin): class MaterialAdmin(admin.ModelAdmin):
"""Edit view of a MaterialPart""" """Edit view of a MaterialPart"""
list_display = ('name', 'description', 'quantity_real', list_display = (
'ownership_overview', 'buy_date', "name",
'lifetime', 'not_too_old', 'admin_thumbnail') "description",
search_fields = ('name', 'description') "quantity_real",
"ownership_overview",
"buy_date",
"lifetime",
"not_too_old",
"admin_thumbnail",
)
search_fields = ("name", "description")
inlines = [OwnershipInline] inlines = [OwnershipInline]
list_filter = (NotTooOldFilter, 'material_cat', 'ownership__owner') list_filter = (NotTooOldFilter, "material_cat", "ownership__owner")
#formfield_overrides = { # formfield_overrides = {
# models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple} # models.ManyToManyField: {'widget': forms.CheckboxSelectMultiple}
#} # }
admin.site.register(MaterialCategory, MaterialCategoryAdmin) admin.site.register(MaterialCategory, MaterialCategoryAdmin)

@ -3,5 +3,5 @@ from django.utils.translation import gettext_lazy as _
class MaterialConfig(AppConfig): class MaterialConfig(AppConfig):
name = 'material' name = "material"
verbose_name = _('material') verbose_name = _("material")

@ -39,4 +39,4 @@
"quantity": "2" "quantity": "2"
} }
} }
] ]

@ -13,14 +13,15 @@ class MaterialCategory(models.Model):
""" """
Describes one kind of material Describes one kind of material
""" """
name = models.CharField(max_length=40, verbose_name=_('Name'))
name = models.CharField(max_length=40, verbose_name=_("Name"))
def __str__(self): def __str__(self):
return self.name return self.name
class Meta: class Meta:
verbose_name = _('Material category') verbose_name = _("Material category")
verbose_name_plural = _('Material categories') verbose_name_plural = _("Material categories")
# Create your models here. # Create your models here.
@ -29,14 +30,16 @@ class MaterialPart(models.Model):
Represents one part of material, which is owned (and stored) by different Represents one part of material, which is owned (and stored) by different
members of the association (Ownership) members of the association (Ownership)
""" """
name = models.CharField(_('name'), max_length=30)
description = models.CharField(_('description'), default='', max_length=140) name = models.CharField(_("name"), max_length=30)
quantity = models.IntegerField(_('quantity'), default=0) description = models.CharField(_("description"), default="", max_length=140)
buy_date = models.DateField(_('purchase date'), editable=True) quantity = models.IntegerField(_("quantity"), default=0)
lifetime = models.DecimalField(_('lifetime (years)'), decimal_places=0, max_digits=3) buy_date = models.DateField(_("purchase date"), editable=True)
photo = models.ImageField(_('photo'), upload_to='images', blank=True) lifetime = models.DecimalField(_("lifetime (years)"), decimal_places=0, max_digits=3)
material_cat = models.ManyToManyField(MaterialCategory, default=None, photo = models.ImageField(_("photo"), upload_to="images", blank=True)
verbose_name=_('Material category')) material_cat = models.ManyToManyField(
MaterialCategory, default=None, verbose_name=_("Material category")
)
def __str__(self): def __str__(self):
"""String representation""" """String representation"""
@ -44,53 +47,59 @@ class MaterialPart(models.Model):
def quantity_real(self): def quantity_real(self):
real = sum([o.count for o in Ownership.objects.filter(material__id=self.pk)]) real = sum([o.count for o in Ownership.objects.filter(material__id=self.pk)])
return str(real) + '/' + str(self.quantity) return str(real) + "/" + str(self.quantity)
quantity_real.admin_order_field = 'quantity' quantity_real.admin_order_field = "quantity"
quantity_real.short_description = _('Quantity') quantity_real.short_description = _("Quantity")
def admin_thumbnail(self): def admin_thumbnail(self):
if self.photo: if self.photo:
return format_html('<a href="{0}"><img src="{0}" height="60" style="image-orientation: from-image;"></a>'.format(self.photo.url)) return format_html(
'<a href="{0}"><img src="{0}" height="60" style="image-orientation: from-image;"></a>'.format(
self.photo.url
)
)
else: else:
return format_html('<i>kein Bild</i>') return format_html("<i>kein Bild</i>")
admin_thumbnail.short_description = _('Thumbnail')
admin_thumbnail.short_description = _("Thumbnail")
def ownership_overview(self): def ownership_overview(self):
summary = '' summary = ""
for owner in self.ownership_set.all(): for owner in self.ownership_set.all():
summary += '<p>{}: {}</p>'.format(str(owner.owner), owner.count) summary += "<p>{}: {}</p>".format(str(owner.owner), owner.count)
return format_html(summary) return format_html(summary)
ownership_overview.short_description = _('Owners')
ownership_overview.short_description = _("Owners")
def not_too_old(self): def not_too_old(self):
"""Returns wether the part should be replaced cause of age""" """Returns wether the part should be replaced cause of age"""
buy_time = timezone.make_aware(datetime.combine(self.buy_date, buy_time = timezone.make_aware(datetime.combine(self.buy_date, datetime.min.time()))
datetime.min.time()))
return yearsago(self.lifetime) < buy_time return yearsago(self.lifetime) < buy_time
not_too_old.admin_order_field = 'buy_date' not_too_old.admin_order_field = "buy_date"
not_too_old.boolean = True not_too_old.boolean = True
not_too_old.short_description = _('Not too old?') not_too_old.short_description = _("Not too old?")
class Meta: class Meta:
verbose_name = _('material part') verbose_name = _("material part")
verbose_name_plural = _('material parts') verbose_name_plural = _("material parts")
class Ownership(models.Model): class Ownership(models.Model):
"""Represents the connection between a MaterialPart and a Member""" """Represents the connection between a MaterialPart and a Member"""
material = models.ForeignKey(MaterialPart, on_delete=models.CASCADE) material = models.ForeignKey(MaterialPart, on_delete=models.CASCADE)
owner = models.ForeignKey('members.Member', verbose_name=_('owner'), on_delete=models.CASCADE) owner = models.ForeignKey("members.Member", verbose_name=_("owner"), on_delete=models.CASCADE)
count = models.IntegerField(_('count'), default=1) count = models.IntegerField(_("count"), default=1)
def __str__(self): def __str__(self):
"""String representation""" """String representation"""
return str(self.owner) return str(self.owner)
class Meta: class Meta:
verbose_name = _('ownership') verbose_name = _("ownership")
verbose_name_plural = _('ownerships') verbose_name_plural = _("ownerships")
def yearsago(years, from_date=None): def yearsago(years, from_date=None):

@ -1,11 +1,20 @@
from django.test import TestCase, RequestFactory from datetime import date
from django.utils import timezone from datetime import datetime
from datetime import date, datetime
from decimal import Decimal from decimal import Decimal
from unittest.mock import Mock from unittest.mock import Mock
from material.models import MaterialCategory, MaterialPart, Ownership, yearsago
from material.admin import NotTooOldFilter, MaterialAdmin from django.test import RequestFactory
from members.models import Member, MALE, FEMALE, DIVERSE from django.test import TestCase
from django.utils import timezone
from material.admin import MaterialAdmin
from material.admin import NotTooOldFilter
from material.models import MaterialCategory
from material.models import MaterialPart
from material.models import Ownership
from material.models import yearsago
from members.models import FEMALE
from members.models import MALE
from members.models import Member
class MaterialCategoryTestCase(TestCase): class MaterialCategoryTestCase(TestCase):
@ -19,8 +28,8 @@ class MaterialCategoryTestCase(TestCase):
def test_verbose_names(self): def test_verbose_names(self):
"""Test verbose names are set correctly""" """Test verbose names are set correctly"""
meta = MaterialCategory._meta meta = MaterialCategory._meta
self.assertTrue(hasattr(meta, 'verbose_name')) self.assertTrue(hasattr(meta, "verbose_name"))
self.assertTrue(hasattr(meta, 'verbose_name_plural')) self.assertTrue(hasattr(meta, "verbose_name_plural"))
class MaterialPartTestCase(TestCase): class MaterialPartTestCase(TestCase):
@ -31,7 +40,7 @@ class MaterialPartTestCase(TestCase):
description="60m dynamic climbing rope", description="60m dynamic climbing rope",
quantity=5, quantity=5,
buy_date=date(2020, 1, 15), buy_date=date(2020, 1, 15),
lifetime=Decimal('8') lifetime=Decimal("8"),
) )
self.material_part.material_cat.add(self.category) self.material_part.material_cat.add(self.category)
@ -40,7 +49,7 @@ class MaterialPartTestCase(TestCase):
lastname="Doe", lastname="Doe",
birth_date=date(1990, 1, 1), birth_date=date(1990, 1, 1),
email="john@example.com", email="john@example.com",
gender=MALE gender=MALE,
) )
def test_str(self): def test_str(self):
@ -54,27 +63,27 @@ class MaterialPartTestCase(TestCase):
def test_quantity_real_with_ownership(self): def test_quantity_real_with_ownership(self):
"""Test quantity_real with ownership records""" """Test quantity_real with ownership records"""
Ownership.objects.create( Ownership.objects.create(material=self.material_part, owner=self.member, count=3)
material=self.material_part, Ownership.objects.create(material=self.material_part, owner=self.member, count=1)
owner=self.member,
count=3
)
Ownership.objects.create(
material=self.material_part,
owner=self.member,
count=1
)
result = self.material_part.quantity_real() result = self.material_part.quantity_real()
self.assertEqual(result, "4/5") self.assertEqual(result, "4/5")
def test_verbose_names(self): def test_verbose_names(self):
"""Test field verbose names""" """Test field verbose names"""
# Just test that verbose names exist, since they might be translated # Just test that verbose names exist, since they might be translated
field_names = ['name', 'description', 'quantity', 'buy_date', 'lifetime', 'photo', 'material_cat'] field_names = [
"name",
"description",
"quantity",
"buy_date",
"lifetime",
"photo",
"material_cat",
]
for field_name in field_names: for field_name in field_names:
field = self.material_part._meta.get_field(field_name) field = self.material_part._meta.get_field(field_name)
self.assertTrue(hasattr(field, 'verbose_name')) self.assertTrue(hasattr(field, "verbose_name"))
self.assertIsNotNone(field.verbose_name) self.assertIsNotNone(field.verbose_name)
def test_admin_thumbnail_with_photo(self): def test_admin_thumbnail_with_photo(self):
@ -104,7 +113,7 @@ class MaterialPartTestCase(TestCase):
# Set a buy_date that makes the material old # Set a buy_date that makes the material old
old_date = date(2000, 1, 1) old_date = date(2000, 1, 1)
self.material_part.buy_date = old_date self.material_part.buy_date = old_date
self.material_part.lifetime = Decimal('5') self.material_part.lifetime = Decimal("5")
result = self.material_part.not_too_old() result = self.material_part.not_too_old()
self.assertFalse(result) self.assertFalse(result)
@ -117,7 +126,7 @@ class OwnershipTestCase(TestCase):
description="Lightweight aluminum carabiners", description="Lightweight aluminum carabiners",
quantity=10, quantity=10,
buy_date=date(2021, 6, 1), buy_date=date(2021, 6, 1),
lifetime=Decimal('10') lifetime=Decimal("10"),
) )
self.member = Member.objects.create( self.member = Member.objects.create(
@ -125,13 +134,11 @@ class OwnershipTestCase(TestCase):
lastname="Smith", lastname="Smith",
birth_date=date(1985, 3, 15), birth_date=date(1985, 3, 15),
email="alice@example.com", email="alice@example.com",
gender=FEMALE gender=FEMALE,
) )
self.ownership = Ownership.objects.create( self.ownership = Ownership.objects.create(
material=self.material_part, material=self.material_part, owner=self.member, count=6
owner=self.member,
count=6
) )
def test_ownership_creation(self): def test_ownership_creation(self):
@ -183,8 +190,11 @@ class NotTooOldFilterTestCase(TestCase):
# Create test data # Create test data
self.member = Member.objects.create( self.member = Member.objects.create(
prename="Test", lastname="User", birth_date=date(1990, 1, 1), prename="Test",
email="test@example.com", gender=MALE lastname="User",
birth_date=date(1990, 1, 1),
email="test@example.com",
gender=MALE,
) )
# Create old material (should be too old) # Create old material (should be too old)
@ -193,7 +203,7 @@ class NotTooOldFilterTestCase(TestCase):
description="Old material", description="Old material",
quantity=1, quantity=1,
buy_date=date(2000, 1, 1), # Very old buy_date=date(2000, 1, 1), # Very old
lifetime=Decimal('5') lifetime=Decimal("5"),
) )
# Create new material (should not be too old) # Create new material (should not be too old)
@ -202,21 +212,21 @@ class NotTooOldFilterTestCase(TestCase):
description="New material", description="New material",
quantity=1, quantity=1,
buy_date=date.today(), # Today buy_date=date.today(), # Today
lifetime=Decimal('10') lifetime=Decimal("10"),
) )
def test_not_too_old_filter_lookups(self): def test_not_too_old_filter_lookups(self):
"""Test NotTooOldFilter lookups method""" """Test NotTooOldFilter lookups method"""
request = self.factory.get('/') request = self.factory.get("/")
lookups = self.filter.lookups(request, None) lookups = self.filter.lookups(request, None)
self.assertEqual(len(lookups), 2) self.assertEqual(len(lookups), 2)
self.assertEqual(lookups[0][0], 'too_old') self.assertEqual(lookups[0][0], "too_old")
self.assertEqual(lookups[1][0], 'not_too_old') self.assertEqual(lookups[1][0], "not_too_old")
def test_not_too_old_filter_queryset_too_old(self): def test_not_too_old_filter_queryset_too_old(self):
"""Test NotTooOldFilter queryset method with 'too_old' value""" """Test NotTooOldFilter queryset method with 'too_old' value"""
request = self.factory.get('/?age=too_old') request = self.factory.get("/?age=too_old")
self.filter.used_parameters = {'age': 'too_old'} self.filter.used_parameters = {"age": "too_old"}
queryset = MaterialPart.objects.all() queryset = MaterialPart.objects.all()
filtered = self.filter.queryset(request, queryset) filtered = self.filter.queryset(request, queryset)
@ -227,8 +237,8 @@ class NotTooOldFilterTestCase(TestCase):
def test_not_too_old_filter_queryset_not_too_old(self): def test_not_too_old_filter_queryset_not_too_old(self):
"""Test NotTooOldFilter queryset method with 'not_too_old' value""" """Test NotTooOldFilter queryset method with 'not_too_old' value"""
request = self.factory.get('/?age=not_too_old') request = self.factory.get("/?age=not_too_old")
self.filter.used_parameters = {'age': 'not_too_old'} self.filter.used_parameters = {"age": "not_too_old"}
queryset = MaterialPart.objects.all() queryset = MaterialPart.objects.all()
filtered = self.filter.queryset(request, queryset) filtered = self.filter.queryset(request, queryset)

Loading…
Cancel
Save