Initial commit from ZIP
This commit is contained in:
commit
378d4692a9
454 files changed
+40367
No files matched your search
Whitespace-only changes.
Whitespace-only changes.
+7
@@ -0,0 +1,7 @@
|
||||
from enum import Enum
|
||||
|
||||
|
||||
class MessageType(Enum):
|
||||
USER = "User"
|
||||
SUCCESS = "Success"
|
||||
FAILURE = "Failure"
|
||||
@@ -0,0 +1,107 @@
|
||||
# Generated by Django 2.2.7 on 2019-11-29 08:57
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import outbo.apps.activity_log.enums
|
||||
import outbo.apps.core.fields
|
||||
import rules.contrib.models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = []
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name="LogItem",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.AutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"created_at",
|
||||
outbo.apps.core.fields.CreationDateTimeField(
|
||||
auto_now_add=True, verbose_name="Created at"
|
||||
),
|
||||
),
|
||||
(
|
||||
"updated_at",
|
||||
outbo.apps.core.fields.ModificationDateTimeField(
|
||||
auto_now=True, verbose_name="Updated at"
|
||||
),
|
||||
),
|
||||
(
|
||||
"deleted_at",
|
||||
outbo.apps.core.fields.RemovalDateTimeField(
|
||||
blank=True, editable=False, null=True, verbose_name="Deleted at"
|
||||
),
|
||||
),
|
||||
("message", models.TextField(verbose_name="message")),
|
||||
(
|
||||
"message_type",
|
||||
models.CharField(
|
||||
choices=[
|
||||
(outbo.apps.activity_log.enums.MessageType("User"), "User"),
|
||||
(
|
||||
outbo.apps.activity_log.enums.MessageType("Success"),
|
||||
"Success",
|
||||
),
|
||||
(
|
||||
outbo.apps.activity_log.enums.MessageType("Failure"),
|
||||
"Failure",
|
||||
),
|
||||
],
|
||||
default=outbo.apps.activity_log.enums.MessageType("User"),
|
||||
max_length=25,
|
||||
verbose_name="message type",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"abstract": False,},
|
||||
bases=(rules.contrib.models.RulesModelMixin, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="ProductLogItem",
|
||||
fields=[
|
||||
(
|
||||
"logitem_ptr",
|
||||
models.OneToOneField(
|
||||
auto_created=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
parent_link=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
to="activity_log.LogItem",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"ordering": ["-created_at"],},
|
||||
bases=("activity_log.logitem",),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="ProjectLogItem",
|
||||
fields=[
|
||||
(
|
||||
"logitem_ptr",
|
||||
models.OneToOneField(
|
||||
auto_created=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
parent_link=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
to="activity_log.LogItem",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={"ordering": ["-created_at"],},
|
||||
bases=("activity_log.logitem",),
|
||||
),
|
||||
]
|
||||
+39
@@ -0,0 +1,39 @@
|
||||
# Generated by Django 2.2.7 on 2019-11-29 08:57
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
("contenttypes", "0002_remove_content_type_name"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
("activity_log", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="logitem",
|
||||
name="created_by",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.PROTECT,
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
verbose_name="created by",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="logitem",
|
||||
name="polymorphic_ctype",
|
||||
field=models.ForeignKey(
|
||||
editable=False,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="polymorphic_activity_log.logitem_set+",
|
||||
to="contenttypes.ContentType",
|
||||
),
|
||||
),
|
||||
]
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
# Generated by Django 2.2.7 on 2019-11-29 08:57
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
("projects", "0001_initial"),
|
||||
("activity_log", "0002_auto_20191129_0957"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="projectlogitem",
|
||||
name="project",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name="log_items",
|
||||
related_query_name="log_item",
|
||||
to="projects.Project",
|
||||
verbose_name="project",
|
||||
),
|
||||
),
|
||||
]
|
||||
+38
@@ -0,0 +1,38 @@
|
||||
# Generated by Django 2.2.7 on 2019-11-29 08:57
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
("activity_log", "0003_projectlogitem_project"),
|
||||
("products", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name="productlogitem",
|
||||
name="product",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name="log_items",
|
||||
related_query_name="log_item",
|
||||
to="products.Product",
|
||||
verbose_name="product",
|
||||
),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name="productlogitem",
|
||||
name="stage",
|
||||
field=models.ForeignKey(
|
||||
default=None,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.PROTECT,
|
||||
to="products.ProductStage",
|
||||
),
|
||||
),
|
||||
]
|
||||
+56
@@ -0,0 +1,56 @@
|
||||
# Generated by Django 2.2.10 on 2020-05-25 08:25
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("activity_log", "0004_auto_20191129_0957"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="logitem",
|
||||
name="created_by",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
verbose_name="created by",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="productlogitem",
|
||||
name="product",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="log_items",
|
||||
related_query_name="log_item",
|
||||
to="products.Product",
|
||||
verbose_name="product",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="productlogitem",
|
||||
name="stage",
|
||||
field=models.ForeignKey(
|
||||
default=None,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="products.ProductStage",
|
||||
),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name="projectlogitem",
|
||||
name="project",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="log_items",
|
||||
related_query_name="log_item",
|
||||
to="projects.Project",
|
||||
verbose_name="project",
|
||||
),
|
||||
),
|
||||
]
|
||||
Whitespace-only changes.
+65
@@ -0,0 +1,65 @@
|
||||
from django.db import models
|
||||
from django.utils.translation import pgettext, gettext_lazy as _
|
||||
from rules import always_allow
|
||||
|
||||
from outbo.apps.activity_log.enums import MessageType
|
||||
from outbo.apps.core.models import (
|
||||
TimestampableDeletableMixin,
|
||||
RulesPolymorphicModel,
|
||||
SoftDeletablePolymorphicManager,
|
||||
)
|
||||
|
||||
|
||||
class LogItem(TimestampableDeletableMixin, RulesPolymorphicModel):
|
||||
objects = SoftDeletablePolymorphicManager()
|
||||
all_objects = SoftDeletablePolymorphicManager(alive_only=False)
|
||||
|
||||
message = models.TextField(verbose_name=_("message"))
|
||||
message_type = models.CharField(
|
||||
verbose_name=_("message type"),
|
||||
max_length=25,
|
||||
blank=False,
|
||||
null=False,
|
||||
default=MessageType.USER,
|
||||
choices=((type, type.value) for type in MessageType),
|
||||
)
|
||||
created_by = models.ForeignKey(
|
||||
verbose_name=_("created by"), to="authentication.User", on_delete=models.CASCADE
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
if self.message_type == MessageType.USER:
|
||||
return self.message
|
||||
return pgettext("log_item_messages", self.message)
|
||||
|
||||
|
||||
class ProductLogItem(LogItem):
|
||||
class Meta:
|
||||
rules_permissions = {"view": always_allow, "add": always_allow}
|
||||
ordering = ["-created_at"]
|
||||
|
||||
product = models.ForeignKey(
|
||||
verbose_name=_("product"),
|
||||
to="products.Product",
|
||||
on_delete=models.CASCADE,
|
||||
related_name="log_items",
|
||||
related_query_name="log_item",
|
||||
)
|
||||
|
||||
stage = models.ForeignKey(
|
||||
to="products.ProductStage", on_delete=models.CASCADE, null=True, default=None
|
||||
)
|
||||
|
||||
|
||||
class ProjectLogItem(LogItem):
|
||||
class Meta:
|
||||
rules_permissions = {"view": always_allow, "add": always_allow}
|
||||
ordering = ["-created_at"]
|
||||
|
||||
project = models.ForeignKey(
|
||||
verbose_name=_("project"),
|
||||
to="projects.Project",
|
||||
on_delete=models.CASCADE,
|
||||
related_name="log_items",
|
||||
related_query_name="log_item",
|
||||
)
|
||||
+84
@@ -0,0 +1,84 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from outbo.apps.activity_log.enums import MessageType
|
||||
from outbo.apps.activity_log.models import ProductLogItem, ProjectLogItem
|
||||
|
||||
|
||||
class BaseProductLogItemSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = ProductLogItem
|
||||
|
||||
def get_message_type(self, instance):
|
||||
t, val = str(instance.message_type).split(".", 1)
|
||||
return MessageType[val].value
|
||||
|
||||
|
||||
class ProductLogItemSerializer:
|
||||
class List(BaseProductLogItemSerializer):
|
||||
message_type = serializers.SerializerMethodField()
|
||||
|
||||
class Meta(BaseProductLogItemSerializer.Meta):
|
||||
fields = [
|
||||
"message",
|
||||
"message_type",
|
||||
"stage",
|
||||
"updated_at",
|
||||
"created_at",
|
||||
"created_by",
|
||||
]
|
||||
|
||||
class Create(BaseProductLogItemSerializer):
|
||||
class Meta(BaseProductLogItemSerializer.Meta):
|
||||
fields = ["message"]
|
||||
|
||||
class AfterCreate(BaseProductLogItemSerializer):
|
||||
message_type = serializers.SerializerMethodField()
|
||||
|
||||
class Meta(BaseProductLogItemSerializer.Meta):
|
||||
fields = [
|
||||
"message",
|
||||
"message_type",
|
||||
"stage",
|
||||
"updated_at",
|
||||
"created_at",
|
||||
"created_by",
|
||||
]
|
||||
|
||||
|
||||
class BaseProjectLogItemSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = ProjectLogItem
|
||||
|
||||
def get_message_type(self, instance):
|
||||
t, val = str(instance.message_type).split(".", 1)
|
||||
return MessageType[val].value
|
||||
|
||||
|
||||
class ProjectLogItemSerializer:
|
||||
class List(BaseProjectLogItemSerializer):
|
||||
message_type = serializers.SerializerMethodField()
|
||||
|
||||
class Meta(BaseProjectLogItemSerializer.Meta):
|
||||
fields = [
|
||||
"message",
|
||||
"message_type",
|
||||
"updated_at",
|
||||
"created_at",
|
||||
"created_by",
|
||||
]
|
||||
|
||||
class Create(BaseProjectLogItemSerializer):
|
||||
class Meta(BaseProjectLogItemSerializer.Meta):
|
||||
fields = ["message"]
|
||||
|
||||
class AfterCreate(BaseProjectLogItemSerializer):
|
||||
message_type = serializers.SerializerMethodField()
|
||||
|
||||
class Meta(BaseProjectLogItemSerializer.Meta):
|
||||
fields = [
|
||||
"message",
|
||||
"message_type",
|
||||
"updated_at",
|
||||
"created_at",
|
||||
"created_by",
|
||||
]
|
||||
+2
@@ -0,0 +1,2 @@
|
||||
app_name = "activity_log"
|
||||
urlpatterns = []
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
from outbo.apps.activity_log.models import ProductLogItem, ProjectLogItem
|
||||
from outbo.apps.activity_log.serializers import (
|
||||
ProductLogItemSerializer,
|
||||
ProjectLogItemSerializer,
|
||||
)
|
||||
from outbo.apps.core.viewsets import (
|
||||
AutoPermissionViewSetMixin,
|
||||
ListModelMixin,
|
||||
MultipleSerializerViewSet,
|
||||
NestedViewSetMixin,
|
||||
CreateModelMixin,
|
||||
)
|
||||
from outbo.apps.products.models import Product
|
||||
from outbo.apps.projects.models import Project
|
||||
|
||||
|
||||
class ProductLogItemNestedViewSet(
|
||||
AutoPermissionViewSetMixin,
|
||||
ListModelMixin,
|
||||
CreateModelMixin,
|
||||
NestedViewSetMixin,
|
||||
MultipleSerializerViewSet,
|
||||
):
|
||||
queryset = ProductLogItem.objects.all()
|
||||
serializer_class_set = ProductLogItemSerializer
|
||||
|
||||
def perform_create(self, *, serializer):
|
||||
current_user = self.request.user
|
||||
parents = self.get_parents_query_dict()
|
||||
product = Product.objects.get(pk=parents["product_id"])
|
||||
return serializer.save(product=product, created_by=current_user)
|
||||
|
||||
|
||||
class ProjectLogItemNestedViewSet(
|
||||
AutoPermissionViewSetMixin,
|
||||
ListModelMixin,
|
||||
CreateModelMixin,
|
||||
NestedViewSetMixin,
|
||||
MultipleSerializerViewSet,
|
||||
):
|
||||
queryset = ProjectLogItem.objects.all()
|
||||
serializer_class_set = ProjectLogItemSerializer
|
||||
|
||||
def perform_create(self, *, serializer):
|
||||
current_user = self.request.user
|
||||
parents = self.get_parents_query_dict()
|
||||
project = Project.objects.get(pk=parents["project_id"])
|
||||
return serializer.save(project=project, created_by=current_user)
|
||||
Reference in new issue
Block a user