Skip to content

Commit 33a2f92

Browse files
Commit Explain Code
1 parent 4022b18 commit 33a2f92

39 files changed

+2472
-1860
lines changed

README.md

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,14 +112,11 @@ cd messenger_vuepress
112112
npm run docs:dev
113113
```
114114

115-
# **\*\*\*\***\*\*\*\***\*\*\*\***\_**\*\*\*\***\*\*\*\***\*\*\*\***
116-
117-
# **\*\*\*\***\*\*\*\***\*\*\*\***\_**\*\*\*\***\*\*\*\***\*\*\*\***
118-
119-
# **\*\*\*\***\*\*\*\***\*\*\*\***\_**\*\*\*\***\*\*\*\***\*\*\*\***
115+
___
120116

121117
###### 📝 Create File Gitignore
122118

119+
123120
```
124121
.gitignore
125122
```
Binary file not shown.
Binary file not shown.

messenger_django/account/api.py

Lines changed: 312 additions & 149 deletions
Large diffs are not rendered by default.
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
# Generated by Django 5.1.3 on 2024-11-30 15:19
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('account', '0001_initial'),
10+
]
11+
12+
operations = [
13+
migrations.AlterModelOptions(
14+
name='friendshiprequest',
15+
options={'ordering': ('-created_at',)},
16+
),
17+
migrations.AddField(
18+
model_name='user',
19+
name='skills',
20+
field=models.JSONField(blank=True, default=list, null=True),
21+
),
22+
migrations.AlterField(
23+
model_name='friendshiprequest',
24+
name='status',
25+
field=models.CharField(choices=[('notsend', 'NotSent'), ('send', 'Send'), ('waiting', 'Waiting'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('cancel', 'Cancel')], default='notsend', max_length=20),
26+
),
27+
]
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Generated by Django 5.1.3 on 2024-12-02 14:38
2+
3+
from django.db import migrations, models
4+
5+
6+
class Migration(migrations.Migration):
7+
8+
dependencies = [
9+
('account', '0002_alter_friendshiprequest_options_user_skills_and_more'),
10+
]
11+
12+
operations = [
13+
migrations.AlterField(
14+
model_name='friendshiprequest',
15+
name='status',
16+
field=models.CharField(choices=[('notsend', 'NotSent'), ('send', 'Send'), ('waiting', 'Waiting'), ('accepted', 'Accepted'), ('rejected', 'Rejected'), ('cancel', 'Cancel'), ('blocked', 'Blocked'), ('muted', 'Muted'), ('frozen', 'Frozen'), ('archived', 'Archived'), ('following', 'Following'), ('unfollowed', 'Unfollowed'), ('reported', 'Reported'), ('spam', 'Spam'), ('deleted', 'Deleted'), ('favorite', 'Favorite'), ('temporarily_blocked', 'TemporarilyBlocked'), ('verified', 'Verified'), ('request_resent', 'RequestResent'), ('suggested', 'Suggested'), ('ignored', 'Ignored'), ('inactive', 'Inactive'), ('limited', 'Limited')], default='notsend', max_length=20),
17+
),
18+
]

messenger_django/account/models.py

Lines changed: 106 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -52,39 +52,44 @@ def create_superuser(self, name=None, email=None, password=None, **extra_fields)
5252
# 🧑 Custom User Form
5353
# 🧑 نموذج المستخدم المخصص
5454
class User(AbstractBaseUser, PermissionsMixin):
55+
# ___________________
56+
# حقل يتم تعبئة تلقائي
57+
# ___________________
5558
# 🔑 Define the primary field to be UUID تعريف الحقل الأساسي ليكون
5659
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
57-
# 📛 User Data Properties خصائص بيانات المستخدم
58-
name = models.CharField(max_length=255, blank=True, null=True, default="")
59-
surname = models.CharField(max_length=255, blank=True, default="")
60-
email = models.EmailField(unique=True)
61-
date_of_birth = models.DateField(default=timezone.now)
62-
gender = models.CharField(max_length=15, blank=True, null=True)
63-
# 🖼️ Profile Picture صورة شخصية
64-
avatar = models.ImageField(upload_to="avatars", blank=True, null=True)
65-
# 🖼️ Cover Photo صورة الغلاف
66-
cover = models.ImageField(upload_to="covers", blank=True, null=True)
67-
6860
# ⚙️ User Status حالة المستخدم
6961
is_active = models.BooleanField(default=True)
7062
is_superuser = models.BooleanField(default=False)
7163
is_staff = models.BooleanField(default=False)
72-
7364
# 📋 Custom Admin Link ربط المدير المخصص
7465
objects = CustomUserManager()
75-
7666
# 👥 Friends and Characteristics of Friendships الأصدقاء وخصائص الصداقات
7767
friends = models.ManyToManyField("self")
7868
friends_count = models.IntegerField(default=0)
7969
people_you_may_know = models.ManyToManyField("self")
80-
81-
# 📋 Tasks and Their Number المهام وعددها
82-
task_count = models.IntegerField(default=0)
83-
8470
# 📅 Join Date & Last Login تاريخ الانضمام وآخر تسجيل دخول و حالة الاتصال
8571
# Automatic
8672
date_joined = models.DateTimeField(default=timezone.now)
8773
last_login = models.DateTimeField(auto_now=True, blank=True, null=True)
74+
75+
# ___________________
76+
# حقل يتم تعبئة من المستخدام
77+
# ___________________
78+
# 📛 User Data Properties خصائص بيانات المستخدم
79+
name = models.CharField(max_length=255, blank=True, null=True, default="")
80+
surname = models.CharField(max_length=255, blank=True, default="")
81+
email = models.EmailField(unique=True)
82+
date_of_birth = models.DateField(default=timezone.now)
83+
gender = models.CharField(max_length=15, blank=True, null=True)
84+
# 🖼️ Profile Picture صورة شخصية
85+
avatar = models.ImageField(upload_to="avatars", blank=True, null=True)
86+
# 🖼️ Cover Photo صورة الغلاف
87+
cover = models.ImageField(upload_to="covers", blank=True, null=True)
88+
# مهارات
89+
skills = models.JSONField(default=list, blank=True, null=True)
90+
# 📋 Tasks and Their Number المهام وعددها
91+
task_count = models.IntegerField(default=0)
92+
# 📅 User Is Online حالة الاتصال
8893
is_online = models.BooleanField(default=False)
8994

9095
# 🔒 إعدادات تسجيل الدخول: البريد الإلكتروني كمحدد رئيسي لتسجيل الدخول
@@ -112,36 +117,104 @@ def get_cover(self):
112117
def date_joined_formatted(self):
113118
return timesince(self.date_joined)
114119

120+
def last_login_formatted(self):
121+
return timesince(self.last_login)
122+
115123

116124
# 📬 Friend Request Form نموذج طلب الصداقة
117125
class FriendshipRequest(models.Model):
118126
# 📝 Friend request cases حالات طلب الصداقة
119-
SENT = "sent"
120-
NOT_SENT = "not sent"
121-
ACCEPTED = "accepted"
122-
WAITING = "waiting"
123-
REJECTED = "rejected"
124-
CANCEL = "cancel"
125-
127+
NOTSEND = "notsend" # 🚫 لم يتم الإرسال
128+
SEND = "send" # ✉️ تم الإرسال
129+
WAITING = "waiting" # ⏳ في انتظار الرد
130+
ACCEPTED = "accepted" # ✅ تم القبول
131+
REJECTED = "rejected" # ❌ تم الرفض
132+
CANCEL = "cancel" # 🔄 تم الإلغاء
133+
BLOCKED = "blocked" # 🚫 الحظر
134+
MUTED = "muted" # 🔕 الكتم
135+
FROZEN = "frozen" # 🧊 تجميد
136+
ARCHIVED = "archived" # 📦 مؤرشف
137+
FOLLOWING = "following" # 👥 متابعة
138+
UNFOLLOWED = "unfollowed" # 🚫 إلغاء المتابعة
139+
REPORTED = "reported" # 🚨 تم الإبلاغ عنه
140+
SPAM = "spam" # 🗑️ بريد مزعج
141+
DELETED = "deleted" # 🗑️ محذوف
142+
FAVORITE = "favorite" # 🌟 مفضل
143+
TEMPORARILY_BLOCKED = "temporarily_blocked" # ⏳ حظر مؤقت
144+
VERIFIED = "verified" # ✔️ تم التحقق
145+
REQUEST_RESENT = "request_resent" # 🔄 تم إعادة الإرسال
146+
SUGGESTED = "suggested" # 💡 مقترح
147+
IGNORED = "ignored" # 🛑 تم التجاهل
148+
INACTIVE = "inactive" # ⚠️ غير نشط
149+
LIMITED = "limited" # 🚫 محدود
150+
151+
# 📜 قائمة الحالات الممكنة مع النصوص المقابلة
126152
STATUS_CHOICES = (
127-
(SENT, "Sent"),
128-
(NOT_SENT, "Not Sent"),
129-
(ACCEPTED, "Accepted"),
130-
(WAITING, "Waiting"),
131-
(REJECTED, "Rejected"),
132-
(CANCEL, "Cancel"),
153+
(NOTSEND, "NotSent"), # 🚫 لم يتم الإرسال
154+
(SEND, "Send"), # ✉️ تم الإرسال
155+
(WAITING, "Waiting"), # ⏳ في انتظار الرد
156+
(ACCEPTED, "Accepted"), # ✅ تم القبول
157+
(REJECTED, "Rejected"), # ❌ تم الرفض
158+
(CANCEL, "Cancel"), # 🔄 تم الإلغاء
159+
(BLOCKED, "Blocked"), # 🚫 الحظر
160+
(MUTED, "Muted"), # 🔕 الكتم
161+
(FROZEN, "Frozen"), # 🧊 تجميد
162+
(ARCHIVED, "Archived"), # 📦 مؤرشف
163+
(FOLLOWING, "Following"), # 👥 متابعة
164+
(UNFOLLOWED, "Unfollowed"), # 🚫 إلغاء المتابعة
165+
(REPORTED, "Reported"), # 🚨 تم الإبلاغ عنه
166+
(SPAM, "Spam"), # 🗑️ بريد مزعج
167+
(DELETED, "Deleted"), # 🗑️ محذوف
168+
(FAVORITE, "Favorite"), # 🌟 مفضل
169+
(TEMPORARILY_BLOCKED, "TemporarilyBlocked"), # ⏳ حظر مؤقت
170+
(VERIFIED, "Verified"), # ✔️ تم التحقق
171+
(REQUEST_RESENT, "RequestResent"), # 🔄 تم إعادة الإرسال
172+
(SUGGESTED, "Suggested"), # 💡 مقترح
173+
(IGNORED, "Ignored"), # 🛑 تم التجاهل
174+
(INACTIVE, "Inactive"), # ⚠️ غير نشط
175+
(LIMITED, "Limited"), # 🚫 محدود
133176
)
177+
134178
# 🔑 Friend Request UUID Essential Field حقل أساسي UUID لطلب الصداقة
135179
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
136180
# 🧑 User receiving the request المستخدم المستلم للطلب
137181
created_for = models.ForeignKey(
138182
User, related_name="received_friendshiprequests", on_delete=models.CASCADE
139183
)
140-
# 📅 Creation date تاريخ الإنشاء
141-
created_at = models.DateTimeField(auto_now_add=True)
142184
# 🧑 The user who sent the request المستخدم المرسل للطلب
143185
created_by = models.ForeignKey(
144186
User, related_name="created_friendshiprequests", on_delete=models.CASCADE
145187
)
188+
# 📅 Creation date تاريخ الإنشاء
189+
created_at = models.DateTimeField(auto_now_add=True)
146190
# 📝 Order Status حالة الطلب
147-
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default=NOT_SENT)
191+
# 🚫 الحالة الافتراضية: "لم يتم الإرسال"
192+
status = models.CharField(max_length=20, choices=STATUS_CHOICES, default=NOTSEND)
193+
194+
# - 🔄 يتم استخدام عبارة "ترتيب حسب" لتحديد ترتيب البيانات المُسترجعة
195+
# - 📊 يمكن تحديد ترتيب البيانات بناءً على أحد الحقول في الجدول
196+
# - 🎚️ يتيح ذلك تنظيم البيانات بطريقة محددة، مثل الترتيب تصاعديًا أو تنازليًا
197+
class Meta:
198+
ordering = ("-created_at",)
199+
200+
# - 🔍 اسم الاوبجكت اللى يظهر فى صفحة الادمان
201+
def __str__(self):
202+
return "%s" % self.status
203+
204+
# 🔍 Retrieve All Friend Requests by User and Status 🔍
205+
# 🧑‍🤝‍🧑 جلب جميع طلبات الصداقة بناءً على المستخدم والحالة
206+
@staticmethod
207+
def get_friends_by_status(user, status):
208+
"""جلب الأصدقاء بناءً على حالة محددة"""
209+
if status == FriendshipRequest.ACCEPTED:
210+
return User.objects.filter(
211+
received_friendshiprequests__created_by=user,
212+
received_friendshiprequests__status=status,
213+
) | User.objects.filter(
214+
created_friendshiprequests__created_for=user,
215+
created_friendshiprequests__status=status,
216+
)
217+
return User.objects.filter(
218+
received_friendshiprequests__created_by=user,
219+
received_friendshiprequests__status=status,
220+
)

messenger_django/db.sqlite3

16 KB
Binary file not shown.
20.8 KB
Loading
Loading

messenger_django/media/covers/3.jpg

6.8 MB
Loading

messenger_vue/dev-dist/sw.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

messenger_vue/dev-dist/sw.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading
Loading

messenger_vue/src/App.vue

Lines changed: 3 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -25,12 +25,6 @@ onMounted(() => {
2525
}
2626
})
2727
28-
// For Toggle Theme
29-
// const op = ref(null)
30-
// const toggle = event => {
31-
// // console.log('toggle: ', toggle);
32-
// op.value.toggle(event)
33-
// }
3428
// Log Out
3529
let logout = () => {
3630
// console.log('User Log out')
@@ -43,10 +37,7 @@ let logout = () => {
4337
</script>
4438

4539
<template>
46-
<div
47-
class="wrapper_page_app"
48-
style="border: 1rem solid #000; height: 100vh; overflow-y: scroll; padding: 0.5rem"
49-
>
40+
<div class="wrapper_messenger_app">
5041
<!-- Header Tailwind -->
5142
<div class="header_wrapper sticky top-0 left-0 right-0">
5243
<div class="container mx-auto">
@@ -336,13 +327,11 @@ let logout = () => {
336327
export default {
337328
data() {
338329
return {
339-
// تعريف الخاصية
340-
visibleAddBoard: false,
341330
isDropdownOpen: false,
342331
}
343332
},
344333
mounted() {
345-
document.title = 'Trello | Home'
334+
document.title = 'Messenger | Home'
346335
},
347336
methods: {
348337
toggleDropdown() {
@@ -355,79 +344,4 @@ export default {
355344
}
356345
</script>
357346

358-
<style lang="scss">
359-
.header_right_section {
360-
a,
361-
RouterLink {
362-
margin: 0 0.5rem;
363-
}
364-
}
365-
366-
.wrapper_page_app {
367-
.header_wrapper {
368-
border-bottom: 1px solid #99999985;
369-
z-index: 7;
370-
.container {
371-
.header_inner {
372-
.header_card {
373-
border-radius: 0;
374-
box-shadow: none;
375-
376-
> div {
377-
padding: 0;
378-
379-
header.header_header {
380-
nav.header_nav {
381-
.header_content {
382-
.header_content_inner {
383-
.header_mobile_menu_button {
384-
button {
385-
border: 0.1rem solid #085dd8;
386-
}
387-
}
388-
389-
.header_wrapper_links {
390-
.header_logo_link {
391-
.logo {
392-
img {
393-
}
394-
}
395-
}
396-
397-
.header_main_links {
398-
.header_main_link {
399-
a {
400-
}
401-
402-
button {
403-
background-color: #085dd8;
404-
border: 0;
405-
color: white;
406-
}
407-
}
408-
}
409-
}
410-
411-
.header_wrapper_profile_search {
412-
.header_input_search {
413-
margin: 0 0.5rem;
414-
height: 30px;
415-
416-
input {
417-
border-radius: 3px;
418-
height: 100%;
419-
box-shadow: none;
420-
}
421-
}
422-
}
423-
}
424-
}
425-
}
426-
}
427-
}
428-
}
429-
}
430-
}
431-
}
432-
}
433-
</style>
347+
<style lang="scss"></style>
345 KB
Loading
Loading

0 commit comments

Comments
 (0)