# Pinpoint
Simple project, in which it is possible to make a report to a specific location
+
+
+planned upcoming Features:
+
+- [ ] Recursive Categories
+- [ ] User Management
+ - User can be grouped
+ - Groups have change access to categories
+ - maybe groups enable creation of subcategories
+- [ ] Sending Mails
+- [ ] Open311 Compliance
+
# Register your models here.
-from .models import Report
+from .models import Category, Report
admin.site.register(Report)
+admin.site.register(Category)
--- /dev/null
+# Generated by Django 5.1.4 on 2024-12-21 13:30
+
+import django.db.models.deletion
+import georeport.models
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('georeport', '0002_report_state'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='Category',
+ fields=[
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('name', models.CharField(max_length=100)),
+ ],
+ ),
+ migrations.AlterField(
+ model_name='report',
+ name='description',
+ field=models.CharField(blank=True, max_length=255, null=True),
+ ),
+ migrations.AddField(
+ model_name='report',
+ name='category',
+ field=models.ForeignKey(default=georeport.models.get_default_related, on_delete=django.db.models.deletion.RESTRICT, to='georeport.category'),
+ ),
+ ]
+from asyncio import wait
from django.db import models
from django.forms import ModelForm
# Create your models here.
+class Category(models.Model):
+ name = models.CharField(max_length=100)
+
+ def __str__(self):
+ return self.name
+
+
+def get_default_related():
+ def get_default_related():
+ return Category.objects.first().id
+
+
class Report(models.Model):
class State(models.IntegerChoices):
NEW = 0
creation_time = models.DateTimeField(auto_now_add=True)
# TODO last change shall be set to creation_time at creation_time
last_change = models.DateTimeField(auto_now=True)
- description = models.CharField(max_length=255, null=True)
+ description = models.CharField(max_length=255, null=True, blank=True)
latitude = models.DecimalField(max_digits=8, decimal_places=6)
longitude = models.DecimalField(max_digits=9, decimal_places=6)
state = models.IntegerField(choices=State, default=0)
+ category = models.ForeignKey(
+ Category, on_delete=models.RESTRICT, default=get_default_related
+ )
# TODO add status
#
class ReportForm(ModelForm):
class Meta:
model = Report
- fields = ["title", "description", "latitude", "longitude"]
+ fields = ["title", "description", "latitude", "longitude", "category"]
--- /dev/null
+
+{% extends "georeport/base.html" %}
+{% load static %}
+{% block title %}Detail {{ category.id }} {% endblock %}
+{% block body %}
+ <h1>Categoriy {{ category.id }}</h1>
+ <p>Name: {{ category.name }}</p>
+ <a href="{% url 'index' %}">Back</a>
+{% endblock %}
<p id="p-lat" data-lat="{{ report.latitude }}">Latitude: {{ report.latitude }}</p>
<p id="p-lng" data-lng="{{ report.longitude }}">Longitude: {{ report.longitude }}</p>
<p>Status: {{ report.get_state_display }} </p>
+ <p>Kategorie: {{ report.category }} </p>
<a href="{% url 'index' %}">Back</a>
<script src="{% static 'georeport/details.js' %}"></script>
{% endblock %}
{% endfor %}
</ul>
+<h2>Categories</h2>
+<ul>
+ {% for category in category_list %}
+ <li><a href="category/{{ category.id }}">{{ category.name }}</a></li>
+ {% endfor %}
+</ul>
+
{% endblock %}
path("", views.index, name="index"),
path("<int:id>", views.details, name="detail"),
path("create", views.create, name="create"),
+ path("category/<int:id>", views.category_details, name="category"),
]
# Create your views here.
-from .models import Report, ReportForm
+from .models import Category, Report, ReportForm
def index(request):
reports = Report.objects.all()
- return render(request, "georeport/index.html", context={"report_list": reports})
+ categories = Category.objects.all()
+ return render(
+ request,
+ "georeport/index.html",
+ context={"report_list": reports, "category_list": categories},
+ )
def details(request, id):
return render(request, "georeport/detail.html", context={"report": report})
+def category_details(request, id):
+ category = get_object_or_404(Category, pk=id)
+ return render(request, "georeport/category.html", context={"category": category})
+
+
def create(request):
if request.method == "POST":
reportForm = ReportForm(request.POST)