commit e08aac9aad6a1a5b95201289ad87deed586f3b04 Author: Jeff MacKinnon Date: Tue Nov 21 15:08:11 2023 -0400 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..690fe81 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +django_tags* \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/MANIFEST.in b/MANIFEST.in new file mode 100644 index 0000000..dae0c2f --- /dev/null +++ b/MANIFEST.in @@ -0,0 +1,4 @@ +include LICENSE +include README.md +recursive-include docs * +recursive-include tags/templates * diff --git a/README.md b/README.md new file mode 100644 index 0000000..b8cce36 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# Jeff Django tags + +This is a simple app that allows us to create tags and then tag any entity within the project. \ No newline at end of file diff --git a/dist/django-tags-0.1.tar.gz b/dist/django-tags-0.1.tar.gz new file mode 100644 index 0000000..d0db614 Binary files /dev/null and b/dist/django-tags-0.1.tar.gz differ diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..c515c82 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,3 @@ +[build-system] +requires = ['setuptools>=40.8.0'] +build-backend = 'setuptools.build_meta' \ No newline at end of file diff --git a/setup.cfg b/setup.cfg new file mode 100644 index 0000000..de2db7d --- /dev/null +++ b/setup.cfg @@ -0,0 +1,33 @@ +[metadata] +name = django-tags +version = 0.1 +description = A Django app to tag entities. +long_description = file: readme.md +url = https://www.jeffmackinnon.com/pages/apps.html +author = Jeff MacKinnon +author_email = jeff@fastmail.in +license = BSD-3-Clause +classifiers = + Environment :: Web Environment + Framework :: Django + Framework :: Django :: 4.2 + Intended Audience :: Developers + License :: OSI Approved :: BSD License + Operating System :: OS Independent + Programming Language :: Python + Programming Language :: Python :: 3 + Programming Language :: Python :: 3 :: Only + Programming Language :: Python :: 3.8 + Programming Language :: Python :: 3.9 + Programming Language :: Python :: 3.10 + Programming Language :: Python :: 3.11 + Programming Language :: Python :: 3.12 + Topic :: Internet :: WWW/HTTP + Topic :: Internet :: WWW/HTTP :: Dynamic Content + +[options] +include_package_data = true +packages = find: +python_requires = >=3.8 +install_requires = + Django >= 4.2 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..fc1f76c --- /dev/null +++ b/setup.py @@ -0,0 +1,3 @@ +from setuptools import setup + +setup() \ No newline at end of file diff --git a/tags/__init__.py b/tags/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tags/admin.py b/tags/admin.py new file mode 100644 index 0000000..cee8e6e --- /dev/null +++ b/tags/admin.py @@ -0,0 +1,13 @@ +from django.contrib import admin +from . import models + +# Register your models here. + +@admin.register(models.Tag) +class TagAdmin(admin.ModelAdmin): + list_display = ['label', 'type'] + list_editable = ['type'] + +@admin.register(models.TaggedItem) +class TaggedAdmin(admin.ModelAdmin): + list_display = ['tag', 'content_type', 'content_object', 'tagged'] diff --git a/tags/apps.py b/tags/apps.py new file mode 100644 index 0000000..77cbbb0 --- /dev/null +++ b/tags/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class TagsConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'tags' diff --git a/tags/forms.py b/tags/forms.py new file mode 100644 index 0000000..ff4c66b --- /dev/null +++ b/tags/forms.py @@ -0,0 +1,9 @@ +from django import forms +from .models import Tag + +class TagForm(forms.ModelForm): + + class Meta: + model = Tag + fields = ['label', 'type'] + labels = {'label':'New Tag', 'type':'Tag Type'} diff --git a/tags/models.py b/tags/models.py new file mode 100644 index 0000000..6181aa1 --- /dev/null +++ b/tags/models.py @@ -0,0 +1,29 @@ +from django.db import models +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes.fields import GenericForeignKey + + +# Create your models here. + +class Tag(models.Model): + label = models.CharField(max_length=255) + type = models.CharField(max_length=255, default=None, null=True, blank=True) + + def __str__(self) -> str: + return self.label + + + +class TaggedItem(models.Model): + """ + This keeps track of the generic items that are tagged and when they were tagged. + + The time is important because when a profile is tagged + Public and then is changed to -> Private all information past that point is not going to be shared. + + """ + tag = models.ForeignKey(Tag, on_delete=models.CASCADE) + content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) + object_id = models.PositiveIntegerField() + content_object = GenericForeignKey() + tagged = models.DateTimeField(auto_now_add=True) diff --git a/tags/templates/tags/list.html b/tags/templates/tags/list.html new file mode 100644 index 0000000..eee3984 --- /dev/null +++ b/tags/templates/tags/list.html @@ -0,0 +1,10 @@ +{% block content %} +

All the tags

+ + + +{% endblock %} \ No newline at end of file diff --git a/tags/tests.py b/tags/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/tags/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/tags/urls.py b/tags/urls.py new file mode 100644 index 0000000..e64fb3e --- /dev/null +++ b/tags/urls.py @@ -0,0 +1,11 @@ +from django.urls import path +from . import views + +urlpatterns = [ + path('', views.TagsListView.as_view(), name="tags.list"), + # path('tags/', views.TagsDetailView.as_view(), name="tags.detail"), + #path('tags//edit', views.TagsUpdateView.as_view(), name="tags.update"), + #path('tags//delete', views.TagsDeleteView.as_view(), name="tags.delete"), + #path('tags/new', views.TagsCreateView.as_view(), name="tags.new"), + + ] diff --git a/tags/views.py b/tags/views.py new file mode 100644 index 0000000..d1d6c20 --- /dev/null +++ b/tags/views.py @@ -0,0 +1,14 @@ +from django.shortcuts import render +from django.views.generic import ListView + +from .models import Tag +#from .forms import TagForm + +# Create your views here. +class TagsListView(ListView): + model = Tag + + def get(self, request, *args, **kwargs): + tags = Tag.objects.all() + context = {'tags':tags} + return render(request, 'tags/list.html', context) \ No newline at end of file