From e9476dc4952f4bb55aea144b952515e7a40921d0 Mon Sep 17 00:00:00 2001 From: Senad Uka Date: Thu, 6 Feb 2025 11:24:19 +0100 Subject: [PATCH] Add document --- backend/core/admin.py | 20 +++- backend/core/models.py | 141 +++++++++++---------------- backend/core/templates/document.html | 90 +++++++++++++++++ backend/core/urls.py | 2 + templates/document.html | 90 +++++++++++++++++ 5 files changed, 256 insertions(+), 87 deletions(-) create mode 100644 backend/core/templates/document.html create mode 100644 templates/document.html diff --git a/backend/core/admin.py b/backend/core/admin.py index 8c38f3f..365be69 100644 --- a/backend/core/admin.py +++ b/backend/core/admin.py @@ -1,3 +1,21 @@ from django.contrib import admin +from .models import Document, DocumentSegment, Organization -# Register your models here. +class DocumentSegmentInline(admin.StackedInline): + model = DocumentSegment + extra = 1 + ordering = ['order'] + fields = ('segment_type', 'content', 'order') + +class DocumentAdmin(admin.ModelAdmin): + inlines = [DocumentSegmentInline] + list_display = ('organization', 'created_at', 'modified_at') + search_fields = ['organization__name'] + readonly_fields = ('created_at', 'modified_at') + +class OrganizationAdmin(admin.ModelAdmin): + list_display = ('name', 'email', 'industry_sector') + search_fields = ['name', 'email'] + +admin.site.register(Document, DocumentAdmin) +admin.site.register(Organization, OrganizationAdmin) diff --git a/backend/core/models.py b/backend/core/models.py index efecb82..c39655c 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -3,6 +3,7 @@ import uuid from django.contrib.auth.models import User from django.db import models from localflavor.br.br_states import STATE_CHOICES +from django.contrib import admin class UuidModel(models.Model): @@ -41,92 +42,6 @@ class CreatedBy(models.Model): abstract = True -class Address(models.Model): - address = models.CharField( - 'endereço', - max_length=100, - null=True, - blank=True - ) - address_number = models.IntegerField('número', null=True, blank=True) - complement = models.CharField( - 'complemento', - max_length=100, - null=True, - blank=True - ) - district = models.CharField( - 'bairro', - max_length=100, - null=True, - blank=True - ) - city = models.CharField('cidade', max_length=100, null=True, blank=True) - uf = models.CharField( - 'UF', - max_length=2, - choices=STATE_CHOICES, - null=True, - blank=True - ) - cep = models.CharField('CEP', max_length=9, null=True, blank=True) - country = models.CharField( - 'país', - max_length=50, - default='Brasil', - null=True, - blank=True - ) - - class Meta: - abstract = True - - def to_dict_base(self): - return { - 'address': self.address, - 'address_number': self.address_number, - 'complement': self.complement, - 'district': self.district, - 'city': self.city, - 'uf': self.uf, - 'cep': self.cep, - } - - -class Document(models.Model): - cpf = models.CharField( - 'CPF', - max_length=11, - unique=True, - null=True, - blank=True - ) - rg = models.CharField('RG', max_length=11, null=True, blank=True) - cnh = models.CharField('CNH', max_length=20, null=True, blank=True) - - class Meta: - abstract = True - - def to_dict_base(self): - return { - 'cpf': self.cpf, - 'rg': self.rg, - 'cnh': self.cnh, - } - - -class Active(models.Model): - active = models.BooleanField('ativo', default=True) - exist_deleted = models.BooleanField( - 'existe/deletado', - default=True, - help_text='Se for True o item existe. Se for False o item foi deletado.' - ) - - class Meta: - abstract = True - - class Organization(models.Model): name = models.CharField(max_length=255) email = models.EmailField() @@ -155,3 +70,57 @@ class Organization(models.Model): return self.name +class DocumentSegment(models.Model): + SEGMENT_TYPES = ( + ('title', 'Title'), + ('subtitle', 'Subtitle'), + ('h1', 'Header 1'), + ('h2', 'Header 2'), + ('h3', 'Header 3'), + ('body', 'Body Text'), + ('quote', 'Quote') + ) + + document = models.ForeignKey('Document', on_delete=models.CASCADE, related_name='segments') + segment_type = models.CharField(max_length=20, choices=SEGMENT_TYPES) + content = models.TextField() + order = models.PositiveIntegerField() + modified_at = models.DateTimeField(auto_now=True) + + class Meta: + ordering = ['order'] + + def __str__(self): + return f"{self.get_segment_type_display()} - {self.content[:50]}" + + +class Document(models.Model): + organization = models.ForeignKey(Organization, on_delete=models.CASCADE, related_name='documents') + created_at = models.DateTimeField(auto_now_add=True) + modified_at = models.DateTimeField(auto_now=True) + + def __str__(self): + return f"Document for {self.organization.name}" + + def add_segment(self, segment_type, content, position=None): + """ + Add a new segment at the specified position. + If position is None, append to the end. + """ + if position is None: + # Get the highest order and add 1 + last_order = self.segments.aggregate(models.Max('order'))['order__max'] + new_order = 1 if last_order is None else last_order + 1 + else: + # Move all segments at and after the position up by 1 + self.segments.filter(order__gte=position).update(order=models.F('order') + 1) + new_order = position + + return self.segments.create( + segment_type=segment_type, + content=content, + order=new_order + ) + + + diff --git a/backend/core/templates/document.html b/backend/core/templates/document.html new file mode 100644 index 0000000..49de32c --- /dev/null +++ b/backend/core/templates/document.html @@ -0,0 +1,90 @@ +% extends 'base.html' %} + +{% block content %} +
+
+

{{ organization.name }}

+
+

Created: {{ document.created_at|date:"F j, Y" }}

+

Last modified: {{ document.modified_at|date:"F j, Y" }}

+
+
+ +
+ {% for segment in segments %} + {% if segment.segment_type == 'title' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'subtitle' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'h1' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'h2' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'h3' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'quote' %} +
{{ segment.content }}
+ {% else %} +

{{ segment.content }}

+ {% endif %} + {% endfor %} +
+
+ + +{% endblock %} \ No newline at end of file diff --git a/backend/core/urls.py b/backend/core/urls.py index 1f7eb69..7250eda 100644 --- a/backend/core/urls.py +++ b/backend/core/urls.py @@ -8,4 +8,6 @@ urlpatterns = [ path('', v.index, name='index'), path('signup/', v.signup, name='signup'), path('thankyou/', v.thankyou, name='thankyou'), + # url document/ recieves a parameter named 'uuid' and passes it to the view + path('document//', v.document, name='document'), ] diff --git a/templates/document.html b/templates/document.html new file mode 100644 index 0000000..2dfeea3 --- /dev/null +++ b/templates/document.html @@ -0,0 +1,90 @@ +{% extends 'base.html' %} + +{% block content %} +
+
+

{{ organization.name }}

+
+

Created: {{ document.created_at|date:"F j, Y" }}

+

Last modified: {{ document.modified_at|date:"F j, Y" }}

+
+
+ +
+ {% for segment in segments %} + {% if segment.segment_type == 'title' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'subtitle' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'h1' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'h2' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'h3' %} +

{{ segment.content }}

+ {% elif segment.segment_type == 'quote' %} +
{{ segment.content }}
+ {% else %} +

{{ segment.content }}

+ {% endif %} + {% endfor %} +
+
+ + +{% endblock %} \ No newline at end of file