diff --git a/apps/backups/__init__.py b/apps/backups/__init__.py index 0842371b8f..839f928754 100644 --- a/apps/backups/__init__.py +++ b/apps/backups/__init__.py @@ -8,6 +8,7 @@ from job_processor.exceptions import JobQueuePushError from navigation.api import bind_links, register_model_list_columns from project_tools.api import register_tool from project_setup.api import register_setup +from app_registry.api import register_app from .links import backup_tool_link, restore_tool_link, backup_job_list, backup_job_create, backup_job_edit, backup_job_test from .models import BackupJob @@ -38,3 +39,5 @@ register_model_list_columns(BackupJob, [ {'name':_(u'begin date time'), 'attribute': 'begin_datetime'}, {'name':_(u'storage module'), 'attribute': 'storage_module'}, ]) + +register_app('backups', _(u'Backups')) diff --git a/apps/backups/forms.py b/apps/backups/forms.py index 2c57f703a0..2b48ad9624 100644 --- a/apps/backups/forms.py +++ b/apps/backups/forms.py @@ -2,12 +2,21 @@ from __future__ import absolute_import from django import forms +from app_registry.models import App + from .models import BackupJob +from .api import AppBackup + + +def valid_app_choices(): + return App.live.filter(name__in=[appbackup.name for appbackup in AppBackup.get_all()]) class BackupJobForm(forms.ModelForm): #expiration_datetime = SplitTimeDeltaField() + apps = forms.ModelChoiceField(queryset=valid_app_choices()) + class Meta: model = BackupJob #exclude = ('checkout_datetime', 'user_content_type', 'user_object_id') diff --git a/apps/backups/migrations/0005_auto__del_backupjobapp.py b/apps/backups/migrations/0005_auto__del_backupjobapp.py new file mode 100644 index 0000000000..e0c98b05b4 --- /dev/null +++ b/apps/backups/migrations/0005_auto__del_backupjobapp.py @@ -0,0 +1,55 @@ +# -*- 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): + # Deleting model 'BackupJobApp' + db.delete_table('backups_backupjobapp') + + # Adding M2M table for field app on 'BackupJob' + db.create_table('backups_backupjob_app', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('backupjob', models.ForeignKey(orm['backups.backupjob'], null=False)), + ('app', models.ForeignKey(orm['app_registry.app'], null=False)) + )) + db.create_unique('backups_backupjob_app', ['backupjob_id', 'app_id']) + + + def backwards(self, orm): + # Adding model 'BackupJobApp' + db.create_table('backups_backupjobapp', ( + ('backup_job', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['backups.BackupJob'])), + ('app_backup', self.gf('django.db.models.fields.CharField')(max_length=64)), + ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), + )) + db.send_create_signal('backups', ['BackupJobApp']) + + # Removing M2M table for field app on 'BackupJob' + db.delete_table('backups_backupjob_app') + + + models = { + 'app_registry.app': { + 'Meta': {'ordering': "('name',)", 'object_name': 'App'}, + 'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}) + }, + 'backups.backupjob': { + 'Meta': {'object_name': 'BackupJob'}, + 'app': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['app_registry.App']", 'symmetrical': 'False'}), + 'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 14, 0, 0)'}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'storage_module_name': ('django.db.models.fields.CharField', [], {'max_length': '16'}) + } + } + + complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/migrations/0006_auto.py b/apps/backups/migrations/0006_auto.py new file mode 100644 index 0000000000..4cbb57f304 --- /dev/null +++ b/apps/backups/migrations/0006_auto.py @@ -0,0 +1,55 @@ +# -*- 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): + # Removing M2M table for field app on 'BackupJob' + db.delete_table('backups_backupjob_app') + + # Adding M2M table for field apps on 'BackupJob' + db.create_table('backups_backupjob_apps', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('backupjob', models.ForeignKey(orm['backups.backupjob'], null=False)), + ('app', models.ForeignKey(orm['app_registry.app'], null=False)) + )) + db.create_unique('backups_backupjob_apps', ['backupjob_id', 'app_id']) + + + def backwards(self, orm): + # Adding M2M table for field app on 'BackupJob' + db.create_table('backups_backupjob_app', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('backupjob', models.ForeignKey(orm['backups.backupjob'], null=False)), + ('app', models.ForeignKey(orm['app_registry.app'], null=False)) + )) + db.create_unique('backups_backupjob_app', ['backupjob_id', 'app_id']) + + # Removing M2M table for field apps on 'BackupJob' + db.delete_table('backups_backupjob_apps') + + + models = { + 'app_registry.app': { + 'Meta': {'ordering': "('name',)", 'object_name': 'App'}, + 'icon': ('django.db.models.fields.CharField', [], {'max_length': '64', 'blank': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '64'}) + }, + 'backups.backupjob': { + 'Meta': {'object_name': 'BackupJob'}, + 'apps': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['app_registry.App']", 'symmetrical': 'False'}), + 'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 14, 0, 0)'}), + 'enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}), + 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'name': ('django.db.models.fields.CharField', [], {'max_length': '64'}), + 'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}), + 'storage_module_name': ('django.db.models.fields.CharField', [], {'max_length': '16'}) + } + } + + complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/models.py b/apps/backups/models.py index efe384decc..ce167561e9 100644 --- a/apps/backups/models.py +++ b/apps/backups/models.py @@ -8,6 +8,8 @@ from django.utils.translation import ugettext_lazy as _ from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes import generic +from app_registry.models import App + from .api import AppBackup, StorageModuleBase logger = logging.getLogger(__name__) @@ -16,6 +18,7 @@ logger = logging.getLogger(__name__) class BackupJob(models.Model): name = models.CharField(max_length=64, verbose_name=_(u'name')) enabled = models.BooleanField(default=True, verbose_name=_(u'enabled')) + apps = models.ManyToManyField(App) begin_datetime = models.DateTimeField(verbose_name=_(u'begin date and time'), default=lambda: datetime.datetime.now()) # * repetition = @@ -34,9 +37,9 @@ class BackupJob(models.Model): storage_module_name = models.CharField(max_length=16, choices=StorageModuleBase.get_as_choices(), verbose_name=_(u'storage module')) storage_arguments_json = models.TextField(verbose_name=_(u'storage module arguments (in JSON)'), blank=True) - @property - def apps(self): - return self.backupjobapp_set + #@property + #def apps(self): + # return self.backupjobapp_set def __unicode__(self): return self.name @@ -51,7 +54,8 @@ class BackupJob(models.Model): storage_module = self.storage_module #TODO: loads for app in self.apps.all(): - app.backup(storage_module(backup_path='/tmp', dry_run=dry_run), dry_run=dry_run) + app_backup = AppBackup.get(app.name) + app_backup.backup(storage_module(backup_path='/tmp', dry_run=dry_run), dry_run=dry_run) def save(self, *args, **kwargs): #dump @@ -66,9 +70,9 @@ class BackupJob(models.Model): verbose_name_plural = _(u'document checkouts') -class BackupJobApp(models.Model): - backup_job = models.ForeignKey(BackupJob) - app_backup = models.CharField(max_length=64, choices=AppBackup.get_as_choices()) +#class BackupJobApp(models.Model): +# backup_job = models.ForeignKey(BackupJob) +# app_backup = models.CharField(max_length=64, choices=AppBackup.get_as_choices()) #class BackupJobLog diff --git a/apps/bootstrap/__init__.py b/apps/bootstrap/__init__.py index 31bf678d86..b7155cd388 100644 --- a/apps/bootstrap/__init__.py +++ b/apps/bootstrap/__init__.py @@ -1,7 +1,10 @@ from __future__ import absolute_import +from django.utils.translation import ugettext_lazy as _ + from project_setup.api import register_setup from navigation.api import bind_links +from app_registry.api import register_app from .links import database_bootstrap, bootstrap_execute, erase_database_link from .api import BootstrapSimple, BootstrapPermit @@ -10,3 +13,4 @@ register_setup(database_bootstrap) register_setup(erase_database_link) bind_links([BootstrapSimple], [bootstrap_execute]) bind_links([BootstrapPermit], [bootstrap_execute]) +register_app('bootstrap', _(u'Database bootstrap')) diff --git a/apps/checkouts/__init__.py b/apps/checkouts/__init__.py index 1991c69cf1..194d655c93 100644 --- a/apps/checkouts/__init__.py +++ b/apps/checkouts/__init__.py @@ -4,7 +4,7 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import bind_links, register_top_menu from scheduler.api import LocalScheduler - +from app_registry.api import register_app from documents.models import Document from acls.api import class_permissions @@ -40,3 +40,4 @@ checkouts_scheduler.add_interval_job('task_check_expired_check_outs', _(u'Check checkouts_scheduler.start() initialize_document_checkout_extra_methods() +register_app('checkouts', _(u'Checkouts')) diff --git a/apps/folders/__init__.py b/apps/folders/__init__.py index ce6bb91c89..22701bb148 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -7,7 +7,8 @@ from navigation.api import (bind_links, register_top_menu, from documents.models import Document from acls.api import class_permissions from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL -from backups.api import AppBackup, ElementBackupModel +from backups.api import AppBackup, ModelBackup +from app_registry.api import register_app from .models import Folder from .links import (folder_list, folder_create, folder_edit, @@ -44,4 +45,6 @@ class_permissions(Document, [ PERMISSION_FOLDER_REMOVE_DOCUMENT, ]) -AppBackup('folders', _(u'Folders'), [ElementBackupModel()]) +app = register_app('folders', _(u'Folders')) +AppBackup('folders', app.label, [ModelBackup()]) + diff --git a/settings.py b/settings.py index 6728aaa3ef..63b73e4985 100644 --- a/settings.py +++ b/settings.py @@ -167,6 +167,8 @@ INSTALLED_APPS = ( 'scheduler', 'job_processor', 'backups', + 'app_registry', + 'icons', # Mayan EDMS 'diagnostics', 'maintenance', diff --git a/urls.py b/urls.py index b62b2a388b..525da391a5 100644 --- a/urls.py +++ b/urls.py @@ -44,6 +44,7 @@ urlpatterns = patterns('', (r'^clustering/', include('clustering.urls')), (r'^trash/', include('trash.urls')), (r'^backups/', include('backups.urls')), + (r'^apps/', include('app_registry.urls')), )