Revision: 11511
http://freenas.svn.sourceforge.net/freenas/?rev=11511&view=rev
Author: zippybr
Date: 2012-05-21 15:58:53 +0000 (Mon, 21 May 2012)
Log Message:
-----------
GUI changes to move the relationship of smart tests and disks from 1:1 to 1:n
Backend to catch up with this comming soon.
Modified Paths:
--------------
trunk/gui/system/forms.py
trunk/gui/system/models.py
Added Paths:
-----------
trunk/gui/system/migrations/0038_auto.py
trunk/gui/system/migrations/0039_auto__del_field_smarttest_smarttest_disk__del_unique_smarttest_smartte.py
Modified: trunk/gui/system/forms.py
===================================================================
--- trunk/gui/system/forms.py 2012-05-21 15:58:23 UTC (rev 11510)
+++ trunk/gui/system/forms.py 2012-05-21 15:58:53 UTC (rev 11511)
@@ -405,6 +405,23 @@
class SMARTTestForm(ModelForm):
+ class Meta:
+ model = models.SMARTTest
+ widgets = {
+ 'smarttest_hour': CronMultiple(
+ attrs={'numChoices': 24, 'label': _("hour")}
+ ),
+ 'smarttest_daymonth': CronMultiple(
+ attrs={'numChoices': 31, 'start': 1, 'label': _("day of month")}
+ ),
+ 'smarttest_dayweek': forms.CheckboxSelectMultiple(
+ choices=choices.WEEKDAYS_CHOICES
+ ),
+ 'smarttest_month': forms.CheckboxSelectMultiple(
+ choices=choices.MONTHS_CHOICES
+ ),
+ }
+
def __init__(self, *args, **kwargs):
if 'instance' in kwargs:
ins = kwargs.get('instance')
@@ -426,11 +443,34 @@
if everyx == hours:
ins.smarttest_hour = '*/%d' % gap
super(SMARTTestForm, self).__init__(*args, **kwargs)
+ self.fields.keyOrder.remove('smarttest_disks')
+ self.fields.keyOrder.insert(0, 'smarttest_disks')
def save(self):
super(SMARTTestForm, self).save()
notifier().restart("smartd")
+ def clean_smarttest_disks(self):
+ disks = self.cleaned_data.get("smarttest_disks")
+ used_disks = []
+ for disk in disks:
+ qs = models.SMARTTest.objects.filter(
+ smarttest_disks__in=[disk]
+ )
+ if self.instance.id:
+ qs = qs.exclude(id=self.instance.id)
+ if qs.count() > 0:
+ used_disks.append(disk.disk_name)
+ if used_disks:
+ raise forms.ValidationError(
+ _("The following disks already have tests for this type: "
+ "%s" % (
+ ', '.join(used_disks),
+ ),
+ )
+ )
+ return disks
+
def clean_smarttest_hour(self):
h = self.cleaned_data.get("smarttest_hour")
if h.startswith('*/'):
@@ -458,24 +498,7 @@
w = ",".join(w)
return w
- class Meta:
- model = models.SMARTTest
- widgets = {
- 'smarttest_hour': CronMultiple(
- attrs={'numChoices': 24, 'label': _("hour")}
- ),
- 'smarttest_daymonth': CronMultiple(
- attrs={'numChoices': 31, 'start': 1, 'label': _("day of month")}
- ),
- 'smarttest_dayweek': forms.CheckboxSelectMultiple(
- choices=choices.WEEKDAYS_CHOICES
- ),
- 'smarttest_month': forms.CheckboxSelectMultiple(
- choices=choices.MONTHS_CHOICES
- ),
- }
-
class FirmwareTemporaryLocationForm(Form):
mountpoint = forms.ChoiceField(
label=_("Place to temporarily place firmware file"),
Added: trunk/gui/system/migrations/0038_auto.py
===================================================================
--- trunk/gui/system/migrations/0038_auto.py (rev 0)
+++ trunk/gui/system/migrations/0038_auto.py 2012-05-21 15:58:53 UTC (rev 11511)
@@ -0,0 +1,180 @@
+# encoding: 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 M2M table for field smarttest_disks on 'SMARTTest'
+ db.create_table('system_smarttest_smarttest_disks', (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('smarttest', models.ForeignKey(orm['system.smarttest'], null=False)),
+ ('disk', models.ForeignKey(orm['storage.disk'], null=False))
+ ))
+ db.create_unique('system_smarttest_smarttest_disks', ['smarttest_id', 'disk_id'])
+
+ for obj in orm.SMARTTest.objects.all():
+ disk = obj.smarttest_disk
+ obj.smarttest_disks.add(disk)
+ obj.save()
+
+
+ def backwards(self, orm):
+
+ # Removing M2M table for field smarttest_disks on 'SMARTTest'
+ db.delete_table('system_smarttest_smarttest_disks')
+
+
+ models = {
+ 'storage.disk': {
+ 'Meta': {'ordering': "['disk_name']", 'object_name': 'Disk'},
+ 'disk_acousticlevel': ('django.db.models.fields.CharField', [], {'default': "'Disabled'", 'max_length': '120'}),
+ 'disk_advpowermgmt': ('django.db.models.fields.CharField', [], {'default': "'Disabled'", 'max_length': '120'}),
+ 'disk_description': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'disk_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'disk_hddstandby': ('django.db.models.fields.CharField', [], {'default': "'Always On'", 'max_length': '120'}),
+ 'disk_identifier': ('django.db.models.fields.CharField', [], {'max_length': '42'}),
+ 'disk_multipath_member': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'disk_multipath_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'disk_name': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+ 'disk_serial': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'disk_smartoptions': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'disk_togglesmart': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'disk_transfermode': ('django.db.models.fields.CharField', [], {'default': "'Auto'", 'max_length': '120'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.advanced': {
+ 'Meta': {'object_name': 'Advanced'},
+ 'adv_advancedmode': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_autotune': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_consolemenu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_consolemsg': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'adv_consolescreensaver': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_firmwarevc': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_motd': ('django.db.models.fields.TextField', [], {'max_length': '1024'}),
+ 'adv_powerdaemon': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_serialconsole': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_swapondrive': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'adv_systembeep': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_traceback': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'adv_tuning': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_zeroconfbonjour': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.cronjob': {
+ 'Meta': {'ordering': "['cron_description', 'cron_user']", 'object_name': 'CronJob'},
+ 'cron_command': ('django.db.models.fields.TextField', [], {}),
+ 'cron_daymonth': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'cron_dayweek': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7'", 'max_length': '100'}),
+ 'cron_description': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'cron_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'cron_hour': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'cron_minute': ('django.db.models.fields.CharField', [], {'default': "'00'", 'max_length': '100'}),
+ 'cron_month': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7,8,9,a,b,c'", 'max_length': '100'}),
+ 'cron_user': ('freeadmin.models.UserField', [], {'max_length': '60'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.email': {
+ 'Meta': {'object_name': 'Email'},
+ 'em_fromemail': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '120'}),
+ 'em_outgoingserver': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'em_pass': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'em_port': ('django.db.models.fields.IntegerField', [], {'default': '25'}),
+ 'em_security': ('django.db.models.fields.CharField', [], {'default': "'plain'", 'max_length': '120'}),
+ 'em_smtp': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'em_user': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.ntpserver': {
+ 'Meta': {'ordering': "['ntp_address']", 'object_name': 'NTPServer'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ntp_address': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+ 'ntp_burst': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'ntp_iburst': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'ntp_maxpoll': ('django.db.models.fields.IntegerField', [], {'default': '10'}),
+ 'ntp_minpoll': ('django.db.models.fields.IntegerField', [], {'default': '6'}),
+ 'ntp_prefer': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'system.rsync': {
+ 'Meta': {'ordering': "['rsync_path', 'rsync_desc']", 'object_name': 'Rsync'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'rsync_archive': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_compress': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_daymonth': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'rsync_dayweek': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7'", 'max_length': '100'}),
+ 'rsync_delete': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_desc': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'rsync_direction': ('django.db.models.fields.CharField', [], {'default': "'push'", 'max_length': '10'}),
+ 'rsync_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_extra': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'rsync_hour': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'rsync_minute': ('django.db.models.fields.CharField', [], {'default': "'00'", 'max_length': '100'}),
+ 'rsync_mode': ('django.db.models.fields.CharField', [], {'default': "'module'", 'max_length': '20'}),
+ 'rsync_month': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7,8,9,a,b,c'", 'max_length': '100'}),
+ 'rsync_path': ('freeadmin.models.PathField', [], {'max_length': '255'}),
+ 'rsync_preserveattr': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_preserveperm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_quiet': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_recursive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_remotehost': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+ 'rsync_remotemodule': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'rsync_remotepath': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'rsync_times': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_user': ('freeadmin.models.UserField', [], {'max_length': '60'})
+ },
+ 'system.settings': {
+ 'Meta': {'object_name': 'Settings'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'stg_guiaddress': ('django.db.models.fields.CharField', [], {'default': "'0.0.0.0'", 'max_length': '120', 'blank': 'True'}),
+ 'stg_guiport': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '120', 'blank': 'True'}),
+ 'stg_guiprotocol': ('django.db.models.fields.CharField', [], {'default': "'http'", 'max_length': '120'}),
+ 'stg_language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '120'}),
+ 'stg_syslogserver': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '120', 'blank': 'True'}),
+ 'stg_timezone': ('django.db.models.fields.CharField', [], {'default': "'America/Los_Angeles'", 'max_length': '120'})
+ },
+ 'system.smarttest': {
+ 'Meta': {'ordering': "['smarttest_disk']", 'unique_together': "(('smarttest_disk', 'smarttest_type'),)", 'object_name': 'SMARTTest'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'smarttest_daymonth': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'smarttest_dayweek': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7'", 'max_length': '100'}),
+ 'smarttest_desc': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'smarttest_disk': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'smarttestdisk'", 'to': "orm['storage.Disk']"}),
+ 'smarttest_disks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['storage.Disk']", 'symmetrical': 'False'}),
+ 'smarttest_hour': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'smarttest_month': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7,8,9,10,a,b,c'", 'max_length': '100'}),
+ 'smarttest_type': ('django.db.models.fields.CharField', [], {'max_length': '2', 'blank': 'True'})
+ },
+ 'system.ssl': {
+ 'Meta': {'object_name': 'SSL'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ssl_certfile': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'ssl_city': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_common': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_country': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_email': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_org': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_state': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_unit': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'})
+ },
+ 'system.sysctl': {
+ 'Meta': {'ordering': "['sysctl_mib']", 'object_name': 'Sysctl'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'sysctl_comment': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'sysctl_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'sysctl_mib': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+ 'sysctl_value': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'system.tunable': {
+ 'Meta': {'ordering': "['tun_var']", 'object_name': 'Tunable'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'tun_comment': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'tun_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'tun_value': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'tun_var': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['system']
Added: trunk/gui/system/migrations/0039_auto__del_field_smarttest_smarttest_disk__del_unique_smarttest_smartte.py
===================================================================
--- trunk/gui/system/migrations/0039_auto__del_field_smarttest_smarttest_disk__del_unique_smarttest_smartte.py (rev 0)
+++ trunk/gui/system/migrations/0039_auto__del_field_smarttest_smarttest_disk__del_unique_smarttest_smartte.py 2012-05-21 15:58:53 UTC (rev 11511)
@@ -0,0 +1,175 @@
+# encoding: 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):
+
+ # Removing unique constraint on 'SMARTTest', fields ['smarttest_type', 'smarttest_disk']
+ db.delete_unique('system_smarttest', ['smarttest_type', 'smarttest_disk_id'])
+
+ # Deleting field 'SMARTTest.smarttest_disk'
+ db.delete_column('system_smarttest', 'smarttest_disk_id')
+
+
+ def backwards(self, orm):
+
+ # Adding field 'SMARTTest.smarttest_disk'
+ db.add_column('system_smarttest', 'smarttest_disk', self.gf('django.db.models.fields.related.ForeignKey')(default=1, related_name='smarttestdisk', to=orm['storage.Disk']), keep_default=False)
+
+ # Adding unique constraint on 'SMARTTest', fields ['smarttest_type', 'smarttest_disk']
+ db.create_unique('system_smarttest', ['smarttest_type', 'smarttest_disk_id'])
+
+
+ models = {
+ 'storage.disk': {
+ 'Meta': {'ordering': "['disk_name']", 'object_name': 'Disk'},
+ 'disk_acousticlevel': ('django.db.models.fields.CharField', [], {'default': "'Disabled'", 'max_length': '120'}),
+ 'disk_advpowermgmt': ('django.db.models.fields.CharField', [], {'default': "'Disabled'", 'max_length': '120'}),
+ 'disk_description': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'disk_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'disk_hddstandby': ('django.db.models.fields.CharField', [], {'default': "'Always On'", 'max_length': '120'}),
+ 'disk_identifier': ('django.db.models.fields.CharField', [], {'max_length': '42'}),
+ 'disk_multipath_member': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'disk_multipath_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'disk_name': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+ 'disk_serial': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
+ 'disk_smartoptions': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'disk_togglesmart': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'disk_transfermode': ('django.db.models.fields.CharField', [], {'default': "'Auto'", 'max_length': '120'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.advanced': {
+ 'Meta': {'object_name': 'Advanced'},
+ 'adv_advancedmode': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_autotune': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_consolemenu': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_consolemsg': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'adv_consolescreensaver': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_firmwarevc': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_motd': ('django.db.models.fields.TextField', [], {'max_length': '1024'}),
+ 'adv_powerdaemon': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_serialconsole': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_swapondrive': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'adv_systembeep': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_traceback': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'adv_tuning': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'adv_zeroconfbonjour': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.cronjob': {
+ 'Meta': {'ordering': "['cron_description', 'cron_user']", 'object_name': 'CronJob'},
+ 'cron_command': ('django.db.models.fields.TextField', [], {}),
+ 'cron_daymonth': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'cron_dayweek': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7'", 'max_length': '100'}),
+ 'cron_description': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'cron_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'cron_hour': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'cron_minute': ('django.db.models.fields.CharField', [], {'default': "'00'", 'max_length': '100'}),
+ 'cron_month': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7,8,9,a,b,c'", 'max_length': '100'}),
+ 'cron_user': ('freeadmin.models.UserField', [], {'max_length': '60'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.email': {
+ 'Meta': {'object_name': 'Email'},
+ 'em_fromemail': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '120'}),
+ 'em_outgoingserver': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'em_pass': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'em_port': ('django.db.models.fields.IntegerField', [], {'default': '25'}),
+ 'em_security': ('django.db.models.fields.CharField', [], {'default': "'plain'", 'max_length': '120'}),
+ 'em_smtp': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'em_user': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ 'system.ntpserver': {
+ 'Meta': {'ordering': "['ntp_address']", 'object_name': 'NTPServer'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ntp_address': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+ 'ntp_burst': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'ntp_iburst': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'ntp_maxpoll': ('django.db.models.fields.IntegerField', [], {'default': '10'}),
+ 'ntp_minpoll': ('django.db.models.fields.IntegerField', [], {'default': '6'}),
+ 'ntp_prefer': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
+ },
+ 'system.rsync': {
+ 'Meta': {'ordering': "['rsync_path', 'rsync_desc']", 'object_name': 'Rsync'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'rsync_archive': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_compress': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_daymonth': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'rsync_dayweek': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7'", 'max_length': '100'}),
+ 'rsync_delete': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_desc': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'rsync_direction': ('django.db.models.fields.CharField', [], {'default': "'push'", 'max_length': '10'}),
+ 'rsync_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_extra': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'rsync_hour': ('django.db.models.fields.CharField', [], {'default': "'*'", 'max_length': '100'}),
+ 'rsync_minute': ('django.db.models.fields.CharField', [], {'default': "'00'", 'max_length': '100'}),
+ 'rsync_mode': ('django.db.models.fields.CharField', [], {'default': "'module'", 'max_length': '20'}),
+ 'rsync_month': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7,8,9,a,b,c'", 'max_length': '100'}),
+ 'rsync_path': ('freeadmin.models.PathField', [], {'max_length': '255'}),
+ 'rsync_preserveattr': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_preserveperm': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_quiet': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'rsync_recursive': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_remotehost': ('django.db.models.fields.CharField', [], {'max_length': '120'}),
+ 'rsync_remotemodule': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'rsync_remotepath': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'rsync_times': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'rsync_user': ('freeadmin.models.UserField', [], {'max_length': '60'})
+ },
+ 'system.settings': {
+ 'Meta': {'object_name': 'Settings'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'stg_guiaddress': ('django.db.models.fields.CharField', [], {'default': "'0.0.0.0'", 'max_length': '120', 'blank': 'True'}),
+ 'stg_guiport': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '120', 'blank': 'True'}),
+ 'stg_guiprotocol': ('django.db.models.fields.CharField', [], {'default': "'http'", 'max_length': '120'}),
+ 'stg_language': ('django.db.models.fields.CharField', [], {'default': "'en'", 'max_length': '120'}),
+ 'stg_syslogserver': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '120', 'blank': 'True'}),
+ 'stg_timezone': ('django.db.models.fields.CharField', [], {'default': "'America/Los_Angeles'", 'max_length': '120'})
+ },
+ 'system.smarttest': {
+ 'Meta': {'ordering': "['smarttest_type']", 'object_name': 'SMARTTest'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'smarttest_daymonth': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'smarttest_dayweek': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7'", 'max_length': '100'}),
+ 'smarttest_desc': ('django.db.models.fields.CharField', [], {'max_length': '120', 'blank': 'True'}),
+ 'smarttest_disks': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['storage.Disk']", 'symmetrical': 'False'}),
+ 'smarttest_hour': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'smarttest_month': ('django.db.models.fields.CharField', [], {'default': "'1,2,3,4,5,6,7,8,9,10,a,b,c'", 'max_length': '100'}),
+ 'smarttest_type': ('django.db.models.fields.CharField', [], {'max_length': '2'})
+ },
+ 'system.ssl': {
+ 'Meta': {'object_name': 'SSL'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'ssl_certfile': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'ssl_city': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_common': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_country': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_email': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_org': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_state': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'}),
+ 'ssl_unit': ('django.db.models.fields.CharField', [], {'max_length': '120', 'null': 'True', 'blank': 'True'})
+ },
+ 'system.sysctl': {
+ 'Meta': {'ordering': "['sysctl_mib']", 'object_name': 'Sysctl'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'sysctl_comment': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'sysctl_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'sysctl_mib': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'}),
+ 'sysctl_value': ('django.db.models.fields.CharField', [], {'max_length': '50'})
+ },
+ 'system.tunable': {
+ 'Meta': {'ordering': "['tun_var']", 'object_name': 'Tunable'},
+ 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'tun_comment': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'tun_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'tun_value': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'tun_var': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '50'})
+ }
+ }
+
+ complete_apps = ['system']
Modified: trunk/gui/system/models.py
===================================================================
--- trunk/gui/system/models.py 2012-05-21 15:58:23 UTC (rev 11510)
+++ trunk/gui/system/models.py 2012-05-21 15:58:53 UTC (rev 11511)
@@ -649,16 +649,15 @@
class SMARTTest(Model):
- smarttest_disk = models.ForeignKey(
+ smarttest_disks = models.ManyToManyField(
Disk,
limit_choices_to={'disk_enabled': True},
- verbose_name=_("Disk"),
+ verbose_name=_("Disks"),
)
smarttest_type = models.CharField(
choices=choices.SMART_TEST,
max_length=2,
verbose_name=_("Type"),
- blank=True,
)
smarttest_desc = models.CharField(
max_length=120,
@@ -729,9 +728,16 @@
return ', '.join(labels)
def __unicode__(self):
+ if self.smarttest_disks.count() > 3:
+ disks = [d.disk_name for d in self.smarttest_disks.all()[:3]]
+ disks = ', '.join(disks) + '...'
+ else:
+ disks = [d.disk_name for d in self.smarttest_disks.all()]
+ disks = ', '.join(disks)
+
return "%s (%s) " % (
- unicode(self.smarttest_disk),
- self.get_smarttest_type_display()
+ self.get_smarttest_type_display(),
+ disks
)
def delete(self):
@@ -744,10 +750,7 @@
class Meta:
verbose_name = _("S.M.A.R.T. Test")
verbose_name_plural = _("S.M.A.R.T. Tests")
- ordering = ["smarttest_disk"]
- unique_together = (
- ('smarttest_disk', 'smarttest_type'),
- )
+ ordering = ["smarttest_type"]
class FreeAdmin:
icon_model = u"SMARTIcon"
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|