diff --git a/osinaweb/db.sqlite3 b/osinaweb/db.sqlite3 index a568af4d..051849d6 100644 Binary files a/osinaweb/db.sqlite3 and b/osinaweb/db.sqlite3 differ diff --git a/osinaweb/input.css b/osinaweb/input.css index f3ffb053..c9028ebf 100644 --- a/osinaweb/input.css +++ b/osinaweb/input.css @@ -148,7 +148,7 @@ -@media screen and (max-width: 650px) { +@media screen and (max-width: 798px) { #notesContainer { display: block; } diff --git a/osinaweb/osinacore/__pycache__/models.cpython-311.pyc b/osinaweb/osinacore/__pycache__/models.cpython-311.pyc index 22004f53..58635d65 100644 Binary files a/osinaweb/osinacore/__pycache__/models.cpython-311.pyc and b/osinaweb/osinacore/__pycache__/models.cpython-311.pyc differ diff --git a/osinaweb/osinacore/__pycache__/views.cpython-311.pyc b/osinaweb/osinacore/__pycache__/views.cpython-311.pyc index 83467eec..d54a0c71 100644 Binary files a/osinaweb/osinacore/__pycache__/views.cpython-311.pyc and b/osinaweb/osinacore/__pycache__/views.cpython-311.pyc differ diff --git a/osinaweb/osinacore/migrations/0052_note_project.py b/osinaweb/osinacore/migrations/0052_note_project.py new file mode 100644 index 00000000..e764da4b --- /dev/null +++ b/osinaweb/osinacore/migrations/0052_note_project.py @@ -0,0 +1,19 @@ +# Generated by Django 4.2.5 on 2024-01-23 07:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('osinacore', '0051_alter_task_requirement'), + ] + + operations = [ + migrations.AddField( + model_name='note', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='osinacore.project'), + ), + ] diff --git a/osinaweb/osinacore/migrations/__pycache__/0052_note_project.cpython-311.pyc b/osinaweb/osinacore/migrations/__pycache__/0052_note_project.cpython-311.pyc new file mode 100644 index 00000000..537b9b1c Binary files /dev/null and b/osinaweb/osinacore/migrations/__pycache__/0052_note_project.cpython-311.pyc differ diff --git a/osinaweb/osinacore/models.py b/osinaweb/osinacore/models.py index ec296931..b481741b 100644 --- a/osinaweb/osinacore/models.py +++ b/osinaweb/osinacore/models.py @@ -194,6 +194,7 @@ class Note(models.Model): date = models.DateTimeField(null=True,blank=True) user = models.ForeignKey(User, on_delete=models.CASCADE, null=True,blank=True) color = ColorField(default='#FF0000',blank=True) + project = models.ForeignKey(Project, on_delete=models.CASCADE, null=True, blank=True) class Task(models.Model): diff --git a/osinaweb/osinacore/views.py b/osinaweb/osinacore/views.py index f0e3f775..0cf2b9cd 100644 --- a/osinaweb/osinacore/views.py +++ b/osinaweb/osinacore/views.py @@ -71,6 +71,7 @@ def home(request, *args, **kwargs): +from django.db.models import Subquery, OuterRef #Listing Pages @login_required @@ -84,11 +85,19 @@ def my_projects(request, *args, **kwargs): # Non-superuser, filter projects where the user is either the manager or a member projects = Project.objects.filter(Q(manager=user.staffprofile) | Q(members=user.staffprofile)).distinct().order_by('-project_id') + # Annotate each project with its most recent note + projects = projects.annotate( + recent_note_text=Subquery( + Note.objects.filter(project=OuterRef('pk')).order_by('-date').values('text')[:1] + ), + recent_note_color=Subquery( + Note.objects.filter(project=OuterRef('pk')).order_by('-date').values('color')[:1] + ), + recent_note_date=Max('note__date') + ) context = { - - 'projects' : projects, - + 'projects': projects, } return render(request, 'listing_pages/projects.html', context) @@ -233,6 +242,8 @@ def detailed_project(request, project_id): epics = Epic.objects.filter(project=project) latest_epic = Epic.objects.filter(project=project).last() + project_notes = Note.objects.filter(project=project).order_by('-id') + if latest_epic: epics = epics.exclude(pk=latest_epic.pk) @@ -250,11 +261,14 @@ def detailed_project(request, project_id): 'epics': epics, 'selected_epic': selected_epic, 'related_tasks': related_tasks, - 'latest_epic': latest_epic + 'latest_epic': latest_epic, + 'project_notes' : project_notes, } return render(request, 'details_pages/project-details.html', context) + + @login_required def customerdetails(request, customer_id): customer = get_object_or_404(CustomerProfile, customer_id=customer_id) @@ -433,10 +447,13 @@ def add_note_modal(request, *args, **kwargs): return render(request, 'popup_modals/addnote-modal.html', context) -def add_project_note_modal(request, *args, **kwargs): - context = { +def add_project_note_modal(request, project_id): + project = get_object_or_404(Project, project_id=project_id) + context = { + 'project' : project } + return render(request, 'popup_modals/add-project-note-modal.html', context) @@ -696,6 +713,31 @@ def save_note(request): return render(request, 'addnote-modal.html') +def save_project_note(request): + + if request.method == 'POST': + text = request.POST.get('note_text') + color = request.POST.get('note_color') + user = request.user + date = timezone.now() + + project_id = request.POST.get('project') + project = get_object_or_404(Project, id=project_id) + + note = Note( + text=text, + color=color, + user=user, + date=date, + project=project, + ) + note.save() + + return HttpResponse('') + + return render(request, 'add-project-note-modal.html') + + @login_required def save_project(request): @@ -1697,6 +1739,25 @@ def delete_note_modal(request, note_id): return render(request, "delete_modals/delete-note-modal.html", context) +@login_required +def delete_project_note_modal(request, note_id): + note = get_object_or_404(Note, id=note_id) + + if request.method == 'POST': + project_id = note.project_id + project = get_object_or_404(Project, id=project_id) + note.delete() + + return redirect('detailed-project', project_id=project.project_id) + + context = { + 'note': note, + } + + return render(request, "delete_modals/delete-project-note-modal.html", context) + + + @login_required def delete_business_modal(request, business_id): business = get_object_or_404(Business, id=business_id) diff --git a/osinaweb/osinaweb/__pycache__/urls.cpython-311.pyc b/osinaweb/osinaweb/__pycache__/urls.cpython-311.pyc index 44568f53..fa089b97 100644 Binary files a/osinaweb/osinaweb/__pycache__/urls.cpython-311.pyc and b/osinaweb/osinaweb/__pycache__/urls.cpython-311.pyc differ diff --git a/osinaweb/osinaweb/urls.py b/osinaweb/osinaweb/urls.py index 8ee611c5..9a111e28 100644 --- a/osinaweb/osinaweb/urls.py +++ b/osinaweb/osinaweb/urls.py @@ -37,7 +37,6 @@ urlpatterns = [ path('addstaff/', views.addstaff, name='adduser'), path('staffs/', views.staffs, name='users'), path('staffpositions/', views.staff_positions, name='staffpositions'), - path('projectdetails//', views.detailed_project, name='detailed-project'), path('createproject/', views.create_project, name='createproject'), path('createepic//', views.create_epic, name='createepic'), path('createtask/', views.create_task, name='createtask'), @@ -59,6 +58,7 @@ urlpatterns = [ path('customers//', views.customerdetails, name='customerdetails'), path('staffs//', views.staffdetails, name='userdetails'), path('tasks//', views.detailed_task, name='detailed-task'), + path('projectdetails//', views.detailed_project, name='detailed-project'), @@ -72,7 +72,7 @@ urlpatterns = [ #Modals urls path('add-status/', views.add_status_modal, name='addstatus'), path('add-note/', views.add_note_modal, name='addnote'), - path('add-project-note/', views.add_project_note_modal, name='addprojectnote'), + path('add-project-note//', views.add_project_note_modal, name='addprojectnote'), path('add-file/', views.add_file_modal, name='addfile'), path('add-user-story//', views.add_user_story_modal, name='adduserstory'), path('add-credentials/', views.add_credentials_modal, name='addcredentials'), @@ -98,9 +98,12 @@ urlpatterns = [ path('deleteprojectmodal/', views.delete_project_modal, name='deleteprojectmodal'), path('deletetaskmodal/', views.delete_task_modal, name='deletetaskmodal'), path('deletenotemodal/', views.delete_note_modal, name='deletenotemodal'), + path('deleteprojectnotemodal/', views.delete_project_note_modal, name='deleteprojectnotemodal'), #Save Urls path('save_note/', views.save_note, name='save_note'), + path('save_project_note/', views.save_project_note, name='save_project_note'), + path('save_project/', views.save_project, name='save_project'), path('save_epic/', views.save_epic, name='save_epic'), path('save_task/', views.save_task, name='save_task'), diff --git a/osinaweb/static/dist/output.css b/osinaweb/static/dist/output.css index 57417685..1cf35dbe 100644 --- a/osinaweb/static/dist/output.css +++ b/osinaweb/static/dist/output.css @@ -1080,6 +1080,10 @@ video { min-width: 100%; } +.max-w-0 { + max-width: 0rem; +} + .max-w-2xl { max-width: 42rem; } @@ -1389,6 +1393,11 @@ video { border-color: rgb(59 130 246 / var(--tw-border-opacity)); } +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity)); +} + .border-gray-200 { --tw-border-opacity: 1; border-color: rgb(229 231 235 / var(--tw-border-opacity)); @@ -2285,7 +2294,7 @@ video { } } -@media screen and (max-width: 650px) { +@media screen and (max-width: 798px) { #notesContainer { display: block; } @@ -2439,6 +2448,10 @@ video { display: block; } + .md\:flex { + display: flex; + } + .md\:hidden { display: none; } diff --git a/osinaweb/static/js/pop-modals.js b/osinaweb/static/js/pop-modals.js index 020c4e55..456b5873 100644 --- a/osinaweb/static/js/pop-modals.js +++ b/osinaweb/static/js/pop-modals.js @@ -74,6 +74,8 @@ document.addEventListener("DOMContentLoaded", function () { addButtonClickListener("deleteProjectButton", "400px", "140px"); addButtonClickListener("deleteTaskButton", "400px", "140px"); addButtonClickListener("deleteNoteButton", "400px", "140px"); + addButtonClickListener("deleteProjectNoteButton", "400px", "140px"); + diff --git a/osinaweb/templates/delete_modals/delete-project-note-modal.html b/osinaweb/templates/delete_modals/delete-project-note-modal.html new file mode 100644 index 00000000..63c9d6ed --- /dev/null +++ b/osinaweb/templates/delete_modals/delete-project-note-modal.html @@ -0,0 +1,30 @@ +{%load static%} + + + + + + + + + + + + + + + + {% csrf_token %} + + + Are you sure you want to delete this note? + + + Delete + + + + + + \ No newline at end of file diff --git a/osinaweb/templates/details_pages/business-details.html b/osinaweb/templates/details_pages/business-details.html index 99901f7d..32a80899 100644 --- a/osinaweb/templates/details_pages/business-details.html +++ b/osinaweb/templates/details_pages/business-details.html @@ -30,11 +30,11 @@ - +\ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} @@ -99,6 +105,7 @@ + diff --git a/osinaweb/templates/details_pages/customer-details.html b/osinaweb/templates/details_pages/customer-details.html index be0246d2..e131b012 100644 --- a/osinaweb/templates/details_pages/customer-details.html +++ b/osinaweb/templates/details_pages/customer-details.html @@ -34,7 +34,7 @@ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/details_pages/project-details.html b/osinaweb/templates/details_pages/project-details.html index 03e64cd4..ad66959c 100644 --- a/osinaweb/templates/details_pages/project-details.html +++ b/osinaweb/templates/details_pages/project-details.html @@ -34,7 +34,7 @@ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} @@ -105,26 +111,26 @@ {% if project.status == 'Completed' %} - {{project.name}} - {{project.project_id}} + {{project.name}} + {{project.project_id}} {% endif %} {% if project.status == 'Cancelled' %} - {{project.name}} - {{project.project_id}} + {{project.name}} + {{project.project_id}} {% endif %} {% if project.status == 'Active' %} - {{project.name}} - {{project.project_id}} + {{project.name}} + {{project.project_id}} {% endif %} {% if project.status == 'Pending' %} - {{project.name}} - {{project.project_id}} + {{project.name}} + {{project.project_id}} {% endif %} @@ -305,8 +311,8 @@ Add - Task + class="w-fit py-2 px-3 bg-green-700 border border-green-700 text-white rounded-md cursor-pointer hover:bg-white hover:text-green-700">Add + Task @@ -479,7 +485,7 @@ + data-modal-url="{% url 'addprojectnote' project.project_id %}"> @@ -510,30 +516,35 @@ - + + {% for note in project_notes %} + - Note Content + {{ note.text }} - 2-11-2023 + {{ note.date }} - Nataly Abi Wajeh + {{ note.user.username }} Delete + class="w-full py-2 px-3 bg-transparent border border-gray-500 text-gray-500 cursor-pointer rounded-md deleteProjectNoteButton" data-modal-url="{% url 'deleteprojectnotemodal' note.id %}">Delete + {% endfor %} - + + {% endif %} @@ -618,7 +629,8 @@ {% if latest_statuses_time_ago %} - + USERS ACTIVITY diff --git a/osinaweb/templates/details_pages/staff-details.html b/osinaweb/templates/details_pages/staff-details.html index 0d632892..d8576afa 100644 --- a/osinaweb/templates/details_pages/staff-details.html +++ b/osinaweb/templates/details_pages/staff-details.html @@ -34,7 +34,7 @@ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/details_pages/task-details.html b/osinaweb/templates/details_pages/task-details.html index cb81afff..7fbb859b 100644 --- a/osinaweb/templates/details_pages/task-details.html +++ b/osinaweb/templates/details_pages/task-details.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} @@ -105,17 +111,17 @@ {% if task.status == 'Open' %} - {{task.name}} + {{task.name}} {% endif %} {% if task.status == 'Working On' %} - {{task.name}} + {{task.name}} {% endif %} {% if task.status == 'Closed' %} - {{task.name}} + {{task.name}} {% endif %} diff --git a/osinaweb/templates/index.html b/osinaweb/templates/index.html index aa0cee74..d984da6b 100644 --- a/osinaweb/templates/index.html +++ b/osinaweb/templates/index.html @@ -2,50 +2,6 @@ {%load static%} {% block content %} - - - - + Recent Note: @@ -86,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -106,7 +68,7 @@ - + {% for note in notes %} @@ -121,8 +83,8 @@ - - + + {% for note in notes %} @@ -143,19 +105,9 @@ - - + + Home - Current Page + Current Page - + + + diff --git a/osinaweb/templates/listing_pages/business-types.html b/osinaweb/templates/listing_pages/business-types.html index 2b0a587c..571aa1b3 100644 --- a/osinaweb/templates/listing_pages/business-types.html +++ b/osinaweb/templates/listing_pages/business-types.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/businesses.html b/osinaweb/templates/listing_pages/businesses.html index f35badc9..8835c18d 100644 --- a/osinaweb/templates/listing_pages/businesses.html +++ b/osinaweb/templates/listing_pages/businesses.html @@ -34,7 +34,7 @@ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/customers.html b/osinaweb/templates/listing_pages/customers.html index 92c5ad87..9a3792ba 100644 --- a/osinaweb/templates/listing_pages/customers.html +++ b/osinaweb/templates/listing_pages/customers.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/daily-reports.html b/osinaweb/templates/listing_pages/daily-reports.html index 9c0542d4..9a231ccd 100644 --- a/osinaweb/templates/listing_pages/daily-reports.html +++ b/osinaweb/templates/listing_pages/daily-reports.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/notes.html b/osinaweb/templates/listing_pages/notes.html index c5653398..dcc28127 100644 --- a/osinaweb/templates/listing_pages/notes.html +++ b/osinaweb/templates/listing_pages/notes.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/project-types.html b/osinaweb/templates/listing_pages/project-types.html index 03a74187..fd84c253 100644 --- a/osinaweb/templates/listing_pages/project-types.html +++ b/osinaweb/templates/listing_pages/project-types.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/projects.html b/osinaweb/templates/listing_pages/projects.html index 19817552..9733c556 100644 --- a/osinaweb/templates/listing_pages/projects.html +++ b/osinaweb/templates/listing_pages/projects.html @@ -22,7 +22,8 @@ onclick="closeModal()"> + d="M376.6 84.5c11.3-13.6 9.5-33.8-4.1-45.1s-33.8-9.5-45.1 4.1L192 206 56.6 43.5C45.3 29.9 25.1 28.1 11.5 39.4S-3.9 70.9 7.4 84.5L150.3 256 7.4 427.5c-11.3 13.6-9.5 33.8 4.1 45.1s33.8 9.5 45.1-4.1L192 306 327.4 468.5c11.3 13.6 31.5 15.4 45.1 4.1s15.4-31.5 4.1-45.1L233.7 256 376.6 84.5z" + fill="grey" /> @@ -34,7 +35,7 @@ - + Recent Note: @@ -42,13 +43,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +69,7 @@ - + {% for note in notes %} @@ -77,8 +84,8 @@ - - + + {% for note in notes %} @@ -107,7 +114,8 @@ My Projects - + - + Create Project @@ -141,17 +149,13 @@ - - # - Project - Client + Recent Note @@ -169,16 +173,17 @@ {% for project in projects %} - - {{project.project_id}} - {{project.name}} - - {{project.customer}} + + {% if project.recent_note_date %} + {{ project.recent_note_text }} + {% else %} + No recent note + {% endif %} {% if project.status == 'Completed' %} @@ -219,7 +224,8 @@ - + @@ -234,7 +240,8 @@ {% if latest_statuses_time_ago %} - + USERS ACTIVITY diff --git a/osinaweb/templates/listing_pages/references.html b/osinaweb/templates/listing_pages/references.html index 4d4de6ec..4e0047ee 100644 --- a/osinaweb/templates/listing_pages/references.html +++ b/osinaweb/templates/listing_pages/references.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/staff-positions.html b/osinaweb/templates/listing_pages/staff-positions.html index 9028ec92..af639671 100644 --- a/osinaweb/templates/listing_pages/staff-positions.html +++ b/osinaweb/templates/listing_pages/staff-positions.html @@ -34,7 +34,7 @@ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} @@ -99,6 +105,7 @@ + diff --git a/osinaweb/templates/listing_pages/staffs.html b/osinaweb/templates/listing_pages/staffs.html index d82ce3a5..912e2cb9 100644 --- a/osinaweb/templates/listing_pages/staffs.html +++ b/osinaweb/templates/listing_pages/staffs.html @@ -34,7 +34,7 @@ - + Recent Note: @@ -42,13 +42,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -62,7 +68,7 @@ - + {% for note in notes %} @@ -77,8 +83,8 @@ - - + + {% for note in notes %} @@ -99,6 +105,7 @@ + diff --git a/osinaweb/templates/listing_pages/tags.html b/osinaweb/templates/listing_pages/tags.html index 175fee31..dfd1586f 100644 --- a/osinaweb/templates/listing_pages/tags.html +++ b/osinaweb/templates/listing_pages/tags.html @@ -33,7 +33,7 @@ - + Recent Note: @@ -41,13 +41,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -61,7 +67,7 @@ - + {% for note in notes %} @@ -76,8 +82,8 @@ - - + + {% for note in notes %} diff --git a/osinaweb/templates/listing_pages/tasks.html b/osinaweb/templates/listing_pages/tasks.html index 2abc12e1..c44ceb61 100644 --- a/osinaweb/templates/listing_pages/tasks.html +++ b/osinaweb/templates/listing_pages/tasks.html @@ -32,7 +32,7 @@ - + Recent Note: @@ -40,13 +40,19 @@ {{recent_note.text}} - - - + + + My Notes + + + + + - + + Show @@ -60,7 +66,7 @@ - + {% for note in notes %} @@ -75,8 +81,8 @@ - -
Recent Note:
{{recent_note.text}}
My Notes
{{project.project_id}}
Note Content
{{ note.text }}
2-11-2023
{{ note.date }}
Nataly Abi Wajeh
{{ note.user.username }}
{{project.name}}
{{project.customer}}
{{ project.recent_note_text }}
No recent note