new
parent
48bf694fe2
commit
50b5a695ef
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,11 @@
|
|||||||
|
from django.contrib import admin
|
||||||
|
from .models import *
|
||||||
|
# Register your models here.
|
||||||
|
|
||||||
|
admin.site.register(ChatRoom)
|
||||||
|
admin.site.register(ChatMember)
|
||||||
|
admin.site.register(ChatProject)
|
||||||
|
admin.site.register(ChatMessage)
|
||||||
|
admin.site.register(ChatMessageAttachment)
|
||||||
|
admin.site.register(ChatMessageReaction)
|
||||||
|
admin.site.register(ChatMessageSeen)
|
@ -0,0 +1,6 @@
|
|||||||
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|
||||||
|
class OsichatConfig(AppConfig):
|
||||||
|
default_auto_field = 'django.db.models.BigAutoField'
|
||||||
|
name = 'osichat'
|
@ -0,0 +1,79 @@
|
|||||||
|
# Generated by Django 4.2.5 on 2024-07-16 10:34
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('osinacore', '0097_remove_status_date_remove_status_time'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatMessage',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('content', models.TimeField(blank=True, null=True)),
|
||||||
|
('date_sent', models.DateTimeField()),
|
||||||
|
('member', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatRoom',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=50)),
|
||||||
|
('date_created', models.DateTimeField()),
|
||||||
|
('created_by', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatProject',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('public', models.BooleanField()),
|
||||||
|
('project', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osinacore.project')),
|
||||||
|
('room', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatMessageSeen',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatMessageReaction',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('reaction', models.CharField(max_length=200)),
|
||||||
|
('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatMessageAttachment',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('attachment', models.TextField()),
|
||||||
|
('message', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatmessage')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='ChatMember',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('date_joined', models.DateTimeField()),
|
||||||
|
('member', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
|
('room', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='osichat.chatroom')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
Binary file not shown.
Binary file not shown.
@ -0,0 +1,42 @@
|
|||||||
|
from django.db import models
|
||||||
|
from osinacore.models import *
|
||||||
|
# Create your models here.
|
||||||
|
|
||||||
|
class ChatRoom(models.Model):
|
||||||
|
name = models.CharField(max_length=50)
|
||||||
|
created_by = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
|
||||||
|
date_created = models.DateTimeField()
|
||||||
|
|
||||||
|
|
||||||
|
class ChatMember(models.Model):
|
||||||
|
member = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
room = models.ForeignKey(ChatRoom, on_delete=models.CASCADE)
|
||||||
|
date_joined = models.DateTimeField()
|
||||||
|
|
||||||
|
|
||||||
|
class ChatProject(models.Model):
|
||||||
|
room = models.OneToOneField(ChatRoom, on_delete=models.CASCADE)
|
||||||
|
project = models.ForeignKey(Project, on_delete=models.CASCADE)
|
||||||
|
public = models.BooleanField()
|
||||||
|
|
||||||
|
|
||||||
|
class ChatMessage(models.Model):
|
||||||
|
member = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
|
||||||
|
content = models.TimeField(null=True, blank=True)
|
||||||
|
date_sent = models.DateTimeField()
|
||||||
|
|
||||||
|
|
||||||
|
class ChatMessageAttachment(models.Model):
|
||||||
|
message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE)
|
||||||
|
attachment = models.TextField()
|
||||||
|
|
||||||
|
|
||||||
|
class ChatMessageReaction(models.Model):
|
||||||
|
message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE)
|
||||||
|
member = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
reaction = models.CharField(max_length=200)
|
||||||
|
|
||||||
|
|
||||||
|
class ChatMessageSeen(models.Model):
|
||||||
|
message = models.ForeignKey(ChatMessage, on_delete=models.CASCADE)
|
||||||
|
member = models.ForeignKey(User, on_delete=models.CASCADE)
|
@ -0,0 +1,3 @@
|
|||||||
|
from django.test import TestCase
|
||||||
|
|
||||||
|
# Create your tests here.
|
@ -0,0 +1,3 @@
|
|||||||
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
# Create your views here.
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@ -0,0 +1,11 @@
|
|||||||
|
<span class="{% if new %} fade-in-up {% endif %}">{{last_ticket_department.department}}</span>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@keyframes fadeInAndUp {
|
||||||
|
from { opacity: 0; transform: translateY(12px); }
|
||||||
|
to { opacity: 1; transform: translateY(0px); }
|
||||||
|
}
|
||||||
|
.fade-in-up {
|
||||||
|
animation: fadeInAndUp 0.6s ease;
|
||||||
|
}
|
||||||
|
</style>
|
@ -0,0 +1,30 @@
|
|||||||
|
{% if last_ticket_status.status == 'Open' %}
|
||||||
|
<div class="flex justify-start items-center gap-1 {% if new %} fade-in-up {% endif %}">
|
||||||
|
<div class="w-[16px] h-[16px] rounded-full bg-green-200 shadow-md"></div>
|
||||||
|
<p class="text-secondosiblue font-light">Opened by {{last_ticket_status.added_by.first_name}} on
|
||||||
|
{{ last_ticket_status.date_added|date:"d F Y, h:i A" }}</p>
|
||||||
|
</div>
|
||||||
|
{% elif last_ticket_status.status == 'Working On' %}
|
||||||
|
<div class="flex justify-start items-center gap-1 {% if new %} fade-in-up {% endif %}"">
|
||||||
|
<div class="w-[16px] h-[16px] rounded-full bg-yellow-200 shadow-md"></div>
|
||||||
|
<p class="text-secondosiblue font-light">Updated to 'Working On' by
|
||||||
|
{{last_ticket_status.added_by.first_name}} on {{ last_ticket_status.date_added|date:"d F Y, h:i A" }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
{% elif last_ticket_status.status == 'Closed' %}
|
||||||
|
<div class="flex justify-start items-center gap-1 {% if new %} fade-in-up {% endif %}">
|
||||||
|
<div class="w-[16px] h-[16px] rounded-full bg-red-200 shadow-md"></div>
|
||||||
|
<p class="text-secondosiblue font-light">Closed by {{last_ticket_status.added_by.first_name}} on
|
||||||
|
{{ last_ticket_status.date_added|date:"d F Y, h:i A" }}</p>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
|
<style>
|
||||||
|
@keyframes fadeInAndUp {
|
||||||
|
from { opacity: 0; transform: translateY(12px); }
|
||||||
|
to { opacity: 1; transform: translateY(0px); }
|
||||||
|
}
|
||||||
|
.fade-in-up {
|
||||||
|
animation: fadeInAndUp 0.6s ease;
|
||||||
|
}
|
||||||
|
</style>
|
Loading…
Reference in New Issue