1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-09-27 23:56:18 +00:00
Files
seahub/seahub/seadoc/models.py

243 lines
8.8 KiB
Python
Raw Normal View History

2023-06-27 18:29:55 +08:00
import os
2023-06-28 14:48:59 +08:00
import posixpath
2023-06-27 18:29:55 +08:00
from django.db import models
from seahub.utils.timeutils import datetime_to_isoformat_timestr
2023-06-27 18:29:55 +08:00
from seahub.base.templatetags.seahub_tags import email2nickname
class SeadocHistoryNameManager(models.Manager):
def update_name(self, doc_uuid, obj_id, name):
if self.filter(doc_uuid=doc_uuid, obj_id=obj_id).exists():
obj = self.filter(doc_uuid=doc_uuid, obj_id=obj_id).update(name=name)
else:
obj = self.create(doc_uuid=doc_uuid, obj_id=obj_id, name=name)
return obj
def list_by_obj_ids(self, doc_uuid, obj_id_list):
return self.filter(doc_uuid=doc_uuid, obj_id__in=obj_id_list)
class SeadocHistoryName(models.Model):
doc_uuid = models.CharField(max_length=36, db_index=True)
obj_id = models.CharField(max_length=40)
name = models.CharField(max_length=255)
objects = SeadocHistoryNameManager()
class Meta:
db_table = 'history_name'
unique_together = ('doc_uuid', 'obj_id')
def to_dict(self):
return {
'doc_uuid': self.doc_uuid,
'obj_id': self.obj_id,
'name': self.name,
}
class SeadocDraftManager(models.Manager):
def get_by_doc_uuid(self, doc_uuid):
return self.filter(doc_uuid=doc_uuid).first()
2023-06-21 11:20:40 +08:00
def mask_as_draft(self, doc_uuid, repo_id, username):
return self.create(
doc_uuid=doc_uuid, repo_id=repo_id, username=username)
def unmask_as_draft(self, doc_uuid):
return self.filter(doc_uuid=doc_uuid).delete()
def list_by_doc_uuids(self, doc_uuid_list):
return self.filter(doc_uuid__in=doc_uuid_list)
2023-06-28 14:48:59 +08:00
def list_by_username(self, username, start, limit):
2023-06-30 12:07:27 +08:00
return self.filter(username=username).order_by('-id')[start:limit]
2023-06-28 14:48:59 +08:00
def list_by_repo_id(self, repo_id, start, limit):
2023-06-30 12:07:27 +08:00
return self.filter(repo_id=repo_id).order_by('-id')[start:limit]
2023-06-21 11:20:40 +08:00
class SeadocDraft(models.Model):
doc_uuid = models.CharField(max_length=36, unique=True)
2023-06-21 11:20:40 +08:00
repo_id = models.CharField(max_length=36, db_index=True)
username = models.CharField(max_length=255, db_index=True)
created_at = models.DateTimeField(auto_now_add=True)
objects = SeadocDraftManager()
class Meta:
db_table = 'sdoc_draft'
def to_dict(self):
return {
'doc_uuid': self.doc_uuid,
2023-06-21 11:20:40 +08:00
'repo_id': self.repo_id,
'username': self.username,
'created_at': datetime_to_isoformat_timestr(self.created_at),
}
2023-06-27 18:29:55 +08:00
class SeadocRevisionManager(models.Manager):
def add(self, doc_uuid, origin_doc_uuid, repo_id, origin_doc_path, username, origin_file_version):
last_revision = self.filter(repo_id=repo_id).order_by('revision_id').last()
if not last_revision:
revision_id = 1
else:
revision_id = last_revision.revision_id + 1
return self.create(
doc_uuid=doc_uuid,
origin_doc_uuid=origin_doc_uuid,
repo_id=repo_id,
revision_id=revision_id,
origin_doc_path=origin_doc_path,
username=username,
origin_file_version=origin_file_version,
)
def get_by_revision_id(self, repo_id, revision_id):
return self.filter(repo_id=repo_id, revision_id=revision_id).first()
2023-06-27 18:29:55 +08:00
def get_by_doc_uuid(self, doc_uuid):
return self.filter(doc_uuid=doc_uuid).first()
def list_by_doc_uuids(self, doc_uuid_list):
return self.filter(doc_uuid__in=doc_uuid_list)
2023-06-30 12:07:27 +08:00
def list_by_origin_doc_uuid(self, origin_doc_uuid, start, limit):
return self.filter(
origin_doc_uuid=origin_doc_uuid, is_published=False).order_by('-id')[start:limit]
def list_all_by_origin_doc_uuid(self, origin_doc_uuid):
return self.filter(
origin_doc_uuid=origin_doc_uuid, is_published=False).order_by('revision_id')
2023-06-27 18:29:55 +08:00
2023-06-28 14:48:59 +08:00
def list_by_username(self, username, start, limit):
2023-06-30 12:07:27 +08:00
return self.filter(
username=username, is_published=False).order_by('-id')[start:limit]
2023-06-27 18:29:55 +08:00
2023-06-28 14:48:59 +08:00
def list_by_repo_id(self, repo_id, start, limit):
2023-06-30 12:07:27 +08:00
return self.filter(
repo_id=repo_id, is_published=False).order_by('-id')[start:limit]
2023-06-27 18:29:55 +08:00
def publish(self, doc_uuid, publisher, publish_file_version):
return self.filter(doc_uuid=doc_uuid).update(
publisher=publisher,
publish_file_version=publish_file_version,
is_published=True,
)
def delete_by_doc_uuid(self, doc_uuid):
self.filter(doc_uuid=doc_uuid).delete()
def update_origin_file_version(self, doc_uuid, origin_file_version):
return self.filter(doc_uuid=doc_uuid).update(origin_file_version=origin_file_version)
2023-06-27 18:29:55 +08:00
class SeadocRevision(models.Model):
"""
"""
doc_uuid = models.CharField(max_length=36, unique=True)
origin_doc_uuid = models.CharField(max_length=36, db_index=True)
repo_id = models.CharField(max_length=36, db_index=True)
revision_id = models.IntegerField() # revision_id in repo
2023-06-27 18:29:55 +08:00
origin_doc_path = models.TextField() # used when origin file deleted
username = models.CharField(max_length=255, db_index=True)
origin_file_version = models.CharField(max_length=100)
publish_file_version = models.CharField(max_length=100, null=True)
publisher = models.CharField(max_length=255, null=True)
2023-06-30 12:07:27 +08:00
is_published = models.BooleanField(default=False, db_index=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
2023-06-27 18:29:55 +08:00
objects = SeadocRevisionManager()
class Meta:
db_table = 'sdoc_revision'
unique_together = ('repo_id', 'revision_id')
2023-06-27 18:29:55 +08:00
2023-06-28 14:48:59 +08:00
def to_dict(self, fileuuidmap_queryset=None):
2023-06-27 18:29:55 +08:00
from seahub.tags.models import FileUUIDMap
2023-06-28 14:48:59 +08:00
if fileuuidmap_queryset:
origin_doc_uuid = fileuuidmap_queryset.filter(uuid=self.origin_doc_uuid).first()
else:
origin_doc_uuid = FileUUIDMap.objects.get_fileuuidmap_by_uuid(self.origin_doc_uuid)
if origin_doc_uuid:
origin_parent_path = origin_doc_uuid.parent_path
origin_filename = origin_doc_uuid.filename
2023-06-27 18:29:55 +08:00
else:
origin_parent_path = os.path.dirname(self.origin_doc_path)
origin_filename = os.path.basename(self.origin_doc_path)
2023-06-28 14:48:59 +08:00
origin_file_path = posixpath.join(origin_parent_path, origin_filename)
if fileuuidmap_queryset:
doc_uuid = fileuuidmap_queryset.filter(uuid=self.doc_uuid).first()
else:
doc_uuid = FileUUIDMap.objects.get_fileuuidmap_by_uuid(self.doc_uuid)
if doc_uuid:
parent_path = doc_uuid.parent_path
filename = doc_uuid.filename
else:
parent_path = '/Revisions'
filename = self.doc_uuid + '.sdoc'
file_path = posixpath.join(parent_path, filename)
2023-06-27 18:29:55 +08:00
return {
'username': self.username,
'nickname': email2nickname(self.username),
'repo_id': self.repo_id,
'revision_id': self.revision_id,
2023-06-27 18:29:55 +08:00
'doc_uuid': self.doc_uuid,
2023-06-28 14:48:59 +08:00
'parent_path': parent_path,
'filename': filename,
'file_path': file_path,
2023-06-27 18:29:55 +08:00
'origin_doc_uuid': self.origin_doc_uuid,
'origin_parent_path': origin_parent_path,
'origin_filename': origin_filename,
2023-06-28 14:48:59 +08:00
'origin_file_path': origin_file_path,
2023-06-27 18:29:55 +08:00
'origin_file_version': self.origin_file_version,
'publish_file_version': self.publish_file_version,
'publisher': self.publisher,
'publisher_nickname': email2nickname(self.publisher),
'is_published': self.is_published,
'created_at': datetime_to_isoformat_timestr(self.created_at),
'updated_at': datetime_to_isoformat_timestr(self.updated_at),
}
class SeadocCommentReplyManager(models.Manager):
def list_by_comment_id(self, comment_id):
return self.filter(comment_id=comment_id)
def list_by_doc_uuid(self, doc_uuid):
return self.filter(doc_uuid=doc_uuid)
class SeadocCommentReply(models.Model):
author = models.CharField(max_length=255)
reply = models.TextField()
type = models.CharField(max_length=36)
comment_id = models.IntegerField(db_index=True)
doc_uuid = models.CharField(max_length=36, db_index=True)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
objects = SeadocCommentReplyManager()
class Meta:
db_table = 'sdoc_comment_reply'
def to_dict(self):
return {
'id': self.pk,
'author': self.author,
'reply': self.reply,
'type': self.type,
'comment_id': self.comment_id,
'doc_uuid': self.doc_uuid,
'created_at': datetime_to_isoformat_timestr(self.created_at),
'updated_at': datetime_to_isoformat_timestr(self.updated_at),
}