Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Django models #89

Open
Semprini opened this issue Aug 23, 2024 · 2 comments
Open

Django models #89

Semprini opened this issue Aug 23, 2024 · 2 comments
Assignees
Labels
enhancement New feature or request

Comments

@Semprini
Copy link
Owner

from django.utils.translation import gettext_lazy as _
from django.db import models


class AuditableModel(models.Model):
    last_updated_by = models.CharField( max_length=50 )
    last_updated_datetime = models.DateTimeField(auto_now=True)
    created_by = models.CharField( max_length=50 )
    created_datetime = models.DateTimeField(auto_now_add=True)
    source_transation_timestamp = models.DateTimeField()
    is_deleted = models.BooleanField()

    class Meta: 
        abstract = True


{% for cls in package.classes %}{% if cls.generalization != None and cls.generalization.package != package %}
from {{ cls.generalization.package.name | case_package }}.models import {{ cls.generalization.name | case_class }}{% endif %}{% for attr in cls.attributes %}{% if attr.classification and attr.classification.package != package %}
from {{ attr.classification.package.name | case_package }}.models import ENUM_{{ attr.classification.name | case_class }}{% endif %}{% endfor %}{% endfor %}

{% for enum in package.enumerations %}class ENUM_{{ enum.name | case_class }}(models.TextChoices):{% for attr in enum.values %}
    {{ attr | case_class | replace("/", "_") | replace("-", "_") }} = '{{ attr }}', _('{{ attr }}'){% endfor %}

{% endfor %}{% for cls in package.classes %}{% if cls.is_abstract %}class {{ cls.name | case_class }}( {% if "auditable" in cls.stereotypes %}AuditableModel{% else %}models.Model{% endif %} ):{% for attr in cls.attributes %}{% if attr.classification %}
    {{ attr.name | snakecase }} = models.CharField( max_length=100, choices=ENUM_{{ attr.classification.name}}.choices, blank=True, null=True ){% else %}
    {{ attr.name | snakecase }} = models.{% if "Auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %} )
{% endif %}{% endfor %}
    class Meta:
        abstract = True
{% endif %}{% endfor %}

{% for cls in package.classes %}{% if not cls.is_abstract and cls.specialized_by | length > 0 %}class {{ cls.name | case_class }}( {% if cls.generalization %}{{ cls.generalization.name | case_class }}{% elif "auditable" in cls.stereotypes %}AuditableModel{% else %}models.Model{% endif %} ):{% for attr in cls.attributes %}{% if attr.classification %}
    {{ attr.name | snakecase }} = models.CharField( max_length=100, choices=ENUM_{{ attr.classification.name | case_class }}.choices, blank=True, null=True ){% else %}
    {{ attr.name | snakecase }} = models.{% if "Auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.dest_type == "DecimalField" %}max_digits=10, decimal_places=2, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %}{% if attr.validations != [] %}validators=[validate_even]{% endif %} )
{% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if rel.association_type.name == "ASSOCIATION" %}{% if rel.cardinality.name == "ONE_TO_ONE" %}
    {{ rel.destination_name | snakecase }} = models.OneToOneField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_ONE" %}
    {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_MANY" %}
    {{ rel.destination_name | snakecase }} = models.ManyToManyField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', blank=True ){% endif %}{% elif rel.association_type.name == "COMPOSITION" %}{% if rel.cardinality.name == "ONE_TO_ONE" %}
    {{ rel.destination_name | snakecase }} = models.OneToOneField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE ){% else %}
    {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE ){% endif %}
{% endif %}{% endfor %}{% for rel in cls.associations_to %}{% if rel.association_type.name != "COMPOSITION" %}{% if rel.cardinality.name == "ONE_TO_MANY" %}
    {{ rel.source_name | snakecase }} = models.ForeignKey( '{{ rel.source.package.name | case_package }}.{{ rel.source.name | case_class }}', on_delete=models.CASCADE, related_name='{{ rel.destination_name | snakecase }}', blank=True, null=True ){% endif %}
{% endif %}{% endfor %}{% set uniques = [] %}{% for attr in cls.attributes %}{% if "UniqueKey" in attr.stereotypes %}{{ uniques.append( attr.name ) | default("", True) }}{% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if "UniqueKey" in rel.destination_stereotypes %}{{ uniques.append( rel.destination_name ) | default("", True) }}{% endif %}{% endfor %}
{% if cls.generalization %}    {{ cls.generalization.name | snakecase }}_ptr_id = models.OneToOneField(  '{{ cls.generalization.package.name | case_package }}.{{ cls.generalization.name | case_class }}', parent_link=True, db_column='{{ cls.generalization.name | snakecase }}_id', on_delete=models.CASCADE )
{% endif %}
    class Meta():
        db_table = '{{ cls.name | case_class }}'{% if uniques != [] %}

        constraints = [
                models.UniqueConstraint(fields=[{% for unique in uniques%}'{{ unique | snakecase }}',{% endfor %}], name='unique {{ cls.name | snakecase }}_{% for unique in uniques%}{{ unique | snakecase }}__{% endfor %}')
            ]{% endif %}


{% endif %}{% endfor %}{% for cls in package.classes %}{% if not cls.is_abstract and cls.specialized_by | length == 0 %}class {{ cls.name | case_class }}( {% if cls.generalization %}{{ cls.generalization.name | case_class }}{% elif "auditable" in cls.stereotypes %}AuditableModel{% else %}models.Model{% endif %} ):{% for attr in cls.attributes %}{% if attr.classification %}
    {{ attr.name | snakecase }} = models.CharField( max_length=100, choices=ENUM_{{ attr.classification.name | case_class }}.choices, blank=True, null=True ){% else %}
    {{ attr.name | snakecase }} = models.{% if "Auto" in attr.stereotypes %}AutoField{% else %}{{ attr.dest_type }}{% endif %}( {% if attr.is_id %}primary_key=True, {% else %}blank=True, null=True, {% endif %}{% if attr.dest_type == "DecimalField" %}max_digits=10, decimal_places=2, {% endif %}{% if attr.length %}max_length={{ attr.length }}{% endif %}{% if attr.validations != [] %}validators=[validate_even]{% endif %} )
{% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if rel.association_type.name == "ASSOCIATION" %}{% if rel.cardinality.name == "ONE_TO_ONE" %}
    {{ rel.destination_name | snakecase }} = models.OneToOneField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_ONE" %}
    {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE, blank=True, null=True ){% elif rel.cardinality.name == "MANY_TO_MANY" %}
    {{ rel.destination_name | snakecase }} = models.ManyToManyField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', blank=True ){% endif %}{% elif rel.association_type.name == "COMPOSITION" %}{% if rel.cardinality.name == "ONE_TO_ONE" %}
    {{ rel.destination_name | snakecase }} = models.OneToOneField( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE ){% else %}
    {{ rel.destination_name | snakecase }} = models.ForeignKey( '{{ rel.destination.package.name | case_package }}.{{ rel.destination.name | case_class }}', related_name='{{ rel.source_name | snakecase }}', on_delete=models.CASCADE ){% endif %}
{% endif %}{% endfor %}{% for rel in cls.associations_to %}{% if rel.association_type.name != "COMPOSITION" %}{% if rel.cardinality.name == "ONE_TO_MANY" %}
    {{ rel.source_name | snakecase }} = models.ForeignKey( '{{ rel.source.package.name | case_package }}.{{ rel.source.name | case_class }}', on_delete=models.CASCADE, related_name='{{ rel.destination_name | snakecase }}', blank=True, null=True ){% endif %}
{% endif %}{% endfor %}{% set uniques = [] %}{% for attr in cls.attributes %}{% if "UniqueKey" in attr.stereotypes %}{{ uniques.append( attr.name ) | default("", True) }}{% endif %}{% endfor %}{% for rel in cls.associations_from %}{% if "UniqueKey" in rel.destination_stereotypes %}{{ uniques.append( rel.destination_name ) | default("", True) }}{% endif %}{% endfor %}
{% if cls.generalization %}    {{ cls.generalization.name | snakecase }}ptr_id = models.OneToOneField(  '{{ cls.generalization.package.name | case_package }}.{{ cls.generalization.name | case_class }}', parent_link=True, db_column='{{ cls.generalization.name | snakecase }}id', on_delete=models.CASCADE )
{% endif %}
    class Meta():
        db_table = '{{ cls.name | case_class }}'{% if uniques != [] %}

        constraints = [
                models.UniqueConstraint(fields=[{% for unique in uniques%}'{{ unique | snakecase }}',{% endfor %}], name='unique {{ cls.name | snakecase }}_{% for unique in uniques%}{{ unique | snakecase }}__{% endfor %}')
            ]{% endif %}


{% endif %}{% endfor %}
@HarshAgrawal1
Copy link

@Semprini What's an issue?

@Semprini Semprini added the enhancement New feature or request label Sep 11, 2024
@Semprini
Copy link
Owner Author

@Semprini What's an issue?

It's just an updated template, but I want to think about what the standard template should include - there are design decisions around the auditable abstract model which probably don't belong in the vanilla django model template.

@Semprini Semprini self-assigned this Sep 24, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

2 participants