Increase security and reformat
This commit is contained in:
109
core/models.py
109
core/models.py
@@ -20,14 +20,14 @@ SERVICE_CHOICES = (
|
||||
)
|
||||
CHANNEL_SERVICE_CHOICES = SERVICE_CHOICES + (("web", "Web"),)
|
||||
MBTI_CHOICES = (
|
||||
("INTJ", "INTJ - Architect"),# ;)
|
||||
("INTJ", "INTJ - Architect"), # ;)
|
||||
("INTP", "INTP - Logician"),
|
||||
("ENTJ", "ENTJ - Commander"),
|
||||
("ENTP", "ENTP - Debater"),
|
||||
("INFJ", "INFJ - Advocate"),
|
||||
("INFP", "INFP - Mediator"),
|
||||
("ENFJ", "ENFJ - Protagonist"),
|
||||
("ENFP", "ENFP - Campaigner"), # <3
|
||||
("ENFP", "ENFP - Campaigner"), # <3
|
||||
("ISTJ", "ISTJ - Logistician"),
|
||||
("ISFJ", "ISFJ - Defender"),
|
||||
("ESTJ", "ESTJ - Executive"),
|
||||
@@ -241,17 +241,13 @@ class PlatformChatLink(models.Model):
|
||||
raise ValidationError("Person must belong to the same user.")
|
||||
if self.person_identifier_id:
|
||||
if self.person_identifier.user_id != self.user_id:
|
||||
raise ValidationError(
|
||||
"Person identifier must belong to the same user."
|
||||
)
|
||||
raise ValidationError("Person identifier must belong to the same user.")
|
||||
if self.person_identifier.person_id != self.person_id:
|
||||
raise ValidationError(
|
||||
"Person identifier must belong to the selected person."
|
||||
)
|
||||
if self.person_identifier.service != self.service:
|
||||
raise ValidationError(
|
||||
"Chat links cannot be linked across platforms."
|
||||
)
|
||||
raise ValidationError("Chat links cannot be linked across platforms.")
|
||||
|
||||
def save(self, *args, **kwargs):
|
||||
value = str(self.chat_identifier or "").strip()
|
||||
@@ -1869,9 +1865,7 @@ class PatternArtifactExport(models.Model):
|
||||
|
||||
|
||||
class CommandProfile(models.Model):
|
||||
WINDOW_SCOPE_CHOICES = (
|
||||
("conversation", "Conversation"),
|
||||
)
|
||||
WINDOW_SCOPE_CHOICES = (("conversation", "Conversation"),)
|
||||
VISIBILITY_CHOICES = (
|
||||
("status_in_source", "Status In Source"),
|
||||
("silent", "Silent"),
|
||||
@@ -2039,7 +2033,9 @@ class BusinessPlanDocument(models.Model):
|
||||
class Meta:
|
||||
indexes = [
|
||||
models.Index(fields=["user", "status", "updated_at"]),
|
||||
models.Index(fields=["user", "source_service", "source_channel_identifier"]),
|
||||
models.Index(
|
||||
fields=["user", "source_service", "source_channel_identifier"]
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@@ -2243,7 +2239,9 @@ class TranslationEventLog(models.Model):
|
||||
|
||||
class AnswerMemory(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="answer_memory")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="answer_memory"
|
||||
)
|
||||
service = models.CharField(max_length=255, choices=CHANNEL_SERVICE_CHOICES)
|
||||
channel_identifier = models.CharField(max_length=255)
|
||||
question_fingerprint = models.CharField(max_length=128)
|
||||
@@ -2261,7 +2259,9 @@ class AnswerMemory(models.Model):
|
||||
|
||||
class Meta:
|
||||
indexes = [
|
||||
models.Index(fields=["user", "service", "channel_identifier", "created_at"]),
|
||||
models.Index(
|
||||
fields=["user", "service", "channel_identifier", "created_at"]
|
||||
),
|
||||
models.Index(fields=["user", "question_fingerprint", "created_at"]),
|
||||
]
|
||||
|
||||
@@ -2284,7 +2284,9 @@ class AnswerSuggestionEvent(models.Model):
|
||||
on_delete=models.CASCADE,
|
||||
related_name="answer_suggestion_events",
|
||||
)
|
||||
status = models.CharField(max_length=32, choices=STATUS_CHOICES, default="suggested")
|
||||
status = models.CharField(
|
||||
max_length=32, choices=STATUS_CHOICES, default="suggested"
|
||||
)
|
||||
candidate_answer = models.ForeignKey(
|
||||
AnswerMemory,
|
||||
on_delete=models.SET_NULL,
|
||||
@@ -2305,7 +2307,9 @@ class AnswerSuggestionEvent(models.Model):
|
||||
|
||||
class TaskProject(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="task_projects")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="task_projects"
|
||||
)
|
||||
name = models.CharField(max_length=255)
|
||||
external_key = models.CharField(max_length=255, blank=True, default="")
|
||||
active = models.BooleanField(default=True)
|
||||
@@ -2349,7 +2353,9 @@ class TaskEpic(models.Model):
|
||||
|
||||
class ChatTaskSource(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="chat_task_sources")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="chat_task_sources"
|
||||
)
|
||||
service = models.CharField(max_length=255, choices=CHANNEL_SERVICE_CHOICES)
|
||||
channel_identifier = models.CharField(max_length=255)
|
||||
project = models.ForeignKey(
|
||||
@@ -2378,7 +2384,9 @@ class ChatTaskSource(models.Model):
|
||||
|
||||
class DerivedTask(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="derived_tasks")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="derived_tasks"
|
||||
)
|
||||
project = models.ForeignKey(
|
||||
TaskProject,
|
||||
on_delete=models.CASCADE,
|
||||
@@ -2574,7 +2582,9 @@ class ExternalSyncEvent(models.Model):
|
||||
)
|
||||
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="external_sync_events")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="external_sync_events"
|
||||
)
|
||||
task = models.ForeignKey(
|
||||
DerivedTask,
|
||||
on_delete=models.SET_NULL,
|
||||
@@ -2606,7 +2616,9 @@ class ExternalSyncEvent(models.Model):
|
||||
|
||||
class TaskProviderConfig(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="task_provider_configs")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="task_provider_configs"
|
||||
)
|
||||
provider = models.CharField(max_length=64, default="mock")
|
||||
enabled = models.BooleanField(default=False)
|
||||
settings = models.JSONField(default=dict, blank=True)
|
||||
@@ -2684,7 +2696,9 @@ class CodexRun(models.Model):
|
||||
class Meta:
|
||||
indexes = [
|
||||
models.Index(fields=["user", "status", "updated_at"]),
|
||||
models.Index(fields=["user", "source_service", "source_channel", "created_at"]),
|
||||
models.Index(
|
||||
fields=["user", "source_service", "source_channel", "created_at"]
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@@ -2697,7 +2711,9 @@ class CodexPermissionRequest(models.Model):
|
||||
)
|
||||
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="codex_permission_requests")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="codex_permission_requests"
|
||||
)
|
||||
codex_run = models.ForeignKey(
|
||||
CodexRun,
|
||||
on_delete=models.CASCADE,
|
||||
@@ -2910,7 +2926,49 @@ class UserXmppOmemoState(models.Model):
|
||||
|
||||
class Meta:
|
||||
indexes = [
|
||||
models.Index(fields=["status", "updated_at"], name="core_userxm_status_133ead_idx"),
|
||||
models.Index(
|
||||
fields=["status", "updated_at"], name="core_userxm_status_133ead_idx"
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
class UserXmppOmemoTrustedKey(models.Model):
|
||||
KEY_TYPE_CHOICES = (
|
||||
("fingerprint", "Fingerprint"),
|
||||
("client_key", "Client key"),
|
||||
)
|
||||
|
||||
user = models.ForeignKey(
|
||||
User,
|
||||
on_delete=models.CASCADE,
|
||||
related_name="xmpp_omemo_trusted_keys",
|
||||
)
|
||||
jid = models.CharField(max_length=255, blank=True, default="")
|
||||
key_type = models.CharField(
|
||||
max_length=32, choices=KEY_TYPE_CHOICES, default="fingerprint"
|
||||
)
|
||||
key_id = models.CharField(max_length=255)
|
||||
trusted = models.BooleanField(default=False)
|
||||
source = models.CharField(max_length=64, blank=True, default="")
|
||||
last_seen_at = models.DateTimeField(blank=True, null=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
class Meta:
|
||||
constraints = [
|
||||
models.UniqueConstraint(
|
||||
fields=["user", "jid", "key_type", "key_id"],
|
||||
name="unique_user_xmpp_omemo_trusted_key",
|
||||
),
|
||||
]
|
||||
indexes = [
|
||||
models.Index(
|
||||
fields=["user", "trusted", "updated_at"],
|
||||
name="core_userxomemo_trusted_idx",
|
||||
),
|
||||
models.Index(
|
||||
fields=["user", "jid", "updated_at"], name="core_userxomemo_jid_idx"
|
||||
),
|
||||
]
|
||||
|
||||
|
||||
@@ -2921,6 +2979,7 @@ class UserXmppSecuritySettings(models.Model):
|
||||
related_name="xmpp_security_settings",
|
||||
)
|
||||
require_omemo = models.BooleanField(default=False)
|
||||
encrypt_contact_messages_with_omemo = models.BooleanField(default=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
updated_at = models.DateTimeField(auto_now=True)
|
||||
|
||||
@@ -2938,7 +2997,9 @@ class UserAccessibilitySettings(models.Model):
|
||||
|
||||
class TaskCompletionPattern(models.Model):
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="task_completion_patterns")
|
||||
user = models.ForeignKey(
|
||||
User, on_delete=models.CASCADE, related_name="task_completion_patterns"
|
||||
)
|
||||
phrase = models.CharField(max_length=64)
|
||||
enabled = models.BooleanField(default=True)
|
||||
position = models.PositiveIntegerField(default=0)
|
||||
|
||||
Reference in New Issue
Block a user