diff --git a/contrib/email-login.py b/contrib/email-login.py index 34ca98f8a0..fd1020f4df 100644 --- a/contrib/email-login.py +++ b/contrib/email-login.py @@ -38,7 +38,7 @@ from django.contrib.auth.models import User from src.players.models import PlayerDB from src.objects.models import ObjectDB from src.server.models import ServerConfig -from src.comms.models import Channel +from src.comms.models import ChannelDB from src.commands.cmdset import CmdSet from src.utils import create, logger, utils, ansi @@ -231,7 +231,7 @@ its and @/./+/-/_ only.") # this echoes the restrictions made by django's auth m # join the new player to the public channel pchanneldef = settings.CHANNEL_PUBLIC if pchanneldef: - pchannel = Channel.objects.get_channel(pchanneldef[0]) + pchannel = ChannelDB.objects.get_channel(pchanneldef[0]) if not pchannel.connect_to(new_player): string = "New player '%s' could not connect to public channel!" % new_player.key logger.log_errmsg(string) diff --git a/ev.py b/ev.py index 81e9968ea2..feb52d9280 100644 --- a/ev.py +++ b/ev.py @@ -133,7 +133,7 @@ from src.locks import lockfuncs from src.scripts.scripts import Script # comms -from src.comms.models import Msg, Channel, PlayerChannelConnection, ExternalChannelConnection +from src.comms.models import Msg, ChannelDB, PlayerChannelConnection, ExternalChannelConnection # objects from src.objects.objects import Object, Character, Room, Exit @@ -194,7 +194,7 @@ class DBmanagers(_EvContainer): from src.help.models import HelpEntry from src.players.models import PlayerDB from src.scripts.models import ScriptDB - from src.comms.models import Msg, Channel, PlayerChannelConnection, ExternalChannelConnection + from src.comms.models import Msg, ChannelDB, PlayerChannelConnection, ExternalChannelConnection from src.objects.models import ObjectDB from src.server.models import ServerConfig @@ -202,12 +202,12 @@ class DBmanagers(_EvContainer): players = PlayerDB.objects scripts = ScriptDB.objects msgs = Msg.objects - channels = Channel.objects + channels = ChannelDB.objects connections = PlayerChannelConnection.objects externalconnections = ExternalChannelConnection.objects objects = ObjectDB.objects serverconfigs = ServerConfig.objects - del HelpEntry, PlayerDB, ScriptDB, Msg, Channel, PlayerChannelConnection, + del HelpEntry, PlayerDB, ScriptDB, Msg, ChannelDB, PlayerChannelConnection, del ExternalChannelConnection, ObjectDB, ServerConfig managers = DBmanagers() diff --git a/src/commands/default/cmdset_player.py b/src/commands/default/cmdset_player.py index cb7641c924..2a63e3ee34 100644 --- a/src/commands/default/cmdset_player.py +++ b/src/commands/default/cmdset_player.py @@ -60,7 +60,7 @@ class PlayerCmdSet(CmdSet): self.add(comms.CmdChannels()) self.add(comms.CmdCdestroy()) self.add(comms.CmdChannelCreate()) - self.add(comms.CmdCset()) + self.add(comms.CmdClock()) self.add(comms.CmdCBoot()) self.add(comms.CmdCemit()) self.add(comms.CmdCWho()) diff --git a/src/commands/default/comms.py b/src/commands/default/comms.py index 555a5f7f0d..5491d9c1ec 100644 --- a/src/commands/default/comms.py +++ b/src/commands/default/comms.py @@ -8,7 +8,7 @@ for easy handling. """ from django.conf import settings -from src.comms.models import Channel, Msg, PlayerChannelConnection, ExternalChannelConnection +from src.comms.models import ChannelDB, Msg, PlayerChannelConnection, ExternalChannelConnection from src.comms import irc, imc2, rss from src.comms.channelhandler import CHANNELHANDLER from src.utils import create, utils, prettytable @@ -27,10 +27,10 @@ def find_channel(caller, channelname, silent=False, noaliases=False): Helper function for searching for a single channel with some error handling. """ - channels = Channel.objects.channel_search(channelname) + channels = ChannelDB.objects.channel_search(channelname) if not channels: if not noaliases: - channels = [chan for chan in Channel.objects.all() if channelname in chan.aliases] + channels = [chan for chan in ChannelDB.objects.get_all_channels() if channelname in chan.aliases.all()] if channels: return channels[0] if not silent: @@ -197,7 +197,7 @@ class CmdAllCom(MuxPlayerCommand): if args == "on": # get names of all channels available to listen to and activate them all - channels = [chan for chan in Channel.objects.get_all_channels() if chan.access(caller, 'listen')] + channels = [chan for chan in ChannelDB.objects.get_all_channels() if chan.access(caller, 'listen')] for channel in channels: caller.execute_cmd("addcom %s" % channel.key) elif args == "off": @@ -207,13 +207,13 @@ class CmdAllCom(MuxPlayerCommand): caller.execute_cmd("delcom %s" % channel.key) elif args == "destroy": # destroy all channels you control - channels = [chan for chan in Channel.objects.get_all_channels() if chan.access(caller, 'control')] + channels = [chan for chan in ChannelDB.objects.get_all_channels() if chan.access(caller, 'control')] for channel in channels: caller.execute_cmd("@cdestroy %s" % channel.key) elif args == "who": # run a who, listing the subscribers on visible channels. string = "\n{CChannel subscriptions{n" - channels = [chan for chan in Channel.objects.get_all_channels() if chan.access(caller, 'listen')] + channels = [chan for chan in ChannelDB.objects.get_all_channels() if chan.access(caller, 'listen')] if not channels: string += "No channels." for channel in channels: @@ -237,8 +237,8 @@ class CmdChannels(MuxPlayerCommand): @clist comlist - Lists all channels available to you, wether you listen to them or not. - Use 'comlist" to only view your current channel subscriptions. + Lists all channels available to you, whether you listen to them or not. + Use 'comlist' to only view your current channel subscriptions. Use addcom/delcom to join and leave channels """ key = "@channels" @@ -252,12 +252,14 @@ class CmdChannels(MuxPlayerCommand): caller = self.caller # all channels we have available to listen to - channels = [chan for chan in Channel.objects.get_all_channels() if chan.access(caller, 'listen')] + channels = [chan for chan in ChannelDB.objects.get_all_channels() if chan.access(caller, 'listen')] + print channels if not channels: self.msg("No channels available.") return # all channel we are already subscribed to subs = [conn.channel for conn in PlayerChannelConnection.objects.get_all_player_connections(caller)] + print subs if self.cmdstring == "comlist": # just display the subscribed channels with no extra info @@ -265,21 +267,22 @@ class CmdChannels(MuxPlayerCommand): for chan in subs: clower = chan.key.lower() nicks = caller.nicks.get(category="channel") - comtable.add_row(["%s%s" % (chan.key, chan.aliases and "(%s)" % ",".join(chan.aliases) or ""), - "%s".join(nick.db_key for nick in make_iter(nicks) if nick and nick.value.lower()==clower()), - chan.desc]) + comtable.add_row(["%s%s" % (chan.key, chan.aliases.all() and "(%s)" % ",".join(chan.aliases.all()) or ""), + "%s".join(nick for nick in make_iter(nicks) if nick and nick.lower()==clower), + chan.db.desc]) caller.msg("\n{wChannel subscriptions{n (use {w@channels{n to list all, {waddcom{n/{wdelcom{n to sub/unsub):{n\n%s" % comtable) else: # full listing (of channels caller is able to listen to) comtable = prettytable.PrettyTable(["{wsub","{wchannel","{wmy aliases","{wlocks","{wdescription"]) for chan in channels: + clower = chan.key.lower() nicks = caller.nicks.get(category="channel") - if nicks: - comtable.add_row([chan in subs and "{gYes{n" or "{rNo{n", - "%s%s" % (chan.key, chan.aliases and "(%s)" % ",".join(chan.aliases) or ""), - "%s".join(nick.db_key for nick in make_iter(nicks) if nick.value.lower()==clower()), - chan.locks, - chan.desc]) + nicks = nicks or [] + comtable.add_row([chan in subs and "{gYes{n" or "{rNo{n", + "%s%s" % (chan.key, chan.aliases.all() and "(%s)" % ",".join(chan.aliases.all()) or ""), + "%s".join(nick for nick in make_iter(nicks) if nick.lower()==clower), + str(chan.locks), + chan.db.desc]) caller.msg("\n{wAvailable channels{n (use {wcomlist{n,{waddcom{n and {wdelcom{n to manage subscriptions):\n%s" % comtable) class CmdCdestroy(MuxPlayerCommand): @@ -353,7 +356,7 @@ class CmdCBoot(MuxPlayerCommand): searchstring = playername.lstrip('*') else: searchstring = self.rhs.lstrip('*') - player = self.search(searchstring, player=True) + player = self.caller.search(searchstring, player=True) if not player: return if reason: @@ -362,7 +365,7 @@ class CmdCBoot(MuxPlayerCommand): string = "You don't control this channel." self.msg(string) return - if not PlayerChannelConnection.objects.has_connection(player, channel): + if not PlayerChannelConnection.objects.has_player_connection(player, channel): string = "Player %s is not connected to channel %s." % (player.key, channel.key) self.msg(string) return @@ -370,7 +373,8 @@ class CmdCBoot(MuxPlayerCommand): string = "%s boots %s from channel.%s" % (self.caller, player.key, reason) channel.msg(string) # find all player's nicks linked to this channel and delete them - for nick in [nick for nick in player.character.nicks.get(category="channel") + for nick in [nick for nick in + player.character.nicks.get(category="channel") or [] if nick.db_real.lower() == channel.key]: nick.delete() # disconnect player @@ -497,7 +501,7 @@ class CmdChannelCreate(MuxPlayerCommand): for part in lhs.split(';', 1) if part.strip()] aliases = [alias.strip().lower() for alias in aliases.split(';') if alias.strip()] - channel = Channel.objects.channel_search(channame) + channel = ChannelDB.objects.channel_search(channame) if channel: self.msg("A channel with that name already exists.") return @@ -508,27 +512,27 @@ class CmdChannelCreate(MuxPlayerCommand): self.msg("Created channel %s and connected to it." % new_chan.key) -class CmdCset(MuxPlayerCommand): +class CmdClock(MuxPlayerCommand): """ - @cset - changes channel access restrictions + @clock - changes channel access restrictions Usage: - @cset [= ] + @clock [= ] Changes the lock access restrictions of a channel. If no lockstring was given, view the current lock definitions. """ - key = "@cset" + key = "@clock" locks = "cmd:not pperm(channel_banned)" - aliases = ["@cclock"] + aliases = ["@clock"] help_category = "Comms" def func(self): "run the function" if not self.args: - string = "Usage: @cset channel [= lockstring]" + string = "Usage: @clock channel [= lockstring]" self.msg(string) return @@ -586,7 +590,7 @@ class CmdCdesc(MuxPlayerCommand): self.msg("You cannot admin this channel.") return # set the description - channel.desc = self.rhs + channel.db.desc = self.rhs channel.save() self.msg("Description of channel '%s' set to '%s'." % (channel.key, self.rhs)) diff --git a/src/commands/default/syscommands.py b/src/commands/default/syscommands.py index cab02d66dd..bc264d98d6 100644 --- a/src/commands/default/syscommands.py +++ b/src/commands/default/syscommands.py @@ -18,7 +18,7 @@ line with a command (if there is no match to a known command, the line is just added to the editor buffer). """ -from src.comms.models import Channel +from src.comms.models import ChannelDB from src.utils import create # The command keys the engine is calling @@ -153,7 +153,7 @@ class SystemSendToChannel(MuxCommand): if not msg: caller.msg("Say what?") return - channel = Channel.objects.get_channel(channelkey) + channel = ChannelDB.objects.get_channel(channelkey) if not channel: caller.msg("Channel '%s' not found." % channelkey) return diff --git a/src/commands/default/tests.py b/src/commands/default/tests.py index bf957f8a5a..22d4fa7e54 100644 --- a/src/commands/default/tests.py +++ b/src/commands/default/tests.py @@ -247,7 +247,7 @@ class TestComms(CommandTest): self.call(comms.CmdDelCom(), "tc", "Your alias 'tc' for channel testchan was cleared.") self.call(comms.CmdChannels(), "" ,"Available channels (use comlist,addcom and delcom to manage") self.call(comms.CmdAllCom(), "", "Available channels (use comlist,addcom and delcom to manage") - self.call(comms.CmdCset(), "testchan=send:all()", "Lock(s) applied. Current locks on testchan:") + self.call(comms.CmdClock(), "testchan=send:all()", "Lock(s) applied. Current locks on testchan:") self.call(comms.CmdCdesc(), "testchan = Test Channel", "Description of channel 'testchan' set to 'Test Channel'.") self.call(comms.CmdCemit(), "testchan = Test Message", "Sent to channel testchan: [testchan] Test Message") self.call(comms.CmdCWho(), "testchan", "Channel subscriptions\ntestchan:\n TestPlayer7") diff --git a/src/commands/default/unloggedin.py b/src/commands/default/unloggedin.py index 6ac8e7daeb..1c04aef848 100644 --- a/src/commands/default/unloggedin.py +++ b/src/commands/default/unloggedin.py @@ -7,7 +7,7 @@ from django.conf import settings from src.players.models import PlayerDB from src.objects.models import ObjectDB from src.server.models import ServerConfig -from src.comms.models import Channel +from src.comms.models import ChannelDB from src.utils import create, logger, utils, ansi from src.commands.default.muxcommand import MuxCommand @@ -176,7 +176,7 @@ class CmdUnconnectedCreate(MuxCommand): # join the new player to the public channel pchanneldef = settings.CHANNEL_PUBLIC if pchanneldef: - pchannel = Channel.objects.get_channel(pchanneldef[0]) + pchannel = ChannelDB.objects.get_channel(pchanneldef[0]) if not pchannel.connect_to(new_player): string = "New player '%s' could not connect to public channel!" % new_player.key logger.log_errmsg(string) diff --git a/src/comms/__init__.py b/src/comms/__init__.py index 6338f63c97..0fd02fb3a9 100644 --- a/src/comms/__init__.py +++ b/src/comms/__init__.py @@ -9,4 +9,4 @@ Also, the initiated object manager is available as src.comms.msgmanager and src. from src.comms.models import * msgmanager = Msg.objects -channelmanager = Channel.objects +channelmanager = ChannelDB.objects diff --git a/src/comms/admin.py b/src/comms/admin.py index e207fb2660..aa680b7cd5 100644 --- a/src/comms/admin.py +++ b/src/comms/admin.py @@ -4,7 +4,7 @@ # from django.contrib import admin -from src.comms.models import Channel, Msg, PlayerChannelConnection, ExternalChannelConnection +from src.comms.models import ChannelDB, Msg, PlayerChannelConnection, ExternalChannelConnection class MsgAdmin(admin.ModelAdmin): list_display = ('id', 'db_date_sent', 'db_sender', 'db_receivers', 'db_channels', 'db_message', 'db_lock_storage') @@ -48,7 +48,7 @@ class ChannelAdmin(admin.ModelAdmin): (None, {'fields':(('db_key', 'db_aliases', 'db_desc'),'db_lock_storage', 'db_keep_log')}), ) -admin.site.register(Channel, ChannelAdmin) +admin.site.register(ChannelDB, ChannelAdmin) # class PlayerChannelConnectionAdmin(admin.ModelAdmin): # list_display = ('db_channel', 'db_player') diff --git a/src/comms/channelhandler.py b/src/comms/channelhandler.py index e020e88e95..3369df7a5e 100644 --- a/src/comms/channelhandler.py +++ b/src/comms/channelhandler.py @@ -23,7 +23,7 @@ update() on the channelhandler. Or use Channel.objects.delete() which does this for you. """ -from src.comms.models import Channel, Msg +from src.comms.models import ChannelDB, Msg from src.commands import cmdset, command from src.utils import utils @@ -64,7 +64,7 @@ class ChannelCommand(command.Command): if not msg: self.msg("Say what?") return - channel = Channel.objects.get_channel(channelkey) + channel = ChannelDB.objects.get_channel(channelkey) if not channel: self.msg("Channel '%s' not found." % channelkey) @@ -112,11 +112,9 @@ class ChannelHandler(object): def _format_help(self, channel): "builds a doc string" key = channel.key - aliases = channel.aliases - if not utils.is_iter(aliases): - aliases = [aliases] + aliases = channel.aliases.all() ustring = "%s " % key.lower() + "".join(["\n %s " % alias.lower() for alias in aliases]) - desc = channel.desc + desc = channel.db.desc string = \ """ Channel '%s' @@ -137,7 +135,7 @@ class ChannelHandler(object): """ # map the channel to a searchable command cmd = ChannelCommand(key=channel.key.strip().lower(), - aliases=channel.aliases if channel.aliases else [], + aliases=channel.aliases.all(), locks="cmd:all();%s" % channel.locks, obj=channel) cmd.__doc__= self._format_help(channel) @@ -148,7 +146,7 @@ class ChannelHandler(object): "Updates the handler completely." self.cached_channel_cmds = [] self.cached_cmdsets = {} - for channel in Channel.objects.all(): + for channel in ChannelDB.objects.get_all_channels(): self.add_channel(channel) def get_cmdset(self, source_object): diff --git a/src/comms/comms.py b/src/comms/comms.py new file mode 100644 index 0000000000..3a571b665f --- /dev/null +++ b/src/comms/comms.py @@ -0,0 +1,21 @@ +""" +Default Typeclass for Comms. + +See objects.objects for more information on Typeclassing. +""" +from src.typeclasses.typeclass import TypeClass + + +class Comm(TypeClass): + """ + This is the base class for all Comms. Inherit from this to create different + types of communication channels. + """ + def __init__(self, dbobj): + super(Comm, self).__init__(dbobj) + + def format_message(self, msg): + """ + Takes a Msg (see models.Msg), and derives the output display for it on + the channel. + """ diff --git a/src/comms/imc2.py b/src/comms/imc2.py index 07cfac24d1..a64056f30f 100644 --- a/src/comms/imc2.py +++ b/src/comms/imc2.py @@ -11,7 +11,7 @@ from django.conf import settings from src.utils import logger, create, search, utils from src.server.sessionhandler import SESSIONS from src.scripts.scripts import Script -from src.comms.models import Channel, ExternalChannelConnection +from src.comms.models import ChannelDB, ExternalChannelConnection from src.comms.imc2lib import imc2_packets as pck from src.comms.imc2lib.imc2_trackers import IMC2MudList, IMC2ChanList from src.comms.imc2lib.imc2_listeners import handle_whois_reply @@ -26,7 +26,7 @@ IMC2_CLIENT_PWD = settings.IMC2_CLIENT_PWD IMC2_SERVER_PWD = settings.IMC2_SERVER_PWD # channel to send info to -INFOCHANNEL = Channel.objects.channel_search(settings.CHANNEL_MUDINFO[0]) +INFOCHANNEL = ChannelDB.objects.channel_search(settings.CHANNEL_MUDINFO[0]) # all linked channel connections IMC2_CLIENT = None # IMC2 debug mode @@ -407,8 +407,8 @@ def create_connection(channel, imc2_channel): This will create a new IMC2<->channel connection. """ - if not type(channel) == Channel: - new_channel = Channel.objects.filter(db_key=channel) + if not type(channel) == ChannelDB: + new_channel = ChannelDB.objects.filter(db_key=channel) if not new_channel: logger.log_errmsg(_("Cannot attach IMC2<->Evennia: Evennia Channel '%s' not found") % channel) return False diff --git a/src/comms/irc.py b/src/comms/irc.py index dea4a60ae9..6c32aec5a5 100644 --- a/src/comms/irc.py +++ b/src/comms/irc.py @@ -7,13 +7,13 @@ from twisted.application import internet from twisted.words.protocols import irc from twisted.internet import protocol from django.conf import settings -from src.comms.models import ExternalChannelConnection, Channel +from src.comms.models import ExternalChannelConnection, ChannelDB from src.utils import logger, utils from src.server.sessionhandler import SESSIONS from django.utils.translation import ugettext as _ -INFOCHANNEL = Channel.objects.channel_search(settings.CHANNEL_MUDINFO[0]) +INFOCHANNEL = ChannelDB.objects.channel_search(settings.CHANNEL_MUDINFO[0]) IRC_CHANNELS = [] def msg_info(message): @@ -134,8 +134,8 @@ def create_connection(channel, irc_network, irc_port, irc_channel, irc_bot_nick) """ This will create a new IRC<->channel connection. """ - if not type(channel) == Channel: - new_channel = Channel.objects.filter(db_key=channel) + if not type(channel) == ChannelDB: + new_channel = ChannelDB.objects.filter(db_key=channel) if not new_channel: logger.log_errmsg(_("Cannot attach IRC<->Evennia: Evennia Channel '%s' not found") % channel) return False diff --git a/src/comms/managers.py b/src/comms/managers.py index d54cba0391..e1987784a8 100644 --- a/src/comms/managers.py +++ b/src/comms/managers.py @@ -6,11 +6,12 @@ import itertools from django.db import models from django.db.models import Q from django.contrib.contenttypes.models import ContentType +from src.typeclasses.managers import returns_typeclass_list, returns_typeclass _GA = object.__getattribute__ _PlayerDB = None _ObjectDB = None -_Channel = None +_ChannelDB = None _SESSIONS = None _ExternalConnection = None _User = None @@ -45,13 +46,13 @@ def dbref(dbref, reqhash=True): def identify_object(inp): "identify if an object is a player or an object; return its database model" # load global stores - global _PlayerDB, _ObjectDB, _Channel, _ExternalConnection, _User + global _PlayerDB, _ObjectDB, _ChannelDB, _ExternalConnection, _User if not _PlayerDB: from src.players.models import PlayerDB as _PlayerDB if not _ObjectDB: from src.objects.models import ObjectDB as _ObjectDB - if not _Channel: - from src.comms.models import Channel as _Channel + if not _ChannelDB: + from src.comms.models import ChannelDB as _ChannelDB if not _ExternalConnection: from src.comms.models import ExternalChannelConnection as _ExternalConnection if not _User: @@ -66,7 +67,7 @@ def identify_object(inp): typ = type(obj) if typ == _PlayerDB: return obj, "player" elif typ == _ObjectDB: return obj, "object" - elif typ == _Channel: return obj, "channel" + elif typ == _ChannelDB: return obj, "channel" elif dbref(obj): return dbref(obj), "dbref" elif typ == basestring: return obj, "string" elif typ == _ExternalConnection: return obj, "external" @@ -96,8 +97,8 @@ def to_object(inp, objtype='player'): print objtype, inp, obj, typ, type(inp) raise CommError() elif objtype == 'channel': - if typ == 'string': return _Channel.objects.get(db_key__iexact=obj) - if typ == 'dbref': return _Channel.objects.get(id=obj) + if typ == 'string': return _ChannelDB.objects.get(db_key__iexact=obj) + if typ == 'dbref': return _ChannelDB.objects.get(id=obj) print objtype, inp, obj, typ, type(inp) raise CommError() elif objtype == 'external': @@ -262,13 +263,14 @@ class ChannelManager(models.Manager): channel_search (equivalent to ev.search_channel) """ - + @returns_typeclass_list def get_all_channels(self): """ Returns all channels in game. """ return self.all() + @returns_typeclass def get_channel(self, channelkey): """ Return the channel object if given its key. @@ -279,7 +281,7 @@ class ChannelManager(models.Manager): if not channels: # also check aliases channels = [channel for channel in self.all() - if channelkey in channel.aliases] + if channelkey in channel.aliases.all()] if channels: return channels[0] return None @@ -319,7 +321,7 @@ class ChannelManager(models.Manager): unique_online_users = set(sess.uid for sess in session_list if sess.logged_in) online_players = (sess.get_player() for sess in session_list if sess.uid in unique_online_users) for player in online_players: - players.extend(PlayerChannelConnection.objects.filter(db_player=player, db_channel=channel)) + players.extend(PlayerChannelConnection.objects.filter(db_player=player.dbobj, db_channel=channel)) else: players.extend(PlayerChannelConnection.objects.get_all_connections(channel)) @@ -327,6 +329,7 @@ class ChannelManager(models.Manager): return itertools.chain(players, external_connections) + @returns_typeclass_list def channel_search(self, ostring): """ Search the channel database for a particular channel. @@ -345,7 +348,7 @@ class ChannelManager(models.Manager): channels = self.filter(db_key__iexact=ostring) if not channels: # still no match. Search by alias. - channels = [channel for channel in self.all() if ostring.lower() in [a.lower for a in channel.aliases]] + channels = [channel for channel in self.all() if ostring.lower() in [a.lower for a in channel.aliases.all()]] return channels # @@ -371,7 +374,7 @@ class PlayerChannelConnectionManager(models.Manager): break_connection """ - + @returns_typeclass_list def get_all_player_connections(self, player): "Get all connections that the given player has." player = to_object(player) @@ -380,7 +383,8 @@ class PlayerChannelConnectionManager(models.Manager): def has_player_connection(self, player, channel): "Checks so a connection exists player<->channel" if player and channel: - return self.filter(db_player=player).filter(db_channel=channel).count() > 0 + return self.filter(db_player=player.dbobj).filter( + db_channel=channel.dbobj).count() > 0 return False def get_all_connections(self, channel): diff --git a/src/comms/migrations/0012_auto__add_interimchannel.py b/src/comms/migrations/0012_auto__add_interimchannel.py new file mode 100644 index 0000000000..a811b8538c --- /dev/null +++ b/src/comms/migrations/0012_auto__add_interimchannel.py @@ -0,0 +1,182 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Adding model 'InterimChannel' + db.create_table(u'comms_interimchannel', ( + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + ('db_key', self.gf('django.db.models.fields.CharField')(max_length=255, db_index=True)), + ('db_typeclass_path', self.gf('django.db.models.fields.CharField')(max_length=255, null=True)), + ('db_date_created', self.gf('django.db.models.fields.DateTimeField')(auto_now_add=True, blank=True)), + ('db_lock_storage', self.gf('django.db.models.fields.TextField')(blank=True)), + )) + db.send_create_signal(u'comms', ['InterimChannel']) + + # Adding M2M table for field db_attributes on 'InterimChannel' + m2m_table_name = db.shorten_name(u'comms_interimchannel_db_attributes') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('interimchannel', models.ForeignKey(orm[u'comms.interimchannel'], null=False)), + ('attribute', models.ForeignKey(orm[u'typeclasses.attribute'], null=False)) + )) + db.create_unique(m2m_table_name, ['interimchannel_id', 'attribute_id']) + + # Adding M2M table for field db_tags on 'InterimChannel' + m2m_table_name = db.shorten_name(u'comms_interimchannel_db_tags') + db.create_table(m2m_table_name, ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('interimchannel', models.ForeignKey(orm[u'comms.interimchannel'], null=False)), + ('tag', models.ForeignKey(orm[u'typeclasses.tag'], null=False)) + )) + db.create_unique(m2m_table_name, ['interimchannel_id', 'tag_id']) + + + def backwards(self, orm): + # Deleting model 'InterimChannel' + db.delete_table(u'comms_interimchannel') + + # Removing M2M table for field db_attributes on 'InterimChannel' + db.delete_table(db.shorten_name(u'comms_interimchannel_db_attributes')) + + # Removing M2M table for field db_tags on 'InterimChannel' + db.delete_table(db.shorten_name(u'comms_interimchannel_db_tags')) + + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'comms.channel': { + 'Meta': {'object_name': 'Channel'}, + 'db_aliases': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'db_desc': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}), + 'db_keep_log': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.externalchannelconnection': { + 'Meta': {'object_name': 'ExternalChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.Channel']"}), + 'db_external_config': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_external_key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'db_external_send_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.interimchannel': { + 'Meta': {'ordering': "['-db_date_created', 'id', 'db_typeclass_path', 'db_key']", 'object_name': 'InterimChannel'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.msg': { + 'Meta': {'object_name': 'Msg'}, + 'db_date_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'db_header': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_hide_from_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_channels_set'", 'null': 'True', 'to': u"orm['comms.Channel']"}), + 'db_hide_from_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_objects_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_hide_from_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_players_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_message': ('django.db.models.fields.TextField', [], {}), + 'db_receivers_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'channel_set'", 'null': 'True', 'to': u"orm['comms.Channel']"}), + 'db_receivers_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_object_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_receivers_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_player_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_sender_external': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + 'db_sender_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_object_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_sender_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_player_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.playerchannelconnection': { + 'Meta': {'object_name': 'PlayerChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.Channel']"}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'objects.objectdb': { + 'Meta': {'object_name': 'ObjectDB'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destinations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_home': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'homes_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_location': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']", 'null': 'True', 'blank': 'True'}), + 'db_sessid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'players.playerdb': { + 'Meta': {'object_name': 'PlayerDB'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_is_connected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'typeclasses.attribute': { + 'Meta': {'object_name': 'Attribute'}, + 'db_category': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_strvalue': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_value': ('src.utils.picklefield.PickledObjectField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'typeclasses.tag': { + 'Meta': {'unique_together': "(('db_key', 'db_category'),)", 'object_name': 'Tag', 'index_together': "(('db_key', 'db_category'),)"}, + 'db_category': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'db_index': 'True'}), + 'db_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['comms'] \ No newline at end of file diff --git a/src/comms/migrations/0013_rename_channel.py b/src/comms/migrations/0013_rename_channel.py new file mode 100644 index 0000000000..18bda6c124 --- /dev/null +++ b/src/comms/migrations/0013_rename_channel.py @@ -0,0 +1,143 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + db.rename_table('comms_channel', 'comms_channeldb') + db.rename_column('comms_externalchannelconnection', 'channel_id', 'channeldb_id') + db.rename_column('comms_msg_db_hide_from_channels', 'channel_id', 'channeldb_id') + db.rename_column('comms_msg_db_receivers_channels', 'channel_id', 'channeldb_id') + + def backwards(self, orm): + db.rename_table('comms_channeldb', 'comms_channel') + db.rename_column('comms_externalchannelconnection', 'channeldb_id', 'channel_id') + db.rename_column('comms_msg_db_hide_from_channels', 'channeldb_id', 'channel_id') + db.rename_column('comms_msg_db_receivers_channels', 'channeldb_id', 'channel_id') + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'comms.channel': { + 'Meta': {'object_name': 'Channel'}, + 'db_aliases': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'db_desc': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}), + 'db_keep_log': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.externalchannelconnection': { + 'Meta': {'object_name': 'ExternalChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.Channel']"}), + 'db_external_config': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_external_key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'db_external_send_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.msg': { + 'Meta': {'object_name': 'Msg'}, + 'db_date_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'db_header': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_hide_from_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_channels_set'", 'null': 'True', 'to': u"orm['comms.Channel']"}), + 'db_hide_from_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_objects_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_hide_from_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_players_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_message': ('django.db.models.fields.TextField', [], {}), + 'db_receivers_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'channel_set'", 'null': 'True', 'to': u"orm['comms.Channel']"}), + 'db_receivers_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_object_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_receivers_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_player_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_sender_external': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + 'db_sender_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_object_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_sender_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_player_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.playerchannelconnection': { + 'Meta': {'object_name': 'PlayerChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.Channel']"}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'objects.objectdb': { + 'Meta': {'object_name': 'ObjectDB'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destinations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_home': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'homes_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_location': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']", 'null': 'True', 'blank': 'True'}), + 'db_sessid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'players.playerdb': { + 'Meta': {'object_name': 'PlayerDB'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_is_connected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'typeclasses.attribute': { + 'Meta': {'object_name': 'Attribute'}, + 'db_category': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_strvalue': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_value': ('src.utils.picklefield.PickledObjectField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'typeclasses.tag': { + 'Meta': {'unique_together': "(('db_key', 'db_category'),)", 'object_name': 'Tag', 'index_together': "(('db_key', 'db_category'),)"}, + 'db_category': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'db_index': 'True'}), + 'db_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['comms'] \ No newline at end of file diff --git a/src/comms/migrations/0014_transfer_channels.py b/src/comms/migrations/0014_transfer_channels.py new file mode 100644 index 0000000000..4cfff48010 --- /dev/null +++ b/src/comms/migrations/0014_transfer_channels.py @@ -0,0 +1,172 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + # Note: Don't use "from appname.models import ModelName". + # Use orm.ModelName to refer to models in this application, + # and orm['appname.ModelName'] for models in other applications. + ChannelDB = orm['comms.ChannelDB'] + InterimChannel = orm['comms.InterimChannel'] + Attribute = orm['typeclasses.Attribute'] + Tag = orm['typeclasses.Tag'] + for channel in ChannelDB.objects.all(): + new_channel = InterimChannel(id=channel.id, db_key=channel.db_key, + db_lock_storage=channel.db_lock_storage) + new_channel.save() + desc = Attribute(db_key='desc', db_value=channel.db_desc) + desc.save() + keep_log = Attribute(db_key='keep_log', + db_value=channel.db_keep_log) + keep_log.save() + new_channel.db_attributes.add(desc) + new_channel.db_attributes.add(keep_log) + for name in [alias.strip() for alias in + channel.db_aliases.split(',')]: + tag = Tag(db_key=name, db_category='comm_alias') + tag.save() + new_channel.db_tags.add(tag) + new_channel.save() + + def backwards(self, orm): + "Remove all InterimChannels." + orm['comms.InterimChannel'].objects.all().delete() + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'comms.channeldb': { + 'Meta': {'object_name': 'ChannelDB'}, + 'db_aliases': ('django.db.models.fields.CharField', [], {'max_length': '255'}), + 'db_desc': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}), + 'db_keep_log': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.externalchannelconnection': { + 'Meta': {'object_name': 'ExternalChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.ChannelDB']"}), + 'db_external_config': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_external_key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'db_external_send_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.interimchannel': { + 'Meta': {'ordering': "['-db_date_created', 'id', 'db_typeclass_path', 'db_key']", 'object_name': 'InterimChannel'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.msg': { + 'Meta': {'object_name': 'Msg'}, + 'db_date_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'db_header': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_hide_from_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_channels_set'", 'null': 'True', 'to': u"orm['comms.ChannelDB']"}), + 'db_hide_from_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_objects_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_hide_from_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_players_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_message': ('django.db.models.fields.TextField', [], {}), + 'db_receivers_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'channel_set'", 'null': 'True', 'to': u"orm['comms.ChannelDB']"}), + 'db_receivers_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_object_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_receivers_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_player_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_sender_external': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + 'db_sender_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_object_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_sender_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_player_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.playerchannelconnection': { + 'Meta': {'object_name': 'PlayerChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.ChannelDB']"}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'objects.objectdb': { + 'Meta': {'object_name': 'ObjectDB'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destinations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_home': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'homes_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_location': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']", 'null': 'True', 'blank': 'True'}), + 'db_sessid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'players.playerdb': { + 'Meta': {'object_name': 'PlayerDB'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_is_connected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'typeclasses.attribute': { + 'Meta': {'object_name': 'Attribute'}, + 'db_category': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_strvalue': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_value': ('src.utils.picklefield.PickledObjectField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'typeclasses.tag': { + 'Meta': {'unique_together': "(('db_key', 'db_category'),)", 'object_name': 'Tag', 'index_together': "(('db_key', 'db_category'),)"}, + 'db_category': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'db_index': 'True'}), + 'db_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['comms'] + symmetrical = True diff --git a/src/comms/migrations/0015_update_foreign_keys_remove_old_channels.py b/src/comms/migrations/0015_update_foreign_keys_remove_old_channels.py new file mode 100644 index 0000000000..c1d822a0f6 --- /dev/null +++ b/src/comms/migrations/0015_update_foreign_keys_remove_old_channels.py @@ -0,0 +1,183 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import SchemaMigration +from django.db import models + + +class Migration(SchemaMigration): + + def forwards(self, orm): + # Changing field 'ExternalChannelConnection.db_channel' + db.alter_column(u'comms_externalchannelconnection', 'db_channel_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['comms.InterimChannel'])) + + # Changing field 'PlayerChannelConnection.db_channel' + db.alter_column(u'comms_playerchannelconnection', 'db_channel_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['comms.InterimChannel'])) + + # Deleting model 'ChannelDB' + db.delete_table(u'comms_channeldb') + + def backwards(self, orm): + # Adding model 'ChannelDB' + db.create_table(u'comms_channeldb', ( + ('db_desc', self.gf('django.db.models.fields.CharField')(max_length=80, null=True, blank=True)), + ('db_aliases', self.gf('django.db.models.fields.CharField')(max_length=255)), + ('db_lock_storage', self.gf('django.db.models.fields.TextField')(blank=True)), + ('db_key', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, db_index=True)), + ('db_keep_log', self.gf('django.db.models.fields.BooleanField')(default=True)), + (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal(u'comms', ['ChannelDB']) + + InterimChannel = orm['comms.InterimTable'] + Attribute = orm['typeclasses.Attribute'] + ChannelDB = orm['comms.ChannelDB'] + + for channel in InterimChannel.objects.all(): + try: + desc = channel.db_attributes.objects.get(db_key='desc').db_value + except Attribute.DoesNotExist: + desc = '' + try: + keep_log = channel.db_attributes.objects.get( + db_key='keep_log').db_value + except Attribute.DoesNotExist: + keep_log = False + aliases = [alias.db_key for alias in + channel.db_tags.filter('comm_alias')] + aliases = ','.join(aliases) + new_channel = ChannelDB(db_desc=desc, db_keep_log=False, id=channel.id, + db_key=channel.db_key, db_lock_storage=channel.db_lock_storage, + db_aliases=aliases) + new_channel.save() + + + # Changing field 'ExternalChannelConnection.db_channel' + db.alter_column(u'comms_externalchannelconnection', 'db_channel_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['comms.ChannelDB'])) + + # Changing field 'PlayerChannelConnection.db_channel' + db.alter_column(u'comms_playerchannelconnection', 'db_channel_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['comms.ChannelDB'])) + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'comms.externalchannelconnection': { + 'Meta': {'object_name': 'ExternalChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.InterimChannel']"}), + 'db_external_config': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_external_key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'db_external_send_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.interimchannel': { + 'Meta': {'object_name': 'InterimChannel'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.msg': { + 'Meta': {'object_name': 'Msg'}, + 'db_date_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'db_header': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_hide_from_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_channels_set'", 'null': 'True', 'to': u"orm['comms.InterimChannel']"}), + 'db_hide_from_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_objects_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_hide_from_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_players_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_message': ('django.db.models.fields.TextField', [], {}), + 'db_receivers_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'channel_set'", 'null': 'True', 'to': u"orm['comms.InterimChannel']"}), + 'db_receivers_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_object_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_receivers_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_player_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_sender_external': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + 'db_sender_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_object_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_sender_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_player_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.playerchannelconnection': { + 'Meta': {'object_name': 'PlayerChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.InterimChannel']"}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'objects.objectdb': { + 'Meta': {'object_name': 'ObjectDB'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destinations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_home': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'homes_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_location': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']", 'null': 'True', 'blank': 'True'}), + 'db_sessid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'players.playerdb': { + 'Meta': {'object_name': 'PlayerDB'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_is_connected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'typeclasses.attribute': { + 'Meta': {'object_name': 'Attribute'}, + 'db_category': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_strvalue': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_value': ('src.utils.picklefield.PickledObjectField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'typeclasses.tag': { + 'Meta': {'unique_together': "(('db_key', 'db_category'),)", 'object_name': 'Tag', 'index_together': "(('db_key', 'db_category'),)"}, + 'db_category': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'db_index': 'True'}), + 'db_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['comms'] \ No newline at end of file diff --git a/src/comms/migrations/0016_finalize_tables.py b/src/comms/migrations/0016_finalize_tables.py new file mode 100644 index 0000000000..692ef26b29 --- /dev/null +++ b/src/comms/migrations/0016_finalize_tables.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +import datetime +from south.db import db +from south.v2 import DataMigration +from django.db import models + +class Migration(DataMigration): + + def forwards(self, orm): + "Write your forwards methods here." + # Note: Don't use "from appname.models import ModelName". + # Use orm.ModelName to refer to models in this application, + # and orm['appname.ModelName'] for models in other applications. + db.rename_table('comms_interimchannel', 'comms_channeldb') + db.rename_table('comms_interimchannel_db_attributes', 'comms_channeldb_db_attributes') + db.rename_table('comms_interimchannel_db_tags', 'comms_channeldb_db_tags') + db.rename_column('comms_channeldb_db_attributes', 'interimchannel_id', 'channeldb_id') + db.rename_column('comms_channeldb_db_tags', 'interimchannel_id', 'channeldb_id') + + + def backwards(self, orm): + "Write your backwards methods here." + db.rename_column('comms_channeldb_db_attributes', 'channeldb_id', 'interimchannel_id') + db.rename_column('comms_channeldb_db_tags', 'channeldb_id', 'interimchannel_id') + db.rename_table('comms_channeldb', 'comms_interimchannel') + db.rename_table('comms_channeldb_db_attributes', 'comms_interimchannel_db_attributes') + db.rename_table('comms_channeldb_db_tags', 'comms_interimchannel_db_tags') + + models = { + u'auth.group': { + 'Meta': {'object_name': 'Group'}, + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}), + 'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}) + }, + u'auth.permission': { + 'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'}, + 'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}) + }, + u'comms.externalchannelconnection': { + 'Meta': {'object_name': 'ExternalChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.ChannelDB']"}), + 'db_external_config': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_external_key': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'db_external_send_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.interimchannel': { + 'Meta': {'object_name': 'InterimChannel'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.channeldb': { + 'Meta': {'object_name': 'ChannelDB'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.msg': { + 'Meta': {'object_name': 'Msg'}, + 'db_date_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}), + 'db_header': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_hide_from_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_channels_set'", 'null': 'True', 'to': u"orm['comms.ChannelDB']"}), + 'db_hide_from_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_objects_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_hide_from_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_players_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_message': ('django.db.models.fields.TextField', [], {}), + 'db_receivers_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'channel_set'", 'null': 'True', 'to': u"orm['comms.ChannelDB']"}), + 'db_receivers_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_object_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_receivers_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_player_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}), + 'db_sender_external': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + 'db_sender_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_object_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_sender_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_player_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'comms.playerchannelconnection': { + 'Meta': {'object_name': 'PlayerChannelConnection'}, + 'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.ChannelDB']"}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'contenttypes.contenttype': { + 'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"}, + 'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}) + }, + u'objects.objectdb': { + 'Meta': {'object_name': 'ObjectDB'}, + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destinations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_home': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'homes_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_location': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']", 'null': 'True', 'blank': 'True'}), + 'db_sessid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'players.playerdb': { + 'Meta': {'object_name': 'PlayerDB'}, + 'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}), + 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_is_connected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_tags': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Tag']", 'null': 'True', 'symmetrical': 'False'}), + 'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}), + 'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}), + 'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}), + 'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}), + 'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}), + 'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}), + 'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}), + 'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'}) + }, + u'typeclasses.attribute': { + 'Meta': {'object_name': 'Attribute'}, + 'db_category': ('django.db.models.fields.CharField', [], {'db_index': 'True', 'max_length': '128', 'null': 'True', 'blank': 'True'}), + 'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}), + 'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'db_strvalue': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_value': ('src.utils.picklefield.PickledObjectField', [], {'null': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + }, + u'typeclasses.tag': { + 'Meta': {'unique_together': "(('db_key', 'db_category'),)", 'object_name': 'Tag', 'index_together': "(('db_key', 'db_category'),)"}, + 'db_category': ('django.db.models.fields.CharField', [], {'max_length': '64', 'null': 'True', 'db_index': 'True'}), + 'db_data': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), + 'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}), + u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) + } + } + + complete_apps = ['comms'] + symmetrical = True diff --git a/src/comms/models.py b/src/comms/models.py index 7c83c25994..68c1b84971 100644 --- a/src/comms/models.py +++ b/src/comms/models.py @@ -20,7 +20,9 @@ be able to delete connections on the fly). """ from datetime import datetime +from django.conf import settings from django.db import models +from src.typeclasses.models import TypedObject, TagHandler, AttributeHandler, AliasHandler from src.utils.idmapper.models import SharedMemoryModel from src.comms import managers from src.comms.managers import identify_object @@ -28,7 +30,11 @@ from src.locks.lockhandler import LockHandler from src.utils import logger from src.utils.utils import is_iter, to_str, crop, make_iter -__all__ = ("Msg", "TempMsg", "Channel", "PlayerChannelConnection", "ExternalChannelConnection") +__all__ = ("Msg", "TempMsg", "ChannelDB", "PlayerChannelConnection", "ExternalChannelConnection") + +_GA = object.__getattribute__ +_SA = object.__setattr__ +_DA = object.__delattr__ #------------------------------------------------------------ # @@ -72,7 +78,7 @@ class Msg(SharedMemoryModel): # with channels below. db_receivers_players = models.ManyToManyField('players.PlayerDB', related_name='receiver_player_set', null=True, help_text="player receivers") db_receivers_objects = models.ManyToManyField('objects.ObjectDB', related_name='receiver_object_set', null=True, help_text="object receivers") - db_receivers_channels = models.ManyToManyField("Channel", related_name='channel_set', null=True, help_text="channel recievers") + db_receivers_channels = models.ManyToManyField("ChannelDB", related_name='channel_set', null=True, help_text="channel recievers") # header could be used for meta-info about the message if your system needs it, or as a separate # store for the mail subject line maybe. @@ -88,7 +94,7 @@ class Msg(SharedMemoryModel): # these can be used to filter/hide a given message from supplied objects/players/channels db_hide_from_players = models.ManyToManyField("players.PlayerDB", related_name='hide_from_players_set', null=True) db_hide_from_objects = models.ManyToManyField("objects.ObjectDB", related_name='hide_from_objects_set', null=True) - db_hide_from_channels = models.ManyToManyField("Channel", related_name='hide_from_channels_set', null=True) + db_hide_from_channels = models.ManyToManyField("ChannelDB", related_name='hide_from_channels_set', null=True) # Database manager objects = managers.MsgManager() @@ -201,7 +207,7 @@ class Msg(SharedMemoryModel): #@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): + for val in (v.dbobj for v in make_iter(value) if v): self.db_receivers_channels.add(val) #@channels.deleter def __channels_del(self): @@ -210,58 +216,6 @@ class Msg(SharedMemoryModel): self.save() channels = property(__channels_get, __channels_set, __channels_del) - # header property (wraps db_header) - #@property - #def __header_get(self): - # "Getter. Allows for value = self.message" - # return self.db_header - ##@message.setter - #def __header_set(self, value): - # "Setter. Allows for self.message = value" - # if value: - # self.db_header = value - # self.save() - ##@message.deleter - #def __header_del(self): - # "Deleter. Allows for del self.message" - # self.db_header = "" - # self.save() - #header = property(__header_get, __header_set, __header_del) - - ## message property (wraps db_message) - ##@property - #def __message_get(self): - # "Getter. Allows for value = self.message" - # return self.db_message - ##@message.setter - #def __message_set(self, value): - # "Setter. Allows for self.message = value" - # self.db_message = value - # self.save() - ##@message.deleter - #def __message_del(self): - # "Deleter. Allows for del self.message" - # self.db_message = "" - # self.save() - #message = property(__message_get, __message_set, __message_del) - - ## date_sent property (wraps db_date_sent) - ##@property - #def __date_sent_get(self): - # "Getter. Allows for value = self.date_sent" - # return self.db_date_sent - ##@date_sent.setter - #def __date_sent_set(self, value): - # "Setter. Allows for self.date_sent = value" - # raise Exception("You cannot edit date_sent!") - ##@date_sent.deleter - #def __date_sent_del(self): - # "Deleter. Allows for del self.date_sent" - # raise Exception("You cannot delete the date_sent property!") - #date_sent = property(__date_sent_get, __date_sent_set, __date_sent_del) - - # hide_from property - #@property def __hide_from_get(self): "Getter. Allows for value = self.hide_from. Returns 3 lists of players, objects and channels" return self.db_hide_from_players.all(), self.db_hide_from_objects.all(), self.db_hide_from_channels.all() @@ -313,15 +267,6 @@ class Msg(SharedMemoryModel): receivers = ",".join(["[%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)) - def access(self, accessing_obj, access_type='read', default=False): - """ - Determines if another object has permission to access. - accessing_obj - object trying to access this one - access_type - type of access sought - default - what to return if no lock of access_type was found - """ - return self.locks.check(accessing_obj, access_type=access_type, default=default) - #------------------------------------------------------------ # @@ -375,14 +320,13 @@ class TempMsg(object): "checks lock access" return self.locks.check(accessing_obj, access_type=access_type, default=default) - #------------------------------------------------------------ # # Channel # #------------------------------------------------------------ -class Channel(SharedMemoryModel): +class ChannelDB(TypedObject): """ This is the basis of a comm channel, only implementing the very basics of distributing messages. @@ -396,132 +340,22 @@ class Channel(SharedMemoryModel): """ - # - # Channel database model setup - # - # - # These databse fields are all set using their corresponding properties, - # named same as the field, but withtout the db_* prefix. - - # unique identifier for this channel - db_key = models.CharField('key', max_length=255, unique=True, db_index=True) - # optional description of channel - db_desc = models.CharField('description', max_length=80, blank=True, null=True) - # aliases for the channel. These are searched by cmdhandler - # as well to determine if a command is the name of a channel. - # Several aliases are separated by commas. - db_aliases = models.CharField('aliases', max_length=255) - # Whether this channel should remember its past messages - db_keep_log = models.BooleanField(default=True) - # Storage of lock definitions - db_lock_storage = models.TextField('locks', blank=True) - - # Database manager objects = managers.ChannelManager() + _typeclass_paths = settings.COMM_TYPECLASS_PATHS + _default_typeclass_path = settings.BASE_COMM_TYPECLASS or "src.comms.comms.Comm" + class Meta: "Define Django meta options" verbose_name = "Channel" def __init__(self, *args, **kwargs): - SharedMemoryModel.__init__(self, *args, **kwargs) - self.locks = LockHandler(self) + TypedObject.__init__(self, *args, **kwargs) + _SA(self, "tags", TagHandler(self, category_prefix="comm_")) + _SA(self, "aliases", AliasHandler(self, category_prefix="comm_")) + _SA(self, "attributes", AttributeHandler(self)) - # Wrapper properties to easily set database fields. These are - # @property decorators that allows to access these fields using - # normal python operations (without having to remember to save() - # etc). So e.g. a property 'attr' has a get/set/del decorator - # defined that allows the user to do self.attr = value, - # value = self.attr and del self.attr respectively (where self - # is the object in question). - - # key property (wraps db_key) - #@property - #def key_get(self): - # "Getter. Allows for value = self.key" - # return self.db_key - ##@key.setter - #def key_set(self, value): - # "Setter. Allows for self.key = value" - # self.db_key = value - # self.save() - ##@key.deleter - #def key_del(self): - # "Deleter. Allows for del self.key" - # raise Exception("You cannot delete the channel key!") - #key = property(key_get, key_set, key_del) - - # desc property (wraps db_desc) - #@property - #def desc_get(self): - # "Getter. Allows for value = self.desc" - # return self.db_desc - ##@desc.setter - #def desc_set(self, value): - # "Setter. Allows for self.desc = value" - # self.db_desc = value - # self.save() - ##@desc.deleter - #def desc_del(self): - # "Deleter. Allows for del self.desc" - # self.db_desc = "" - # self.save() - #desc = property(desc_get, desc_set, desc_del) - - # aliases property - #@property - def aliases_get(self): - "Getter. Allows for value = self.aliases. Returns a list of aliases." - if self.db_aliases: - return [perm.strip() for perm in self.db_aliases.split(',')] - return [] - #@aliases.setter - def aliases_set(self, value): - "Setter. Allows for self.aliases = value. Stores as a comma-separated string." - if is_iter(value): - value = ",".join([str(val).strip().lower() for val in value]) - self.db_aliases = value - self.save() - #@aliases_del.deleter - def aliases_del(self): - "Deleter. Allows for del self.aliases" - self.db_aliases = "" - self.save() - aliases = property(aliases_get, aliases_set, aliases_del) - - # keep_log property (wraps db_keep_log) - #@property - #def keep_log_get(self): - # "Getter. Allows for value = self.keep_log" - # return self.db_keep_log - ##@keep_log.setter - #def keep_log_set(self, value): - # "Setter. Allows for self.keep_log = value" - # self.db_keep_log = value - # self.save() - ##@keep_log.deleter - #def keep_log_del(self): - # "Deleter. Allows for del self.keep_log" - # self.db_keep_log = False - # self.save() - #keep_log = property(keep_log_get, keep_log_set, keep_log_del) - - # lock_storage property (wraps db_lock_storage) - #@property - #def lock_storage_get(self): - # "Getter. Allows for value = self.lock_storage" - # return self.db_lock_storage - ##@nick.setter - #def lock_storage_set(self, value): - # """Saves the lock_storagetodate. This is usually not called directly, but through self.lock()""" - # self.db_lock_storage = value - # self.save() - ##@nick.deleter - #def lock_storage_del(self): - # "Deleter is disabled. Use the lockhandler.delete (self.lock.delete) instead""" - # logger.log_errmsg("Lock_Storage (on %s) cannot be deleted. Use obj.lock.delete() instead." % self) - #lock_storage = property(lock_storage_get, lock_storage_set, lock_storage_del) class Meta: "Define Django meta options" @@ -533,7 +367,7 @@ class Channel(SharedMemoryModel): # def __str__(self): - return "Channel '%s' (%s)" % (self.key, self.desc) + return "Channel '%s' (%s)" % (self.key, self.typeclass.db.desc) def has_connection(self, player): """ @@ -587,12 +421,12 @@ class Channel(SharedMemoryModel): msg = msgobj.message # get all players connected to this channel and send to them - for conn in Channel.objects.get_all_connections(self, online=online): + for conn in ChannelDB.objects.get_all_connections(self, online=online): try: conn.player.msg(msg, from_obj=senders) except AttributeError: try: - conn.to_external(msg, from_object=senders, from_channel=self) + conn.to_external(msg, senders=senders, from_channel=self) except Exception: logger.log_trace("Cannot send msg to connection '%s'" % conn) return True @@ -619,9 +453,9 @@ class Channel(SharedMemoryModel): def delete(self): "Clean out all connections to this channel and delete it." - for connection in Channel.objects.get_all_connections(self): + for connection in ChannelDB.objects.get_all_connections(self): connection.delete() - super(Channel, self).delete() + super(ChannelDB, self).delete() def access(self, accessing_obj, access_type='listen', default=False): """ Determines if another object has permission to access. @@ -641,7 +475,7 @@ class PlayerChannelConnection(SharedMemoryModel): # Player connected to a channel db_player = models.ForeignKey("players.PlayerDB", verbose_name='player') # Channel the player is connected to - db_channel = models.ForeignKey(Channel, verbose_name='channel') + db_channel = models.ForeignKey(ChannelDB, verbose_name='channel') # Database manager objects = managers.PlayerChannelConnectionManager() @@ -666,11 +500,11 @@ class PlayerChannelConnection(SharedMemoryModel): #@property def channel_get(self): "Getter. Allows for value = self.channel" - return self.db_channel + return self.db_channel.typeclass #@channel.setter def channel_set(self, value): "Setter. Allows for self.channel = value" - self.db_channel = value + self.db_channel = value.dbobj self.save() #@channel.deleter def channel_del(self): @@ -694,7 +528,7 @@ class ExternalChannelConnection(SharedMemoryModel): that connection. """ # evennia channel connecting to - db_channel = models.ForeignKey(Channel, verbose_name='channel', + db_channel = models.ForeignKey(ChannelDB, verbose_name='channel', help_text='which channel this connection is tied to.') # external connection identifier db_external_key = models.CharField('external key', max_length=128, diff --git a/src/comms/rss.py b/src/comms/rss.py index dbfec7a65a..0852368fc7 100644 --- a/src/comms/rss.py +++ b/src/comms/rss.py @@ -9,13 +9,13 @@ to the channel whenever the feed updates. import re from twisted.internet import task from django.conf import settings -from src.comms.models import ExternalChannelConnection, Channel +from src.comms.models import ExternalChannelConnection, ChannelDB from src.utils import logger, utils from src.scripts.models import ScriptDB RSS_ENABLED = settings.RSS_ENABLED RSS_UPDATE_INTERVAL = settings.RSS_UPDATE_INTERVAL -INFOCHANNEL = Channel.objects.channel_search(settings.CHANNEL_MUDINFO[0]) +INFOCHANNEL = ChannelDB.objects.channel_search(settings.CHANNEL_MUDINFO[0]) RETAG = re.compile(r'<[^>]*?>') # holds rss readers they can be shut down at will. @@ -102,8 +102,8 @@ def create_connection(channel, url, interval): """ This will create a new RSS->channel connection """ - if not type(channel) == Channel: - new_channel = Channel.objects.filter(db_key=channel) + if not type(channel) == ChannelDB: + new_channel = ChannelDB.objects.filter(db_key=channel) if not new_channel: logger.log_errmsg("Cannot attach RSS->Evennia: Evennia Channel '%s' not found." % channel) return False diff --git a/src/players/player.py b/src/players/player.py index dc2b5cdeb4..4f3e026675 100644 --- a/src/players/player.py +++ b/src/players/player.py @@ -14,7 +14,7 @@ instead for most things). import datetime from django.conf import settings from src.typeclasses.typeclass import TypeClass -from src.comms.models import Channel +from src.comms.models import ChannelDB from src.utils import logger __all__ = ("Player",) @@ -303,7 +303,7 @@ class Player(TypeClass): global _CONNECT_CHANNEL if not _CONNECT_CHANNEL: try: - _CONNECT_CHANNEL = Channel.objects.filter(db_key=settings.CHANNEL_CONNECTINFO[0])[0] + _CONNECT_CHANNEL = ChannelDB.objects.filter(db_key=settings.CHANNEL_CONNECTINFO[0])[0] except Exception: logger.log_trace() now = datetime.datetime.now() diff --git a/src/server/initial_setup.py b/src/server/initial_setup.py index 95399f510e..8753638ace 100644 --- a/src/server/initial_setup.py +++ b/src/server/initial_setup.py @@ -278,11 +278,9 @@ def handle_setup(last_step): for profile in PlayerDB.objects.all(): profile.delete() elif last_step + num == 3: - from src.comms.models import Channel, PlayerChannelConnection - for chan in Channel.objects.all(): - chan.delete() - for conn in PlayerChannelConnection.objects.all(): - conn.delete() + from src.comms.models import ChannelDB, PlayerChannelConnection + ChannelDB.objects.all().delete() + PlayerChannelConnection.objects.all().delete() raise ServerConfig.objects.conf("last_initial_setup_step", last_step + num + 1) # We got through the entire list. Set last_step to -1 so we don't diff --git a/src/server/serversession.py b/src/server/serversession.py index 5df372c0c9..a944740805 100644 --- a/src/server/serversession.py +++ b/src/server/serversession.py @@ -11,7 +11,7 @@ import time from datetime import datetime from django.conf import settings from src.scripts.models import ScriptDB -from src.comms.models import Channel +from src.comms.models import ChannelDB from src.utils import logger, utils from src.utils.utils import make_iter, to_str from src.commands import cmdhandler, cmdsethandler @@ -143,7 +143,7 @@ class ServerSession(Session): if channel: try: cchan = settings.CHANNEL_CONNECTINFO - cchan = Channel.objects.get_channel(cchan[0]) + cchan = ChannelDB.objects.get_channel(cchan[0]) cchan.msg("[%s]: %s" % (cchan.key, message)) except Exception: pass diff --git a/src/settings_default.py b/src/settings_default.py index ec2a0ce384..58f8b7e5ba 100644 --- a/src/settings_default.py +++ b/src/settings_default.py @@ -239,6 +239,7 @@ SERVER_SESSION_CLASS = "src.server.serversession.ServerSession" OBJECT_TYPECLASS_PATHS = ["game.gamesrc.objects", "game.gamesrc.objects.examples", "contrib"] SCRIPT_TYPECLASS_PATHS = ["game.gamesrc.scripts", "game.gamesrc.scripts.examples", "contrib"] PLAYER_TYPECLASS_PATHS = ["game.gamesrc.objects", "contrib"] +COMM_TYPECLASS_PATHS = ["game.gamesrc.objects", "contrib"] # Typeclass for player objects (linked to a character) (fallback) BASE_PLAYER_TYPECLASS = "src.players.player.Player" @@ -250,6 +251,8 @@ BASE_CHARACTER_TYPECLASS = "src.objects.objects.Character" BASE_ROOM_TYPECLASS = "src.objects.objects.Room" # Typeclass for Exit objects (fallback). BASE_EXIT_TYPECLASS = "src.objects.objects.Exit" +# Typeclass for Comms (fallback). +BASE_COMM_TYPECLASS = "src.comms.comms.Comm" # Typeclass for Scripts (fallback). You usually don't need to change this # but create custom variations of scripts on a per-case basis instead. BASE_SCRIPT_TYPECLASS = "src.scripts.scripts.DoNothing" diff --git a/src/typeclasses/managers.py b/src/typeclasses/managers.py index 6a5e77cf57..0a87fbd716 100644 --- a/src/typeclasses/managers.py +++ b/src/typeclasses/managers.py @@ -170,7 +170,7 @@ def returns_typeclass_list(method): def func(self, *args, **kwargs): "decorator. Returns a list." self.__doc__ = method.__doc__ - matches = method(self, *args, **kwargs) + matches = make_iter(method(self, *args, **kwargs)) return [(hasattr(dbobj, "typeclass") and dbobj.typeclass) or dbobj for dbobj in make_iter(matches)] return update_wrapper(func, method) diff --git a/src/utils/create.py b/src/utils/create.py index d726b88828..15fe65c02e 100644 --- a/src/utils/create.py +++ b/src/utils/create.py @@ -38,7 +38,7 @@ _Msg = None _Player = None _PlayerDB = None _to_object = None -_Channel = None +_ChannelDB = None _channelhandler = None @@ -344,7 +344,8 @@ def create_message(senderobj, message, channels=None, message = create_message def create_channel(key, aliases=None, desc=None, - locks=None, keep_log=True): + locks=None, keep_log=True, + typeclass=None): """ Create A communication Channel. A Channel serves as a central hub for distributing Msgs to groups of people without @@ -357,20 +358,24 @@ def create_channel(key, aliases=None, desc=None, aliases - list of alternative (likely shorter) keynames. locks - lock string definitions """ - global _Channel, _channelhandler - if not _Channel: - from src.comms.models import Channel as _Channel + global _ChannelDB, _channelhandler + if not _ChannelDB: + from src.comms.models import ChannelDB as _ChannelDB if not _channelhandler: from src.comms import channelhandler as _channelhandler + if not typeclass: + typeclass = settings.BASE_COMM_TYPECLASS try: - new_channel = _Channel() - new_channel.key = key + new_channel = _ChannelDB(typeclass=typeclass, db_key=key) + new_channel.save() + new_channel = new_channel.typeclass if aliases: if not utils.is_iter(aliases): aliases = [aliases] - new_channel.aliases = ",".join([alias for alias in aliases]) - new_channel.desc = desc - new_channel.keep_log = keep_log + new_channel.aliases.add(aliases) + new_channel.save() + new_channel.db.desc = desc + new_channel.db.keep_log = keep_log except IntegrityError: string = "Could not add channel: key '%s' already exists." % key logger.log_errmsg(string) diff --git a/src/utils/search.py b/src/utils/search.py index 032c6241d1..2af471730f 100644 --- a/src/utils/search.py +++ b/src/utils/search.py @@ -38,7 +38,7 @@ ObjectDB = ContentType.objects.get(app_label="objects", model="objectdb").model_ PlayerDB = ContentType.objects.get(app_label="players", model="playerdb").model_class() ScriptDB = ContentType.objects.get(app_label="scripts", model="scriptdb").model_class() Msg = ContentType.objects.get(app_label="comms", model="msg").model_class() -Channel = ContentType.objects.get(app_label="comms", model="channel").model_class() +Channel = ContentType.objects.get(app_label="comms", model="channeldb").model_class() HelpEntry = ContentType.objects.get(app_label="help", model="helpentry").model_class() #