<templateSet group="Django snippets"> <template name="modeladmin" value="from django.contrib import admin from django.contrib.admin import ModelAdmin from $APP_NAME$.models import $MODEL_NAME$ @admin.register($MODEL_NAME$) class $MODEL_NAME$Admin(ModelAdmin): pass $END$" description="Create an empty ModelAdmin" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(groovyScript("return _1.replace('_admin.py', '')", fileName())))" defaultValue="" alwaysStopAt="false" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="manager" value="from django.db.models import Manager class $MODEL_NAME$Manager(Manager): def get_queryset(self): queryset = super().get_queryset() return queryset$END$ " description="Create a Manager class" toReformat="false" toShortenFQNames="true"> <variable name="MODEL_NAME" expression="capitalize(camelCase(groovyScript("return _1.replace('_manager.py', '')", fileName())))" defaultValue="" alwaysStopAt="false" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="factorytests" value="from django.test import TestCase from $APP_NAME$.models import $MODEL_NAME$ from $APP_NAME$.tests.factories import $MODEL_NAME$Factory class Test$MODEL_NAME$Factory(TestCase): def test_can_create_$MODEL_NAME_SNAKE_CASE$_factory(self): initial_$MODEL_NAME_SNAKE_CASE$_count = $MODEL_NAME$.objects.count() factory = $MODEL_NAME$Factory() factory.full_clean() $MODEL_NAME_SNAKE_CASE$_count = $MODEL_NAME$.objects.count() self.assertEqual($MODEL_NAME_SNAKE_CASE$_count, initial_$MODEL_NAME_SNAKE_CASE$_count + 1) $END$" description="Create basic tests for a DjangoModelFactory" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME_SNAKE_CASE" expression="groovyScript("return _1.split('_')[1..-2].join('_');", fileName())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(MODEL_NAME_SNAKE_CASE)) " defaultValue="" alwaysStopAt="false" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="admintests" value="from django.contrib import admin from django.contrib.admin import ModelAdmin from django.test import TestCase from django.urls import reverse from accounts.tests.factories import UserFactory from $APP_NAME$.models import $MODEL_NAME$ from $APP_NAME$.tests.factories import $MODEL_NAME$Factory from $APP_NAME$.admin import $MODEL_NAME$Admin class Test$MODEL_NAME$Admin(TestCase): @classmethod def setUpTestData(cls): cls.user = UserFactory(super_user=True) cls.$MODEL_NAME_SNAKE_CASE$s = $MODEL_NAME$Factory.create_batch($NUMBER_OF_OBJECTS$) def setUp(self): self.client.force_login(self.user) def test_config(self): self.assertTrue(issubclass($MODEL_NAME$Admin, ModelAdmin)) self.assertTrue(admin.site.is_registered($MODEL_NAME$)) def test_changelist(self): url = reverse("admin:$APP_NAME$_$MODEL_NAME_LOWER_CASE$_changelist") with self.assertNumQueries($NUMBER_OF_QUERIES$): response = self.client.get(url) self.assertEqual(200, response.status_code) def test_add(self): url = reverse("admin:$APP_NAME$_$MODEL_NAME_LOWER_CASE$_add") with self.assertNumQueries($NUMBER_OF_QUERIES$): response = self.client.get(url) self.assertEqual(200, response.status_code) def test_change(self): url = reverse("admin:$APP_NAME$_$MODEL_NAME_LOWER_CASE$_change", kwargs={"object_id": self.$MODEL_NAME_SNAKE_CASE$s[0].id}) with self.assertNumQueries($NUMBER_OF_QUERIES$): response = self.client.get(url) self.assertEqual(200, response.status_code) $END$" description="Create basic tests for a ModelAdmin" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(MODEL_NAME_SNAKE_CASE)) " defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME_SNAKE_CASE" expression="groovyScript("return _1.split('_')[1..-2].join('_');", fileName())," defaultValue="" alwaysStopAt="false" /> <variable name="NUMBER_OF_OBJECTS" expression="3" defaultValue="3" alwaysStopAt="true" /> <variable name="MODEL_NAME_LOWER_CASE" expression="groovyScript("return _1.replace('_', '')", MODEL_NAME_SNAKE_CASE)" defaultValue="" alwaysStopAt="false" /> <variable name="NUMBER_OF_QUERIES" expression="2" defaultValue="2" alwaysStopAt="true" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="charfield" value="$FIELD$ = models.CharField( max_length=$FIELD_LENGTH$, null=$FIELD_NULL$, blank=$FIELD_BLANK$, default=$FIELD_DEFAULT$, )" description="Create a CharField" toReformat="true" toShortenFQNames="true"> <variable name="FIELD" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_LENGTH" expression="" defaultValue=""254"" alwaysStopAt="true" /> <variable name="FIELD_NULL" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_BLANK" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_DEFAULT" expression="" defaultValue=""\"\""" alwaysStopAt="true" /> <context> <option name="Python_Class" value="true" /> </context> </template> <template name="choice" value="$CHOICE$ = "$CHOICE_VALUE$", _("$CHOICE_VERBOSE$")" description="Create a new choice for a TextChoices" toReformat="true" toShortenFQNames="true"> <variable name="CHOICE" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="CHOICE_VALUE" expression="snakeCase(CHOICE)" defaultValue="" alwaysStopAt="true" /> <variable name="CHOICE_VERBOSE" expression="spaceSeparated(lowercaseAndDash(CHOICE))" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python" value="true" /> </context> </template> <template name="choicefield" value="$FIELD$ = models.CharField( max_length=$FIELD_LENGTH$, null=$FIELD_NULL$, blank=$FIELD_BLANK$, choices=$FIELD_CHOICES$.choices, default=$FIELD_CHOICES$.$FIELD_DEFAULT$, )" description="Create a CharField with choices" toReformat="true" toShortenFQNames="true"> <variable name="FIELD" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_LENGTH" expression="" defaultValue=""25"" alwaysStopAt="true" /> <variable name="FIELD_NULL" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_BLANK" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_CHOICES" expression="capitalize(camelCase(FIELD))" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_DEFAULT" expression="" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Class" value="true" /> </context> </template> <template name="choices" value="class $CLASS$(models.TextChoices): $CHOICE$ = "$CHOICE_VALUE$", _("$CHOICE_VERBOSE$")$END$ " description="Create a new TextChoices class" toReformat="true" toShortenFQNames="true"> <variable name="CLASS" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="CHOICE" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="CHOICE_VALUE" expression="snakeCase(CHOICE)" defaultValue="" alwaysStopAt="true" /> <variable name="CHOICE_VERBOSE" expression="spaceSeparated(lowercaseAndDash(CHOICE))" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python" value="true" /> </context> </template> <template name="datefield" value="$FIELD$ = models.DateField( null=$FIELD_NULL$, blank=$FIELD_BLANK$, default=$FIELD_DEFAULT$, )" description="Create a date field" toReformat="true" toShortenFQNames="true"> <variable name="FIELD" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_NULL" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_BLANK" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FIELD_DEFAULT" expression="" defaultValue=""\"\""" alwaysStopAt="true" /> <context> <option name="Python_Class" value="true" /> </context> </template> <template name="foreignkey" value="$FOREIGN_KEY$ = models.ForeignKey( $FOREIGN_KEY_MODEL$, on_delete=models.$FOREIGN_KEY_ON_DELETE$, null=$FOREIGN_KEY_NULL$, blank=$FOREIGN_KEY_BLANK$, )" description="Create a ForeignKey field" toReformat="true" toShortenFQNames="true"> <variable name="FOREIGN_KEY" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="FOREIGN_KEY_MODEL" expression="capitalize(camelCase(FOREIGN_KEY))" defaultValue="" alwaysStopAt="true" /> <variable name="FOREIGN_KEY_ON_DELETE" expression="enum("CASCADE", "PROTECT", "RESTRICT", "SET", "SET_NULL", "SET_DEFAULT", "DO_NOTHING")" defaultValue=""CASCADE"" alwaysStopAt="true" /> <variable name="FOREIGN_KEY_NULL" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <variable name="FOREIGN_KEY_BLANK" expression="enum("False", "True")" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Class" value="true" /> </context> </template> <template name="gettext" value="from django.utils.translation import gettext as _ " description="import gettext as _" toReformat="true" toShortenFQNames="true"> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="gettextlazy" value="from django.utils.translation import gettext_lazy as _ " description="import gettext_lazy as _" toReformat="true" toShortenFQNames="true"> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="model" value="from django.db import models from django_extensions.db.models import TimeStampedModel from core.models import UUIDModel class $MODEL_NAME$(UUIDModel, TimeStampedModel): $END$ def __str__(self): return str(self.pk) " description="Create basic Django model" toReformat="true" toShortenFQNames="true"> <variable name="MODEL_NAME" expression="capitalize(camelCase(fileNameWithoutExtension()))" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="tostr" value="def __str__(self): return f"{self.$FIRST_ATTRIBUTE$} - {self.$SECOND_ATTRIBUTE$}"" description="Create a simple __str__ method" toReformat="false" toShortenFQNames="true"> <variable name="FIRST_ATTRIBUTE" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="SECOND_ATTRIBUTE" expression="" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Class" value="true" /> </context> </template> <template name="get_related_model_count_link" value="def get_$RELATED_MODEL_SNAKE_CASE$_count_link(self, obj): count = obj.$RELATED_MODEL_SNAKE_CASE$s.count() if count == 0: return "-" base_url = reverse("admin:$APP_NAME$_$RELATED_MODEL_LOWER$_changelist") url = base_url + f"?$MODEL_NAME_LOWER$__id__exact={obj.id}" return mark_safe(f"<a href='{url}'>{count} (see)</a>") get_$RELATED_MODEL_SNAKE_CASE$_count_link.short_description = "$RELATED_MODEL_STR$s" $END$" description="method that returns the count as a link that automatically filters related model in your ModelAdmin" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="RELATED_MODEL_SNAKE_CASE" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="RELATED_MODEL_LOWER" expression="groovyScript("return _1.replace('_', '')", RELATED_MODEL_SNAKE_CASE)" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME_LOWER" expression="groovyScript("return _1.replace('_admin.py', '').replace('_', '')", fileName())" defaultValue="" alwaysStopAt="false" /> <variable name="RELATED_MODEL_STR" expression="capitalize(underscoresToSpaces(RELATED_MODEL_SNAKE_CASE))" defaultValue="" alwaysStopAt="false" /> <context> <option name="Python_Class" value="true" /> </context> </template> <template name="serializertests" value="from django.test import TestCase from $APP_NAME$.serializers.$SERIALIZER_NAME_SNAKE_CASE$ import $SERIALIZER_NAME$ from $APP_NAME$.tests.factories import $MODEL_NAME$Factory class Test$SERIALIZER_NAME$(TestCase): @classmethod def setUpTestData(cls): cls.serializer = $SERIALIZER_NAME$ cls.$MODEL_NAME_SNAKE_CASE$ = $MODEL_NAME$Factory() cls.data = cls.serializer(cls.$MODEL_NAME_SNAKE_CASE$).data def test_contains_expected_fields(self): expected_keys = { "id", "$EXPECTED_FIELD_1$", $END$ } self.assertSetEqual(set(self.data.keys()), expected_keys) def test_returns_the_expected_values(self): self.assertEqual(self.data["id"], str(self.$MODEL_NAME_SNAKE_CASE$.id)) self.assertEqual(self.data["$EXPECTED_FIELD_1$"], self.user.$EXPECTED_FIELD_1$) " description="Create basic tests for a ModelSerializer" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="SERIALIZER_NAME" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="SERIALIZER_NAME_SNAKE_CASE" expression="snakeCase(SERIALIZER_NAME)" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(groovyScript("return _1.replace('test_','').replace('_serializer.py','')", fileName())))" defaultValue="" alwaysStopAt="true" /> <variable name="MODEL_NAME_SNAKE_CASE" expression="snakeCase(MODEL_NAME)" defaultValue="" alwaysStopAt="false" /> <variable name="EXPECTED_FIELD_1" expression="" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="modeltests" value="from django.test import TestCase from $APP_NAME$.models import $MODEL_NAME$ class Test$MODEL_NAME$(TestCase): @classmethod def setUpTestData(cls): cls.$MODEL_NAME_SNAKE_CASE$ = $MODEL_NAME$( $ATTRIBUTES$ ) def test_can_create_a_$MODEL_NAME_SNAKE_CASE$(self): self.$MODEL_NAME_SNAKE_CASE$.full_clean() self.$MODEL_NAME_SNAKE_CASE$.save() def test_can_print_a_$MODEL_NAME_SNAKE_CASE$(self): expected_str = "$EXPECTED_STR$" self.assertEqual(str(self.$MODEL_NAME_SNAKE_CASE$), expected_str) $END$" description="Create basic tests for a Model" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(MODEL_NAME_SNAKE_CASE)) " defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME_SNAKE_CASE" expression="groovyScript("return _1.replace('test_', '').replace('.py', '');", fileName())," defaultValue="" alwaysStopAt="false" /> <variable name="ATTRIBUTES" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="EXPECTED_STR" expression="""" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="factory" value="import factory from $APP_NAME$.models import $MODEL_NAME$ class $MODEL_NAME$Factory(factory.django.DjangoModelFactory): $END$ class Meta: model = $MODEL_NAME$ " description="Create a basic model factory" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(groovyScript("return _1.replace('_factory.py', '')", fileName())))" defaultValue="" alwaysStopAt="false" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="filterset" value="from django_filters.rest_framework import FilterSet from $APP_NAME$.models import $MODEL_NAME$ class $MODEL_NAME$Filter(FilterSet): class Meta: model = $MODEL_NAME$ fields = [ "$END$", ] " description="Create a basic filterset (requires the django-filters package)" toReformat="false" toShortenFQNames="true"> <variable name="APP_NAME" expression="groovyScript("return _1.split('/').take(1);", fileRelativePath())" defaultValue="" alwaysStopAt="false" /> <variable name="MODEL_NAME" expression="capitalize(camelCase(groovyScript("return _1.replace('_filters.py', '')", fileName())))" defaultValue="" alwaysStopAt="false" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> <template name="simplelistfilter" value="from django.contrib.admin import SimpleListFilter from django.utils.translation import gettext as _ class $FILTER_NAME_CAMEL_CASE$Filter(SimpleListFilter): title = _("$FILTER_NAME$") parameter_name = "$FILTER_NAME_SNAKE_CASE$" def lookups(self, request, model_admin): return ( ("$LOOKUP_VALUE$", _("$LOOKUP_VALUE_CAPITALIZED$")),$END$ ) def queryset(self, request, queryset): if self.value() == "$LOOKUP_VALUE$": return queryset.filter($FILTER_NAME_SNAKE_CASE_EDITABLE$=True) else: return queryset " description="Create a basic SimpleListFilter" toReformat="false" toShortenFQNames="true"> <variable name="FILTER_NAME_CAMEL_CASE" expression="capitalize(camelCase(FILTER_NAME))" defaultValue="" alwaysStopAt="false" /> <variable name="FILTER_NAME" expression="groovyScript("return _1.replace('_filter.py', '')", fileName())" defaultValue="" alwaysStopAt="false" /> <variable name="FILTER_NAME_SNAKE_CASE" expression="snakeCase(FILTER_NAME)" defaultValue="" alwaysStopAt="false" /> <variable name="LOOKUP_VALUE" expression="" defaultValue="" alwaysStopAt="true" /> <variable name="LOOKUP_VALUE_CAPITALIZED" expression="capitalize(spaceSeparated(LOOKUP_VALUE))" defaultValue="" alwaysStopAt="false" /> <variable name="FILTER_NAME_SNAKE_CASE_EDITABLE" expression="FILTER_NAME_SNAKE_CASE" defaultValue="" alwaysStopAt="true" /> <context> <option name="Python_Top_Level" value="true" /> </context> </template> </templateSet>