Clean up Msg objects

This commit is contained in:
Griatch 2021-05-15 00:33:11 +02:00
parent 3218d74381
commit e38604ab02
3 changed files with 89 additions and 96 deletions

View file

@ -0,0 +1,26 @@
# Generated by Django 2.2.16 on 2021-05-14 22:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('comms', '0019_auto_20210514_2032'),
]
operations = [
migrations.RemoveField(
model_name='msg',
name='db_hide_from_channels',
),
migrations.RemoveField(
model_name='msg',
name='db_receivers_channels',
),
migrations.AddField(
model_name='msg',
name='db_receiver_external',
field=models.CharField(blank=True, db_index=True, help_text='identifier for single external receiver, for use with receivers without a database existence.', max_length=1024, null=True, verbose_name='external receiver'),
),
]

View file

@ -53,17 +53,16 @@ class Msg(SharedMemoryModel):
- db_sender_accounts: Account senders - db_sender_accounts: Account senders
- db_sender_objects: Object senders - db_sender_objects: Object senders
- db_sender_scripts: Script senders - db_sender_scripts: Script senders
- db_sender_external: External senders (defined as string names) - db_sender_external: External sender (defined as string name)
- db_receivers_accounts: Receiving accounts - db_receivers_accounts: Receiving accounts
- db_receivers_objects: Receiving objects - db_receivers_objects: Receiving objects
- db_receivers_scripts: Receiveing scripts - db_receivers_scripts: Receiveing scripts
- db_receivers_channels: Receiving channels - db_receiver_external: External sender (defined as string name)
- db_header: Header text - db_header: Header text
- db_message: The actual message text - db_message: The actual message text
- db_date_created: time message was created / sent - db_date_created: time message was created / sent
- db_hide_from_sender: bool if message should be hidden from sender - db_hide_from_sender: bool if message should be hidden from sender
- db_hide_from_receivers: list of receiver objects to hide message from - db_hide_from_receivers: list of receiver objects to hide message from
- db_hide_from_channels: list of channels objects to hide message from
- db_lock_storage: Internal storage of lock strings. - db_lock_storage: Internal storage of lock strings.
""" """
@ -75,9 +74,6 @@ class Msg(SharedMemoryModel):
# These databse fields are all set using their corresponding properties, # These databse fields are all set using their corresponding properties,
# named same as the field, but withtout the db_* prefix. # named same as the field, but withtout the db_* prefix.
# Sender is either an account, an object or an external sender, like
# an IRC channel; normally there is only one, but if co-modification of
# a message is allowed, there may be more than one "author"
db_sender_accounts = models.ManyToManyField( db_sender_accounts = models.ManyToManyField(
"accounts.AccountDB", "accounts.AccountDB",
related_name="sender_account_set", related_name="sender_account_set",
@ -109,9 +105,7 @@ class Msg(SharedMemoryModel):
help_text="identifier for external sender, for example a sender over an " help_text="identifier for external sender, for example a sender over an "
"IRC connection (i.e. someone who doesn't have an exixtence in-game).", "IRC connection (i.e. someone who doesn't have an exixtence in-game).",
) )
# The destination objects of this message. Stored as a
# comma-separated string of object dbrefs. Can be defined along
# with channels below.
db_receivers_accounts = models.ManyToManyField( db_receivers_accounts = models.ManyToManyField(
"accounts.AccountDB", "accounts.AccountDB",
related_name="receiver_account_set", related_name="receiver_account_set",
@ -131,8 +125,15 @@ class Msg(SharedMemoryModel):
blank=True, blank=True,
help_text="script_receivers", help_text="script_receivers",
) )
db_receivers_channels = models.ManyToManyField(
"ChannelDB", related_name="channel_set", blank=True, help_text="channel recievers" db_receiver_external = models.CharField(
"external receiver",
max_length=1024,
null=True,
blank=True,
db_index=True,
help_text="identifier for single external receiver, for use with "
"receivers without a database existence."
) )
# header could be used for meta-info about the message if your system needs # header could be used for meta-info about the message if your system needs
@ -149,7 +150,7 @@ class Msg(SharedMemoryModel):
"locks", blank=True, help_text="access locks on this message." "locks", blank=True, help_text="access locks on this message."
) )
# these can be used to filter/hide a given message from supplied objects/accounts/channels # these can be used to filter/hide a given message from supplied objects/accounts
db_hide_from_accounts = models.ManyToManyField( db_hide_from_accounts = models.ManyToManyField(
"accounts.AccountDB", related_name="hide_from_accounts_set", blank=True "accounts.AccountDB", related_name="hide_from_accounts_set", blank=True
) )
@ -157,10 +158,6 @@ class Msg(SharedMemoryModel):
db_hide_from_objects = models.ManyToManyField( db_hide_from_objects = models.ManyToManyField(
"objects.ObjectDB", related_name="hide_from_objects_set", blank=True "objects.ObjectDB", related_name="hide_from_objects_set", blank=True
) )
# NOTE: deprecated in 1.0. Not used for channels anymore
db_hide_from_channels = models.ManyToManyField(
"ChannelDB", related_name="hide_from_channels_set", blank=True
)
db_tags = models.ManyToManyField( db_tags = models.ManyToManyField(
Tag, Tag,
@ -172,10 +169,6 @@ class Msg(SharedMemoryModel):
objects = managers.MsgManager() objects = managers.MsgManager()
_is_deleted = False _is_deleted = False
def __init__(self, *args, **kwargs):
SharedMemoryModel.__init__(self, *args, **kwargs)
self.extra_senders = []
class Meta(object): class Meta(object):
"Define Django meta options" "Define Django meta options"
verbose_name = "Msg" verbose_name = "Msg"
@ -196,26 +189,24 @@ class Msg(SharedMemoryModel):
# value = self.attr and del self.attr respectively (where self # value = self.attr and del self.attr respectively (where self
# is the object in question). # is the object in question).
# sender property (wraps db_sender_*) @property
# @property def senders(self):
def __senders_get(self): "Getter. Allows for value = self.senders"
"Getter. Allows for value = self.sender"
return ( return (
list(self.db_sender_accounts.all()) list(self.db_sender_accounts.all())
+ list(self.db_sender_objects.all()) + list(self.db_sender_objects.all())
+ list(self.db_sender_scripts.all()) + list(self.db_sender_scripts.all())
+ self.extra_senders + [self.db_sender_external]
) )
# @sender.setter @senders.setter
def __senders_set(self, senders): def senders(self, senders):
"Setter. Allows for self.sender = value" "Setter. Allows for self.sender = value"
for sender in make_iter(senders): for sender in make_iter(senders):
if not sender: if not sender:
continue continue
if isinstance(sender, str): if isinstance(sender, str):
self.db_sender_external = sender self.db_sender_external = sender
self.extra_senders.append(sender)
self.save(update_fields=["db_sender_external"]) self.save(update_fields=["db_sender_external"])
continue continue
if not hasattr(sender, "__dbclass__"): if not hasattr(sender, "__dbclass__"):
@ -228,32 +219,32 @@ class Msg(SharedMemoryModel):
elif clsname == "ScriptDB": elif clsname == "ScriptDB":
self.db_sender_scripts.add(sender) self.db_sender_scripts.add(sender)
# @sender.deleter @senders.deleter
def __senders_del(self): def senders(self):
"Deleter. Clears all senders" "Deleter. Clears all senders"
self.db_sender_accounts.clear() self.db_sender_accounts.clear()
self.db_sender_objects.clear() self.db_sender_objects.clear()
self.db_sender_scripts.clear() self.db_sender_scripts.clear()
self.db_sender_external = "" self.db_sender_external = ""
self.extra_senders = []
self.save() self.save()
senders = property(__senders_get, __senders_set, __senders_del)
def remove_sender(self, senders): def remove_sender(self, senders):
""" """
Remove a single sender or a list of senders. Remove a single sender or a list of senders.
Args: Args:
senders (Account, Object, str or list): Senders to remove. senders (Account, Object, str or list): Senders to remove.
If a string, removes the external sender.
""" """
if isinstance(senders, str):
self.db_sender_external = ""
self.save(update_fields=["db_sender_external"])
return
for sender in make_iter(senders): for sender in make_iter(senders):
if not sender: if not sender:
continue continue
if isinstance(sender, str):
self.db_sender_external = ""
self.save(update_fields=["db_sender_external"])
if not hasattr(sender, "__dbclass__"): if not hasattr(sender, "__dbclass__"):
raise ValueError("This is a not a typeclassed object!") raise ValueError("This is a not a typeclassed object!")
clsname = sender.__dbclass__.__name__ clsname = sender.__dbclass__.__name__
@ -268,21 +259,29 @@ class Msg(SharedMemoryModel):
def receivers(self): def receivers(self):
""" """
Getter. Allows for value = self.receivers. Getter. Allows for value = self.receivers.
Returns four lists of receivers: accounts, objects, scripts and channels. Returns four lists of receivers: accounts, objects, scripts and
external_receivers.
""" """
return ( return (
list(self.db_receivers_accounts.all()) list(self.db_receivers_accounts.all())
+ list(self.db_receivers_objects.all()) + list(self.db_receivers_objects.all())
+ list(self.db_receivers_scripts.all()) + list(self.db_receivers_scripts.all())
+ list(self.db_receivers_channels.all()) + [self.db_receiver_external]
) )
@receivers.setter @receivers.setter
def receivers(self, receivers): def receivers(self, receivers):
""" """
Setter. Allows for self.receivers = value. Setter. Allows for self.receivers = value. This appends a new receiver
This appends a new receiver to the message. to the message. If a string, replaces an external receiver.
""" """
if isinstance(receivers, str):
self.db_receiver_external = receivers
self.save(update_fields=['db_receiver_external'])
return
for receiver in make_iter(receivers): for receiver in make_iter(receivers):
if not receiver: if not receiver:
continue continue
@ -295,8 +294,6 @@ class Msg(SharedMemoryModel):
self.db_receivers_accounts.add(receiver) self.db_receivers_accounts.add(receiver)
elif clsname == "ScriptDB": elif clsname == "ScriptDB":
self.db_receivers_scripts.add(receiver) self.db_receivers_scripts.add(receiver)
elif clsname == "ChannelDB":
self.db_receivers_channels.add(receiver)
@receivers.deleter @receivers.deleter
def receivers(self): def receivers(self):
@ -304,22 +301,28 @@ class Msg(SharedMemoryModel):
self.db_receivers_accounts.clear() self.db_receivers_accounts.clear()
self.db_receivers_objects.clear() self.db_receivers_objects.clear()
self.db_receivers_scripts.clear() self.db_receivers_scripts.clear()
self.db_receivers_channels.clear() self.db_receiver_external = ""
self.save() self.save()
def remove_receiver(self, receivers): def remove_receiver(self, receivers):
""" """
Remove a single receiver or a list of receivers. Remove a single receiver, a list of receivers, or a single extral receiver.
Args: Args:
receivers (Account, Object, Script, Channel or list): Receiver to remove. receivers (Account, Object, Script, list or str): Receiver
to remove. A string removes the external receiver.
""" """
if isinstance(receivers, str):
self.db_receiver_external = ""
self.save(update_fields="db_receiver_external")
return
for receiver in make_iter(receivers): for receiver in make_iter(receivers):
if not receiver: if not receiver:
continue continue
if not hasattr(receiver, "__dbclass__"): elif not hasattr(receiver, "__dbclass__"):
raise ValueError("This is a not a typeclassed object!") raise ValueError("This is a not a typeclassed object!")
clsname = receiver.__dbclass__.__name__ clsname = receiver.__dbclass__.__name__
if clsname == "ObjectDB": if clsname == "ObjectDB":
@ -328,41 +331,17 @@ class Msg(SharedMemoryModel):
self.db_receivers_accounts.remove(receiver) self.db_receivers_accounts.remove(receiver)
elif clsname == "ScriptDB": elif clsname == "ScriptDB":
self.db_receivers_scripts.remove(receiver) self.db_receivers_scripts.remove(receiver)
elif clsname == "ChannelDB":
self.db_receivers_channels.remove(receiver)
# channels property
# @property
def __channels_get(self):
"Getter. Allows for value = self.channels. Returns a list of channels."
return self.db_receivers_channels.all()
# @channels.setter
def __channels_set(self, value):
"""
Setter. Allows for self.channels = value.
Requires a channel to be added.
"""
for val in (v for v in make_iter(value) if v):
self.db_receivers_channels.add(val)
# @channels.deleter
def __channels_del(self):
"Deleter. Allows for del self.channels"
self.db_receivers_channels.clear()
self.save()
channels = property(__channels_get, __channels_set, __channels_del)
def __hide_from_get(self): def __hide_from_get(self):
""" """
Getter. Allows for value = self.hide_from. Getter. Allows for value = self.hide_from.
Returns 3 lists of accounts, objects and channels Returns two lists of accounts and objects.
""" """
return ( return (
self.db_hide_from_accounts.all(), self.db_hide_from_accounts.all(),
self.db_hide_from_objects.all(), self.db_hide_from_objects.all(),
self.db_hide_from_channels.all(),
) )
# @hide_from_sender.setter # @hide_from_sender.setter
@ -378,15 +357,12 @@ class Msg(SharedMemoryModel):
self.db_hide_from_accounts.add(hider.__dbclass__) self.db_hide_from_accounts.add(hider.__dbclass__)
elif clsname == "ObjectDB": elif clsname == "ObjectDB":
self.db_hide_from_objects.add(hider.__dbclass__) self.db_hide_from_objects.add(hider.__dbclass__)
elif clsname == "ChannelDB":
self.db_hide_from_channels.add(hider.__dbclass__)
# @hide_from_sender.deleter # @hide_from_sender.deleter
def __hide_from_del(self): def __hide_from_del(self):
"Deleter. Allows for del self.hide_from_senders" "Deleter. Allows for del self.hide_from_senders"
self.db_hide_from_accounts.clear() self.db_hide_from_accounts.clear()
self.db_hide_from_objects.clear() self.db_hide_from_objects.clear()
self.db_hide_from_channels.clear()
self.save() self.save()
hide_from = property(__hide_from_get, __hide_from_set, __hide_from_del) hide_from = property(__hide_from_get, __hide_from_set, __hide_from_del)
@ -398,11 +374,7 @@ class Msg(SharedMemoryModel):
def __str__(self): def __str__(self):
"This handles what is shown when e.g. printing the message" "This handles what is shown when e.g. printing the message"
senders = ",".join(getattr(obj, "key", str(obj)) for obj in self.senders) senders = ",".join(getattr(obj, "key", str(obj)) for obj in self.senders)
receivers = ",".join(getattr(obj, "key", str(obj)) for obj in self.receivers)
receivers = ",".join(
["[%s]" % getattr(obj, "key", str(obj)) for obj in self.channels]
+ [getattr(obj, "key", str(obj)) for obj in self.receivers]
)
return "%s->%s: %s" % (senders, receivers, crop(self.message, width=40)) return "%s->%s: %s" % (senders, receivers, crop(self.message, width=40))
def access(self, accessing_obj, access_type="read", default=False): def access(self, accessing_obj, access_type="read", default=False):
@ -440,7 +412,6 @@ class TempMsg(object):
self, self,
senders=None, senders=None,
receivers=None, receivers=None,
channels=None,
message="", message="",
header="", header="",
type="", type="",
@ -452,18 +423,16 @@ class TempMsg(object):
Args: Args:
senders (any or list, optional): Senders of the message. senders (any or list, optional): Senders of the message.
receivers (Account, Object, Channel or list, optional): Receivers of this message. receivers (Account, Object, Script or list, optional): Receivers of this message.
channels (Channel or list, optional): Channels to send to.
message (str, optional): Message to send. message (str, optional): Message to send.
header (str, optional): Header of message. header (str, optional): Header of message.
type (str, optional): Message class, if any. type (str, optional): Message class, if any.
lockstring (str, optional): Lock for the message. lockstring (str, optional): Lock for the message.
hide_from (Account, Object, Channel or list, optional): Entities to hide this message from. hide_from (Account, Object, or list, optional): Entities to hide this message from.
""" """
self.senders = senders and make_iter(senders) or [] self.senders = senders and make_iter(senders) or []
self.receivers = receivers and make_iter(receivers) or [] self.receivers = receivers and make_iter(receivers) or []
self.channels = channels and make_iter(channels) or []
self.type = type self.type = type
self.header = header self.header = header
self.message = message self.message = message
@ -480,9 +449,7 @@ class TempMsg(object):
This handles what is shown when e.g. printing the message. This handles what is shown when e.g. printing the message.
""" """
senders = ",".join(obj.key for obj in self.senders) senders = ",".join(obj.key for obj in self.senders)
receivers = ",".join( receivers = ",".join(obj.key for obj in self.receivers)
["[%s]" % obj.key for obj in self.channels] + [obj.key for obj in self.receivers]
)
return "%s->%s: %s" % (senders, receivers, crop(self.message, width=40)) return "%s->%s: %s" % (senders, receivers, crop(self.message, width=40))
def remove_sender(self, sender): def remove_sender(self, sender):
@ -504,7 +471,7 @@ class TempMsg(object):
Remove a receiver or a list of receivers Remove a receiver or a list of receivers
Args: Args:
receiver (Object, Account, Channel, str or list): Receivers to remove. receiver (Object, Account, Script, str or list): Receivers to remove.
""" """
for o in make_iter(receiver): for o in make_iter(receiver):

View file

@ -373,17 +373,17 @@ def create_message(
message (str): Text with the message. Eventual headers, titles message (str): Text with the message. Eventual headers, titles
etc should all be included in this text string. Formatting etc should all be included in this text string. Formatting
will be retained. will be retained.
receivers (Object, Account or list): An Account/Object to send receivers (Object, Account, Script, str or list): An Account/Object to send
to, or a list of them. to, or a list of them. If a string, it's an identifier for an external
receiver.
locks (str): Lock definition string. locks (str): Lock definition string.
tags (list): A list of tags or tuples `(tag, category)`. tags (list): A list of tags or tuples `(tag, category)`.
header (str): Mime-type or other optional information for the message header (str): Mime-type or other optional information for the message
Notes: Notes:
The Comm system is created very open-ended, so it's fully possible The Comm system is created to be very open-ended, so it's fully
to let a message both go to several channels and to several possible to let a message both go several receivers at the same time,
receivers at the same time, it's up to the command definitions to it's up to the command definitions to limit this as desired.
limit this as desired.
""" """
if 'channels' in kwargs: if 'channels' in kwargs: