diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2421b9c --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +# vim +*.un~ +*.swp + +# cache +__pycache__/ diff --git a/dkt/database/migrations/0001_initial.py b/dkt/database/migrations/0001_initial.py index 2430587..660bd57 100644 --- a/dkt/database/migrations/0001_initial.py +++ b/dkt/database/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 3.0.5 on 2020-04-24 17:49 +# Generated by Django 3.0.1 on 2020-05-09 11:03 from django.db import migrations, models @@ -11,15 +11,51 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='COURSE', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('course_id', models.CharField(default='', max_length=64)), + ('s_account', models.CharField(default='', max_length=64)), + ('t_account', models.CharField(default='', max_length=64)), + ('category', models.CharField(default='default', max_length=64)), + ('status', models.CharField(default='', max_length=64)), + ('info', models.CharField(default='', max_length=2048)), + ('start_time', models.IntegerField(default=0)), + ('finish_time', models.IntegerField(default=0)), + ], + options={ + 'verbose_name': '课程表', + 'db_table': 'dkt_course', + }, + ), + migrations.CreateModel( + name='MESSAGE', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('course_id', models.CharField(default='', max_length=64)), + ('t_account', models.CharField(default='', max_length=64)), + ('receiver', models.CharField(default='all', max_length=64)), + ('_t', models.IntegerField(default=1589022197)), + ('msg', models.CharField(default='', max_length=2048)), + ], + options={ + 'verbose_name': '消息表', + 'db_table': 'dkt_message', + 'ordering': ('-_t',), + }, + ), migrations.CreateModel( name='USERS', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('account', models.CharField(max_length=64)), - ('password', models.CharField(max_length=64)), - ('access_key', models.CharField(max_length=128)), - ('token', models.CharField(max_length=128)), - ('info', models.CharField(max_length=2048)), + ('account', models.CharField(default='', max_length=64)), + ('password', models.CharField(default='', max_length=64)), + ('access_key', models.CharField(default='', max_length=128)), + ('token', models.CharField(default='', max_length=128)), + ('info', models.CharField(default='', max_length=2048)), + ('_t', models.IntegerField(default=0)), + ('role', models.CharField(default='student', max_length=16)), ], options={ 'verbose_name': '用户数据表', diff --git a/dkt/database/migrations/0002_auto_20200429_0808.py b/dkt/database/migrations/0002_auto_20200429_0808.py deleted file mode 100644 index b430bfd..0000000 --- a/dkt/database/migrations/0002_auto_20200429_0808.py +++ /dev/null @@ -1,59 +0,0 @@ -# Generated by Django 3.0.5 on 2020-04-29 08:08 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('database', '0001_initial'), - ] - - operations = [ - migrations.CreateModel( - name='COURSE', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('course_id', models.CharField(default='', max_length=64)), - ('s_account', models.CharField(default='', max_length=64)), - ('t_account', models.CharField(default='', max_length=64)), - ('start_time', models.IntegerField(default=0)), - ('finish_time', models.IntegerField(default=0)), - ('info', models.CharField(default='', max_length=2048)), - ], - options={ - 'verbose_name': '课程表', - 'db_table': 'dkt_course', - }, - ), - migrations.AddField( - model_name='users', - name='_t', - field=models.IntegerField(default=0), - ), - migrations.AlterField( - model_name='users', - name='access_key', - field=models.CharField(default='', max_length=128), - ), - migrations.AlterField( - model_name='users', - name='account', - field=models.CharField(default='', max_length=64), - ), - migrations.AlterField( - model_name='users', - name='info', - field=models.CharField(default='', max_length=2048), - ), - migrations.AlterField( - model_name='users', - name='password', - field=models.CharField(default='', max_length=64), - ), - migrations.AlterField( - model_name='users', - name='token', - field=models.CharField(default='', max_length=128), - ), - ] diff --git a/dkt/database/migrations/0002_auto_20200509_1109.py b/dkt/database/migrations/0002_auto_20200509_1109.py new file mode 100644 index 0000000..0a070d5 --- /dev/null +++ b/dkt/database/migrations/0002_auto_20200509_1109.py @@ -0,0 +1,18 @@ +# Generated by Django 3.0.1 on 2020-05-09 11:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('database', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='message', + name='_t', + field=models.IntegerField(default=1589022546), + ), + ] diff --git a/dkt/database/migrations/0003_auto_20200510_1012.py b/dkt/database/migrations/0003_auto_20200510_1012.py new file mode 100644 index 0000000..13c2418 --- /dev/null +++ b/dkt/database/migrations/0003_auto_20200510_1012.py @@ -0,0 +1,32 @@ +# Generated by Django 3.0.1 on 2020-05-10 10:12 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('database', '0002_auto_20200509_1109'), + ] + + operations = [ + migrations.CreateModel( + name='MESSAGES', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('course_id', models.CharField(default='', max_length=64)), + ('sender', models.CharField(default='', max_length=64)), + ('receiver', models.CharField(default='', max_length=64)), + ('_t', models.IntegerField(default=1589105519)), + ('msg', models.CharField(default='', max_length=2048)), + ], + options={ + 'verbose_name': '消息表', + 'db_table': 'dkt_messages', + 'ordering': ('-_t',), + }, + ), + migrations.DeleteModel( + name='MESSAGE', + ), + ] diff --git a/dkt/database/models.py b/dkt/database/models.py index 53415de..3965399 100644 --- a/dkt/database/models.py +++ b/dkt/database/models.py @@ -1,6 +1,6 @@ # coding=utf-8 from django.db import models - +import time # Create your models here. @@ -16,6 +16,7 @@ class Meta: token = models.CharField(max_length=128, default='') info = models.CharField(max_length=2048, default='') _t = models.IntegerField(default=0) + role = models.CharField(max_length=16, default='student') class COURSE(models.Model): @@ -31,3 +32,15 @@ class Meta: info = models.CharField(max_length=2048, default='') start_time = models.IntegerField(default=0) finish_time = models.IntegerField(default=0) + +class MESSAGES(models.Model): + class Meta: + verbose_name = '消息表' + db_table = 'dkt_messages' + ordering = ('-_t', ) + + course_id = models.CharField(max_length=64, default='') + sender = models.CharField(max_length=64, default='') + receiver = models.CharField(max_length=64, default='') + _t = models.IntegerField(default=int(time.time())) + msg = models.CharField(max_length=2048, default='') diff --git a/dkt/service/message.py b/dkt/service/message.py new file mode 100644 index 0000000..16a77f6 --- /dev/null +++ b/dkt/service/message.py @@ -0,0 +1,57 @@ +# coding=utf-8 +""" +用户消息接收和发布 +""" + +import time +from django.db.models import Q + +from dkt.database.models import MESSAGES +from dkt.database.models import USERS +from dkt.database.models import COURSE +from dkt.const import ObjectStatus + +def get_message(request, post_data): + """ + 获取对话列表, 或者历史公告 + :param request: + :param post_data: + """ + + receiver = post_data.get('account') + course_id = post_data.get('course_id') + since = post_data.get('since', int(time.time())) + sender = post_data.get('sender') + + if sender == 'pub': + msgs = MESSAGES.objects.filter(course_id=course_id, receiver='all', _t__lte=since)[:10] + else: + msgs = MESSAGES.objects.filter(course_id=course_id, sender=sender, receiver=receiver, _t__lte=since)[:10] + + res = [] + for msg in msgs: + res.append({'_t': msg._t, 'msg': msg.msg, 'sender': msg.sender}) + return res + +def pub_message(request, post_data): + """ + 老师发布消息 + :param request: + :param post_data: + """ + + course_id = post_data.get('course_id') + sender = post_data.get('account') + receiver = post_data.get('receiver') + msg = post_data.get('msg') + + if not COURSE.objects.filter(Q(course_id=course_id), Q(t_account=sender)|Q(s_account=sender)): + return "Course and sender can't match!" + if receiver != 'all' and not COURSE.objects.filter(Q(course_id=course_id), Q(t_account=receiver)|Q(s_account=receiver)): + return "Course and receiver can't match!" + if receiver == 'all' and USERS.objects.get(account=sender).role != 'teacher': + return "Can't send to all, because you are not a teacher!" + + MESSAGES.objects.create(course_id=course_id, sender=sender, receiver=receiver, _t=int(time.time()), msg=msg) + + return ObjectStatus.SUCCESS.value diff --git a/dkt/urls.py b/dkt/urls.py index 2fe0f12..5905e67 100644 --- a/dkt/urls.py +++ b/dkt/urls.py @@ -34,5 +34,8 @@ path('main/search_my_courses/', SearchMyCourses), path('main/search_public_courses/', SearchPublicCourses), path('main/publish_course/', PublishCourse), - path('main/check_course/', CheckCourse) + path('main/check_course/', CheckCourse), + # message 界面 + path('message/get_msg/', GetMessage), + path('message/pub_msg/', PubMessage), ] diff --git a/dkt/view.py b/dkt/view.py index 5366e45..6c53e4c 100644 --- a/dkt/view.py +++ b/dkt/view.py @@ -7,6 +7,7 @@ from dkt.service.login import * from dkt.service.main import * from dkt.service.people import * +from dkt.service.message import * # login 界面 @@ -96,3 +97,18 @@ def PublishCourse(request, post_data): def CheckCourse(request, post_data): return check_course(request, post_data) + +# message 界面 +# ========================================== +@post_format +@rest_view +@permission_validation +def GetMessage(request, post_data): + return get_message(request, post_data) + + +@post_format +@rest_view +@permission_validation +def PubMessage(request, post_data): + return pub_message(request, post_data)