def test_IPAddressField(self): lazy_func = lazy(lambda: '127.0.0.1', six.text_type) self.assertIsInstance(IPAddressField().get_prep_value(lazy_func()), six.text_type) lazy_func = lazy(lambda: 0, int) self.assertIsInstance(IPAddressField().get_prep_value(lazy_func()), six.text_type)
class IPRange(models.Model): ip_from = IPAddressField() ip_to = IPAddressField(blank=True, null=True) partner = models.ForeignKey(Partner, related_name='ips_allowed', db_index=True) @staticmethod def _ipv4_to_int(ip): """ >>> f = IPRange._ipv4_to_int >>> f('0.0.0.0') 0L >>> f('255.255.255.255') 4294967295L """ hexn = ''.join(["%02X" % long(i) for i in ip.split('.')]) return long(hexn, 16) def in_range(self, ip_str): if self.ip_to: return IPRange._ipv4_to_int(self.ip_from) <= IPRange._ipv4_to_int( ip_str) <= IPRange._ipv4_to_int(self.ip_to) else: return ip_str == self.ip_from
def test_IPAddressField(self): with warnings.catch_warnings(record=True): warnings.simplefilter("always") lazy_func = lazy(lambda: '127.0.0.1', six.text_type) self.assertIsInstance(IPAddressField().get_prep_value(lazy_func()), six.text_type) lazy_func = lazy(lambda: 0, int) self.assertIsInstance(IPAddressField().get_prep_value(lazy_func()), six.text_type)
class Device(models.Model): human_readable = CharField(max_length=300, verbose_name='Идентификатор') is_active = BooleanField(default=True, verbose_name='Активен') ip_address = IPAddressField() fw_version = CharField(max_length=20, blank=True, verbose_name='Версия прошивки') last_queried = DateTimeField(default=datetime.datetime.now(), verbose_name='Время последнего опроса') query_status = CharField(max_length=20, blank=True, default='queue', verbose_name='Результат опроса', choices=[('queue', 'В очереди'), ('query', 'Опрашивается'), ('success', 'Успех'), ('failure', 'Ошибка')]) login = CharField(max_length=200) password = CharField(max_length=128) class Meta: verbose_name = u'Устройство' verbose_name_plural = u'Устройства' def __str__(self): return '%s@%s' % (self.human_readable, self.ip_address)
class SSHServer(Resource): # SSHServer fields ip_address = IPAddressField( "IP address", help_text="Specify the server's IP address.", ) ssh_port = LimitedIntegerField( "SSH port number", min_value=1, max_value=2**16 - 1, default=22, help_text="Specify the SSH port number to use.") # end def is_alive(self): """Ping the server and check if it's alive. @return: True if ping succeeds, False otherwise. """ ret = subprocess.call( shlex.split("ping -c 1 -W 2 %s" % self.ip_address), stdout=open('/dev/null', 'w'), stderr=subprocess.STDOUT, ) if ret == 0: return True else: return False def exec_command(self, command, **connection_info): """Connect to the server using an SSH session and execute a command. @param command: The command to execute @type command: C{str} @param username: The username to use to connect to the server. @type username: C{str} @keyword connection_info: A dict of other info to pass to C{paramiko.SSHClient.exec_command}. @return: A (out, err) tuple that is the output read on the stdout and stderr channels. @rtype: C{tuple(str, str)} """ client = paramiko.SSHClient() client.set_missing_host_key_policy(paramiko.AutoAddPolicy()) client.connect(str(self.ip_address), port=int(self.ssh_port), **connection_info) _, sout, serr = client.exec_command(command) o = sout.read() e = serr.read() client.close() return o, e def __unicode__(self): return u"SSH server at IP %s" % self.ip_address
class BaseRevisionMixin(models.Model): """This is an abstract model used as a mixin: Do not override any of the core model methods but respect the inheritor's freedom to do so itself.""" revision_number = models.IntegerField( editable=False, verbose_name=_("revision number") ) user_message = models.TextField(blank=True,) automatic_log = models.TextField(blank=True, editable=False,) ip_address = IPAddressField(_("IP address"), blank=True, null=True, editable=False) user = models.ForeignKey( django_settings.AUTH_USER_MODEL, verbose_name=_("user"), blank=True, null=True, on_delete=models.SET_NULL, ) modified = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) previous_revision = models.ForeignKey( "self", blank=True, null=True, on_delete=models.SET_NULL ) # NOTE! The semantics of these fields are not related to the revision itself # but the actual related object. If the latest revision says "deleted=True" then # the related object should be regarded as deleted. deleted = models.BooleanField(verbose_name=_("deleted"), default=False,) locked = models.BooleanField(verbose_name=_("locked"), default=False,) def set_from_request(self, request): if request.user.is_authenticated: self.user = request.user if settings.LOG_IPS_USERS: self.ip_address = request.META.get("REMOTE_ADDR", None) elif settings.LOG_IPS_ANONYMOUS: self.ip_address = request.META.get("REMOTE_ADDR", None) def inherit_predecessor(self, predecessor): """ This is a naive way of inheriting, assuming that ``predecessor`` is in fact the predecessor and there hasn't been any intermediate changes! :param: predecessor is an instance of whatever object for which object.current_revision implements BaseRevisionMixin. """ predecessor = predecessor.current_revision self.previous_revision = predecessor self.deleted = predecessor.deleted self.locked = predecessor.locked self.revision_number = predecessor.revision_number + 1 class Meta: abstract = True
class BaseRevisionMixin(models.Model): """This is an abstract model used as a mixin: Do not override any of the core model methods but respect the inheritor's freedom to do so itself.""" revision_number = models.IntegerField(editable=False, verbose_name=_('revision number')) user_message = models.TextField(blank=True, ) automatic_log = models.TextField( blank=True, editable=False, ) ip_address = IPAddressField(_('IP address'), blank=True, null=True, editable=False) user = models.ForeignKey(compat.USER_MODEL, verbose_name=_('user'), blank=True, null=True, on_delete=models.SET_NULL) modified = models.DateTimeField(auto_now=True) created = models.DateTimeField(auto_now_add=True) previous_revision = models.ForeignKey('self', blank=True, null=True, on_delete=models.SET_NULL) # NOTE! The semantics of these fields are not related to the revision itself # but the actual related object. If the latest revision says "deleted=True" then # the related object should be regarded as deleted. deleted = models.BooleanField( verbose_name=_('deleted'), default=False, ) locked = models.BooleanField( verbose_name=_('locked'), default=False, ) def set_from_request(self, request): if request.user.is_authenticated(): self.user = request.user if settings.LOG_IPS_USERS: self.ip_address = request.META.get('REMOTE_ADDR', None) elif settings.LOG_IPS_ANONYMOUS: self.ip_address = request.META.get('REMOTE_ADDR', None) class Meta: abstract = True
class IPAddressModel(models.Model): ip = IPAddressField()
def test_IPAddressField(self): self.assertIsInstance(IPAddressField().get_prep_value('127.0.0.1'), six.text_type) self.assertIsInstance(IPAddressField().get_prep_value(0), six.text_type)
class Migration(migrations.Migration): dependencies = [ ('sites', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ('contenttypes', '0001_initial'), ('auth', '0001_initial'), ] operations = [ migrations.CreateModel( name='Article', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('created', models.DateTimeField(verbose_name='created', auto_now_add=True)), ('modified', models.DateTimeField( verbose_name='modified', auto_now=True, help_text='Article properties last modified')), ('group_read', models.BooleanField(default=True, verbose_name='group read access')), ('group_write', models.BooleanField(default=True, verbose_name='group write access')), ('other_read', models.BooleanField(default=True, verbose_name='others read access')), ('other_write', models.BooleanField(default=True, verbose_name='others write access')), ], options={ 'permissions': (('moderate', 'Can edit all articles and lock/unlock/restore'), ('assign', 'Can change ownership of any article'), ('grant', 'Can assign permissions to other users')), }, bases=(models.Model, ), ), migrations.CreateModel( name='ArticleForObject', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('object_id', models.PositiveIntegerField(verbose_name='object ID')), ('is_mptt', models.BooleanField(default=False, editable=False)), ('article', models.ForeignKey(to='wiki.Article')), ('content_type', models.ForeignKey( related_name='content_type_set_for_articleforobject', verbose_name='content type', to='contenttypes.ContentType')), ], options={ 'verbose_name_plural': 'Articles for object', 'verbose_name': 'Article for object', }, bases=(models.Model, ), ), migrations.CreateModel( name='ArticlePlugin', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('deleted', models.BooleanField(default=False)), ('created', models.DateTimeField(auto_now_add=True)), ], options={}, bases=(models.Model, ), ), migrations.CreateModel( name='ArticleRevision', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), ('user_message', models.TextField(blank=True)), ('automatic_log', models.TextField(blank=True, editable=False)), ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), ('modified', models.DateTimeField(auto_now=True)), ('created', models.DateTimeField(auto_now_add=True)), ('deleted', models.BooleanField(default=False, verbose_name='deleted')), ('locked', models.BooleanField(default=False, verbose_name='locked')), ('content', models.TextField(blank=True, verbose_name='article contents')), ('title', models.CharField( max_length=512, verbose_name='article title', help_text= 'Each revision contains a title field that must be filled out, even if the title has not changed' )), ('article', models.ForeignKey(to='wiki.Article', verbose_name='article')), ('previous_revision', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.ArticleRevision')), ('user', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), ], options={ 'get_latest_by': 'revision_number', 'ordering': ('created', ), }, bases=(models.Model, ), ), migrations.CreateModel( name='ReusablePlugin', fields=[ ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True)), ('articles', models.ManyToManyField(related_name='shared_plugins_set', to='wiki.Article')), ], options={}, bases=('wiki.articleplugin', ), ), migrations.CreateModel( name='RevisionPlugin', fields=[ ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True)), ], options={}, bases=('wiki.articleplugin', ), ), migrations.CreateModel( name='RevisionPluginRevision', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), ('user_message', models.TextField(blank=True)), ('automatic_log', models.TextField(blank=True, editable=False)), ('ip_address', IPAddressField(null=True, verbose_name='IP address', blank=True, editable=False)), ('modified', models.DateTimeField(auto_now=True)), ('created', models.DateTimeField(auto_now_add=True)), ('deleted', models.BooleanField(default=False, verbose_name='deleted')), ('locked', models.BooleanField(default=False, verbose_name='locked')), ('plugin', models.ForeignKey(related_name='revision_set', to='wiki.RevisionPlugin')), ('previous_revision', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to='wiki.RevisionPluginRevision')), ('user', models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='user')), ], options={ 'get_latest_by': 'revision_number', 'ordering': ('-created', ), }, bases=(models.Model, ), ), migrations.CreateModel( name='SimplePlugin', fields=[ ('articleplugin_ptr', models.OneToOneField(primary_key=True, parent_link=True, to='wiki.ArticlePlugin', serialize=False, auto_created=True)), ('article_revision', models.ForeignKey(to='wiki.ArticleRevision')), ], options={}, bases=('wiki.articleplugin', ), ), migrations.CreateModel( name='URLPath', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), ('slug', models.SlugField(null=True, blank=True, verbose_name='slug')), ('lft', models.PositiveIntegerField(db_index=True, editable=False)), ('rght', models.PositiveIntegerField(db_index=True, editable=False)), ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), ('level', models.PositiveIntegerField(db_index=True, editable=False)), ('article', models.ForeignKey( help_text= 'This field is automatically updated, but you need to populate it when creating a new URL path.', on_delete=django.db.models.deletion.CASCADE, to='wiki.Article', verbose_name='article')), ('parent', mptt.fields.TreeForeignKey( blank=True, help_text='Position of URL path in the tree.', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='wiki.URLPath')), ('site', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='sites.Site')), ], options={ 'verbose_name_plural': 'URL paths', 'verbose_name': 'URL path', }, bases=(models.Model, ), ), migrations.AlterUniqueTogether( name='urlpath', unique_together=set([('site', 'parent', 'slug')]), ), migrations.AddField( model_name='revisionplugin', name='current_revision', field=models.OneToOneField( related_name='plugin_set', null=True, help_text= 'The revision being displayed for this plugin. If you need to do a roll-back, simply change the value of this field.', blank=True, to='wiki.RevisionPluginRevision', verbose_name='current revision'), preserve_default=True, ), migrations.AlterUniqueTogether( name='articlerevision', unique_together=set([('article', 'revision_number')]), ), migrations.AddField( model_name='articleplugin', name='article', field=models.ForeignKey(to='wiki.Article', verbose_name='article'), preserve_default=True, ), migrations.AlterUniqueTogether( name='articleforobject', unique_together=set([('content_type', 'object_id')]), ), migrations.AddField( model_name='article', name='current_revision', field=models.OneToOneField( related_name='current_set', null=True, help_text= 'The revision being displayed for this article. If you need to do a roll-back, simply change the value of this field.', blank=True, to='wiki.ArticleRevision', verbose_name='current revision'), preserve_default=True, ), migrations.AddField( model_name='article', name='group', field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, help_text= 'Like in a UNIX file system, permissions can be given to a user according to group membership. Groups are handled through the Django auth system.', blank=True, to=GROUP_MODEL, verbose_name='group'), preserve_default=True, ), migrations.AddField( model_name='article', name='owner', field=models.ForeignKey( related_name='owned_articles', null=True, on_delete=django.db.models.deletion.SET_NULL, help_text= 'The owner of the article, usually the creator. The owner always has both read and write access.', blank=True, to=settings.AUTH_USER_MODEL, verbose_name='owner'), preserve_default=True, ), ]
class Migration(migrations.Migration): dependencies = [ ("sites", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ("contenttypes", "0001_initial"), ("auth", "0001_initial"), ] operations = [ migrations.CreateModel( name="Article", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, auto_created=True, verbose_name="ID", ), ), ( "created", models.DateTimeField(verbose_name="created", auto_now_add=True), ), ( "modified", models.DateTimeField( verbose_name="modified", auto_now=True, help_text="Article properties last modified", ), ), ( "group_read", models.BooleanField(default=True, verbose_name="group read access"), ), ( "group_write", models.BooleanField(default=True, verbose_name="group write access"), ), ( "other_read", models.BooleanField(default=True, verbose_name="others read access"), ), ( "other_write", models.BooleanField(default=True, verbose_name="others write access"), ), ], options={ "permissions": ( ("moderate", "Can edit all articles and lock/unlock/restore"), ("assign", "Can change ownership of any article"), ("grant", "Can assign permissions to other users"), ), }, bases=(models.Model, ), ), migrations.CreateModel( name="ArticleForObject", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, auto_created=True, verbose_name="ID", ), ), ("object_id", models.PositiveIntegerField(verbose_name="object ID")), ("is_mptt", models.BooleanField(default=False, editable=False)), ( "article", models.ForeignKey(to="wiki.Article", on_delete=models.CASCADE), ), ( "content_type", models.ForeignKey( related_name="content_type_set_for_articleforobject", verbose_name="content type", to="contenttypes.ContentType", on_delete=models.CASCADE, ), ), ], options={ "verbose_name_plural": "Articles for object", "verbose_name": "Article for object", }, bases=(models.Model, ), ), migrations.CreateModel( name="ArticlePlugin", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, auto_created=True, verbose_name="ID", ), ), ("deleted", models.BooleanField(default=False)), ("created", models.DateTimeField(auto_now_add=True)), ], options={}, bases=(models.Model, ), ), migrations.CreateModel( name="ArticleRevision", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, auto_created=True, verbose_name="ID", ), ), ( "revision_number", models.IntegerField(verbose_name="revision number", editable=False), ), ("user_message", models.TextField(blank=True)), ("automatic_log", models.TextField(blank=True, editable=False)), ( "ip_address", IPAddressField(null=True, verbose_name="IP address", blank=True, editable=False), ), ("modified", models.DateTimeField(auto_now=True)), ("created", models.DateTimeField(auto_now_add=True)), ("deleted", models.BooleanField(default=False, verbose_name="deleted")), ("locked", models.BooleanField(default=False, verbose_name="locked")), ( "content", models.TextField(blank=True, verbose_name="article contents"), ), ( "title", models.CharField( max_length=512, verbose_name="article title", help_text= "Each revision contains a title field that must be filled out, even if the title has not changed", ), ), ( "article", models.ForeignKey( to="wiki.Article", verbose_name="article", on_delete=models.CASCADE, ), ), ( "previous_revision", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to="wiki.ArticleRevision", ), ), ( "user", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name="user", ), ), ], options={ "get_latest_by": "revision_number", "ordering": ("created", ), }, bases=(models.Model, ), ), migrations.CreateModel( name="ReusablePlugin", fields=[ ( "articleplugin_ptr", models.OneToOneField( primary_key=True, parent_link=True, to="wiki.ArticlePlugin", serialize=False, auto_created=True, on_delete=models.CASCADE, ), ), ( "articles", models.ManyToManyField(related_name="shared_plugins_set", to="wiki.Article"), ), ], options={}, bases=("wiki.articleplugin", ), ), migrations.CreateModel( name="RevisionPlugin", fields=[ ( "articleplugin_ptr", models.OneToOneField( primary_key=True, parent_link=True, to="wiki.ArticlePlugin", serialize=False, auto_created=True, on_delete=models.CASCADE, ), ), ], options={}, bases=("wiki.articleplugin", ), ), migrations.CreateModel( name="RevisionPluginRevision", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, auto_created=True, verbose_name="ID", ), ), ( "revision_number", models.IntegerField(verbose_name="revision number", editable=False), ), ("user_message", models.TextField(blank=True)), ("automatic_log", models.TextField(blank=True, editable=False)), ( "ip_address", IPAddressField(null=True, verbose_name="IP address", blank=True, editable=False), ), ("modified", models.DateTimeField(auto_now=True)), ("created", models.DateTimeField(auto_now_add=True)), ("deleted", models.BooleanField(default=False, verbose_name="deleted")), ("locked", models.BooleanField(default=False, verbose_name="locked")), ( "plugin", models.ForeignKey( related_name="revision_set", to="wiki.RevisionPlugin", on_delete=models.CASCADE, ), ), ( "previous_revision", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to="wiki.RevisionPluginRevision", ), ), ( "user", models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, blank=True, to=settings.AUTH_USER_MODEL, verbose_name="user", ), ), ], options={ "get_latest_by": "revision_number", "ordering": ("-created", ), }, bases=(models.Model, ), ), migrations.CreateModel( name="SimplePlugin", fields=[ ( "articleplugin_ptr", models.OneToOneField( primary_key=True, parent_link=True, to="wiki.ArticlePlugin", serialize=False, auto_created=True, on_delete=models.CASCADE, ), ), ( "article_revision", models.ForeignKey(to="wiki.ArticleRevision", on_delete=models.CASCADE), ), ], options={}, bases=("wiki.articleplugin", ), ), migrations.CreateModel( name="URLPath", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, auto_created=True, verbose_name="ID", ), ), ("slug", models.SlugField(null=True, blank=True, verbose_name="slug")), ("lft", models.PositiveIntegerField(db_index=True, editable=False)), ("rght", models.PositiveIntegerField(db_index=True, editable=False)), ("tree_id", models.PositiveIntegerField(db_index=True, editable=False)), ("level", models.PositiveIntegerField(db_index=True, editable=False)), ( "article", models.ForeignKey( help_text= "This field is automatically updated, but you need to populate it when creating a new URL path.", on_delete=django.db.models.deletion.CASCADE, to="wiki.Article", verbose_name="article", ), ), ( "parent", mptt.fields.TreeForeignKey( blank=True, help_text="Position of URL path in the tree.", null=True, on_delete=django.db.models.deletion.CASCADE, related_name="children", to="wiki.URLPath", ), ), ( "site", models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, to="sites.Site"), ), ], options={ "verbose_name_plural": "URL paths", "verbose_name": "URL path", }, bases=(models.Model, ), ), migrations.AlterUniqueTogether( name="urlpath", unique_together=set([("site", "parent", "slug")]), ), migrations.AddField( model_name="revisionplugin", name="current_revision", field=models.OneToOneField( related_name="plugin_set", null=True, help_text= "The revision being displayed for this plugin. If you need to do a roll-back, simply change the value of this field.", blank=True, to="wiki.RevisionPluginRevision", verbose_name="current revision", on_delete=models.CASCADE, ), preserve_default=True, ), migrations.AlterUniqueTogether( name="articlerevision", unique_together=set([("article", "revision_number")]), ), migrations.AddField( model_name="articleplugin", name="article", field=models.ForeignKey(to="wiki.Article", verbose_name="article", on_delete=models.CASCADE), preserve_default=True, ), migrations.AlterUniqueTogether( name="articleforobject", unique_together=set([("content_type", "object_id")]), ), migrations.AddField( model_name="article", name="current_revision", field=models.OneToOneField( related_name="current_set", null=True, help_text= "The revision being displayed for this article. If you need to do a roll-back, simply change the value of this field.", blank=True, to="wiki.ArticleRevision", verbose_name="current revision", on_delete=models.CASCADE, ), preserve_default=True, ), migrations.AddField( model_name="article", name="group", field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, help_text= "Like in a UNIX file system, permissions can be given to a user according to group membership. Groups are handled through the Django auth system.", blank=True, to=GROUP_MODEL, verbose_name="group", ), preserve_default=True, ), migrations.AddField( model_name="article", name="owner", field=models.ForeignKey( related_name="owned_articles", null=True, on_delete=django.db.models.deletion.SET_NULL, help_text= "The owner of the article, usually the creator. The owner always has both read and write access.", blank=True, to=settings.AUTH_USER_MODEL, verbose_name="owner", ), preserve_default=True, ), ]
class Migration(migrations.Migration): dependencies = [ ("wiki", "0001_initial"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="Attachment", fields=[ ( "reusableplugin_ptr", models.OneToOneField( parent_link=True, serialize=False, primary_key=True, to="wiki.ReusablePlugin", auto_created=True, on_delete=models.CASCADE, ), ), ( "original_filename", models.CharField( max_length=256, verbose_name="original filename", blank=True, null=True, ), ), ], options={ "verbose_name": "attachment", "verbose_name_plural": "attachments", }, bases=("wiki.reusableplugin", ), ), migrations.CreateModel( name="AttachmentRevision", fields=[ ( "id", models.AutoField( serialize=False, primary_key=True, verbose_name="ID", auto_created=True, ), ), ( "revision_number", models.IntegerField(verbose_name="revision number", editable=False), ), ("user_message", models.TextField(blank=True)), ("automatic_log", models.TextField(editable=False, blank=True)), ( "ip_address", IPAddressField(editable=False, verbose_name="IP address", blank=True, null=True), ), ("modified", models.DateTimeField(auto_now=True)), ("created", models.DateTimeField(auto_now_add=True)), ("deleted", models.BooleanField(default=False, verbose_name="deleted")), ("locked", models.BooleanField(default=False, verbose_name="locked")), ( "file", models.FileField( max_length=255, verbose_name="file", upload_to=wiki.plugins.attachments.models.upload_path, ), ), ("description", models.TextField(blank=True)), ( "attachment", models.ForeignKey(to="wiki_attachments.Attachment", on_delete=models.CASCADE), ), ( "previous_revision", models.ForeignKey( blank=True, on_delete=django.db.models.deletion.SET_NULL, to="wiki_attachments.AttachmentRevision", null=True, ), ), ( "user", models.ForeignKey( blank=True, verbose_name="user", on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, null=True, ), ), ], options={ "ordering": ("created", ), "get_latest_by": "revision_number", "verbose_name": "attachment revision", "verbose_name_plural": "attachment revisions", }, bases=(models.Model, ), ), migrations.AddField( model_name="attachment", name="current_revision", field=models.OneToOneField( to="wiki_attachments.AttachmentRevision", blank=True, verbose_name="current revision", related_name="current_set", help_text= "The revision of this attachment currently in use (on all articles using the attachment)", null=True, on_delete=models.CASCADE, ), preserve_default=True, ), ]
class Migration(migrations.Migration): dependencies = [ ('wiki', '0001_initial'), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name='Attachment', fields=[ ('reusableplugin_ptr', models.OneToOneField(parent_link=True, serialize=False, primary_key=True, to='wiki.ReusablePlugin', auto_created=True, on_delete=models.CASCADE)), ('original_filename', models.CharField(max_length=256, verbose_name='original filename', blank=True, null=True)), ], options={ 'verbose_name': 'attachment', 'verbose_name_plural': 'attachments', }, bases=('wiki.reusableplugin', ), ), migrations.CreateModel( name='AttachmentRevision', fields=[ ('id', models.AutoField(serialize=False, primary_key=True, verbose_name='ID', auto_created=True)), ('revision_number', models.IntegerField(verbose_name='revision number', editable=False)), ('user_message', models.TextField(blank=True)), ('automatic_log', models.TextField(editable=False, blank=True)), ('ip_address', IPAddressField(editable=False, verbose_name='IP address', blank=True, null=True)), ('modified', models.DateTimeField(auto_now=True)), ('created', models.DateTimeField(auto_now_add=True)), ('deleted', models.BooleanField(default=False, verbose_name='deleted')), ('locked', models.BooleanField(default=False, verbose_name='locked')), ('file', models.FileField( max_length=255, verbose_name='file', upload_to=wiki.plugins.attachments.models.upload_path)), ('description', models.TextField(blank=True)), ('attachment', models.ForeignKey(to='wiki_attachments.Attachment', on_delete=models.CASCADE)), ('previous_revision', models.ForeignKey( blank=True, on_delete=django.db.models.deletion.SET_NULL, to='wiki_attachments.AttachmentRevision', null=True)), ('user', models.ForeignKey( blank=True, verbose_name='user', on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, null=True)), ], options={ 'ordering': ('created', ), 'get_latest_by': 'revision_number', 'verbose_name': 'attachment revision', 'verbose_name_plural': 'attachment revisions', }, bases=(models.Model, ), ), migrations.AddField( model_name='attachment', name='current_revision', field=models.OneToOneField( to='wiki_attachments.AttachmentRevision', blank=True, verbose_name='current revision', related_name='current_set', help_text= 'The revision of this attachment currently in use (on all articles using the attachment)', null=True, on_delete=models.CASCADE), preserve_default=True, ), ]
def test_IPAddressField(self): self.assertIsInstance(IPAddressField().get_prep_value('127.0.0.1'), unicode) self.assertIsInstance(IPAddressField().get_prep_value(0), unicode)