From 67b4e7ebc374f5b3f483f3876ff2e1a418f74c70 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 17 Aug 2012 19:52:09 -0400 Subject: [PATCH] Merge app_registry and backups apps --- apps/app_registry/__init__.py | 47 ++++++- .../api.py => app_registry/classes.py} | 0 apps/{backups => app_registry}/forms.py | 5 +- apps/app_registry/links.py | 11 +- apps/app_registry/models.py | 104 +++++++++------ apps/{backups => app_registry}/permissions.py | 0 apps/app_registry/urls.py | 5 + apps/app_registry/views.py | 122 ++++++++++++++++- apps/backups/__init__.py | 53 -------- apps/backups/links.py | 16 --- apps/backups/migrations/0001_initial.py | 55 -------- ...ckupjob_label__add_field_backupjob_name.py | 45 ------- ...ge_module__add_field_backupjob_storage_.py | 45 ------- .../0004_auto__add_field_backupjob_enabled.py | 40 ------ .../migrations/0005_auto__del_backupjobapp.py | 55 -------- apps/backups/migrations/0006_auto.py | 55 -------- ...chg_field_backupjob_storage_module_name.py | 39 ------ apps/backups/migrations/__init__.py | 0 apps/backups/models.py | 69 ---------- apps/backups/static/images/icons/cd_burn.png | Bin 2348 -> 0 bytes apps/backups/static/images/icons/cd_eject.png | Bin 2345 -> 0 bytes apps/backups/urls.py | 9 -- apps/backups/views.py | 125 ------------------ apps/checkouts/__init__.py | 16 +-- apps/common/models.py | 43 ++++++ apps/document_indexing/__init__.py | 16 +-- apps/documents/__init__.py | 16 +-- apps/folders/__init__.py | 16 +-- apps/history/__init__.py | 6 +- apps/installation/__init__.py | 16 +-- apps/job_processor/__init__.py | 16 +-- apps/linking/__init__.py | 16 +-- apps/metadata/__init__.py | 16 +-- apps/permissions/__init__.py | 16 +-- apps/sources/__init__.py | 16 +-- apps/tags/__init__.py | 16 +-- apps/user_management/__init__.py | 12 +- settings.py | 1 - urls.py | 3 +- 39 files changed, 378 insertions(+), 763 deletions(-) rename apps/{backups/api.py => app_registry/classes.py} (100%) rename apps/{backups => app_registry}/forms.py (85%) rename apps/{backups => app_registry}/permissions.py (100%) delete mode 100644 apps/backups/__init__.py delete mode 100644 apps/backups/links.py delete mode 100644 apps/backups/migrations/0001_initial.py delete mode 100644 apps/backups/migrations/0002_auto__del_field_backupjob_label__add_field_backupjob_name.py delete mode 100644 apps/backups/migrations/0003_auto__del_field_backupjob_storage_module__add_field_backupjob_storage_.py delete mode 100644 apps/backups/migrations/0004_auto__add_field_backupjob_enabled.py delete mode 100644 apps/backups/migrations/0005_auto__del_backupjobapp.py delete mode 100644 apps/backups/migrations/0006_auto.py delete mode 100644 apps/backups/migrations/0007_auto__chg_field_backupjob_storage_module_name.py delete mode 100644 apps/backups/migrations/__init__.py delete mode 100644 apps/backups/models.py delete mode 100644 apps/backups/static/images/icons/cd_burn.png delete mode 100644 apps/backups/static/images/icons/cd_eject.png delete mode 100644 apps/backups/urls.py delete mode 100644 apps/backups/views.py diff --git a/apps/app_registry/__init__.py b/apps/app_registry/__init__.py index c625e9a29f..8e814e4f25 100644 --- a/apps/app_registry/__init__.py +++ b/apps/app_registry/__init__.py @@ -1,17 +1,23 @@ from __future__ import absolute_import +from django.db import transaction, DatabaseError from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from icons.literals import APP -from navigation.api import bind_links +from common.utils import encapsulate +from icons.literals import APP, BACKUPS +from job_processor.exceptions import JobQueuePushError +from job_processor.models import JobQueue, JobType from project_tools.api import register_tool from project_setup.api import register_setup +from navigation.api import bind_links, register_model_list_columns -from .models import App -from .links import app_registry_tool_link, app_list from .api import register_app +from .classes import AppBackup, ModelBackup from .exceptions import UnableToRegister +from .links import (app_registry_tool_link, app_list, backup_tool_link, + restore_tool_link, backup_job_list, backup_job_create, backup_job_edit, + backup_job_test) +from .models import App, BackupJob register_tool(app_registry_tool_link) bind_links(['app_list'], [app_list], menu_name='secondary_menu') @@ -20,6 +26,33 @@ try: app = register_app('app_registry', label=_(u'App registry'), icon=APP) except UnableToRegister: pass -else: - AppBackup(app, [ModelBackup()]) +#else: +# AppBackup(app, [ModelBackup()]) +# TODO: move to literals +BACKUP_JOB_QUEUE_NAME = 'backups_queue' + + +@transaction.commit_on_success +def create_backups_job_queue(): + global backups_job_queue + try: + backups_job_queue, created = JobQueue.objects.get_or_create(name=BACKUP_JOB_QUEUE_NAME, defaults={'label': _('Backups'), 'unique_jobs': True}) + except DatabaseError: + transaction.rollback() + + +create_backups_job_queue() +#backup_job_type = JobType('remote_backup', _(u'Remove backup'), do_backup) + +register_setup(backup_tool_link) +register_tool(restore_tool_link) +bind_links([BackupJob, 'backup_job_list', 'backup_job_create'], [backup_job_list], menu_name='secondary_menu') +bind_links([BackupJob, 'backup_job_list', 'backup_job_create'], [backup_job_create], menu_name='sidebar') +bind_links([BackupJob], [backup_job_edit, backup_job_test]) + +register_model_list_columns(BackupJob, [ + {'name':_(u'begin date time'), 'attribute': 'begin_datetime'}, + {'name':_(u'storage module'), 'attribute': 'storage_module.label'}, + {'name':_(u'apps'), 'attribute': encapsulate(lambda x: u', '.join([unicode(app) for app in x.apps.all()]))}, +]) diff --git a/apps/backups/api.py b/apps/app_registry/classes.py similarity index 100% rename from apps/backups/api.py rename to apps/app_registry/classes.py diff --git a/apps/backups/forms.py b/apps/app_registry/forms.py similarity index 85% rename from apps/backups/forms.py rename to apps/app_registry/forms.py index 8705815a2c..e96e0c4ef3 100644 --- a/apps/backups/forms.py +++ b/apps/app_registry/forms.py @@ -2,11 +2,10 @@ from __future__ import absolute_import from django import forms -from app_registry.models import App from common.widgets import ScrollableCheckboxSelectMultiple -from .models import BackupJob -from .api import AppBackup +from .classes import AppBackup +from .models import App, BackupJob def valid_app_choices(): diff --git a/apps/app_registry/links.py b/apps/app_registry/links.py index 1a044ef133..f0f613645f 100644 --- a/apps/app_registry/links.py +++ b/apps/app_registry/links.py @@ -6,7 +6,16 @@ from navigation.api import Link from icons.api import get_icon_name, get_sprite_name from icons.literals import APP -#from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT, PERMISSION_BACKUP_JOB_DELETE +from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT, PERMISSION_BACKUP_JOB_DELETE app_registry_tool_link = Link(text=_(u'Apps'), view='app_list', icon=get_icon_name(APP))#, permissions=[PERMISSION_BACKUP_JOB_VIEW]) app_list = Link(text=_(u'app list'), view='app_list', sprite=get_sprite_name(APP))#, permissions=[PERMISSION_BACKUP_JOB_VIEW]) + +backup_tool_link = Link(text=_(u'backups'), view='backup_job_list', icon='cd_burn.png', permissions=[PERMISSION_BACKUP_JOB_VIEW]) +backup_job_list = Link(text=_(u'backup job list'), view='backup_job_list', sprite='cd_burn', permissions=[PERMISSION_BACKUP_JOB_VIEW]) +backup_job_create = Link(text=_(u'create'), view='backup_job_create', sprite='cd_add', permissions=[PERMISSION_BACKUP_JOB_CREATE]) +backup_job_edit = Link(text=_(u'edit'), view='backup_job_edit', args='object.pk', sprite='cd_edit', permissions=[PERMISSION_BACKUP_JOB_EDIT]) +backup_job_test = Link(text=_(u'test'), view='backup_job_test', args='object.pk', sprite='cd_go')#, permissions=[PERMISSION_BACKUP_JOB_TEST]) +backup_job_delete = Link(text=_(u'delete'), view='backup_job_delete', args='object.pk', sprite='cd_delete', permissions=[PERMISSION_BACKUP_JOB_DELETE]) + +restore_tool_link = Link(text=_(u'restore'), view='restore_view', icon='cd_eject.png')#, permissions=[]) diff --git a/apps/app_registry/models.py b/apps/app_registry/models.py index d26570d6bc..a5451521db 100644 --- a/apps/app_registry/models.py +++ b/apps/app_registry/models.py @@ -1,57 +1,21 @@ from __future__ import absolute_import +import datetime import logging from django.db import models from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext +from django.contrib.contenttypes.models import ContentType +from django.contrib.contenttypes import generic + +from common.models import TranslatableLabelMixin, LiveObjectMixin + +from .classes import AppBackup, StorageModuleBase logger = logging.getLogger(__name__) -class TranslatableLabelMixin(models.Model): - _labels = {} - - @property - def label(self): - try: - return self.__class__._labels[self.pk] - except KeyError: - return unicode(self.__class__) - - def __setattr__(self, attr, value): - if attr == 'label': - self.__class__._labels[self.pk] = value - else: - return super(TranslatableLabelMixin, self).__setattr__(attr, value) - - def __unicode__(self): - return unicode(self.label) - - class Meta: - abstract = True - - -class LiveObjectsManager(models.Manager): - def get_query_set(self): - return super(LiveObjectsManager, self).get_query_set().filter(pk__in=(entry.pk for entry in self.model._registry)) - - -class LiveObjectMixin(models.Model): - _registry = [] - - def save(self, *args, **kwargs): - super(LiveObjectMixin, self).save(*args, **kwargs) - self.__class__._registry.append(self) - return self - - live = LiveObjectsManager() - objects = models.Manager() - - class Meta: - abstract = True - - class App(TranslatableLabelMixin, LiveObjectMixin, models.Model): name = models.CharField(max_length=64, verbose_name=_(u'name'), unique=True) icon = models.CharField(max_length=64, verbose_name=_(u'icon'), blank=True) @@ -60,3 +24,57 @@ class App(TranslatableLabelMixin, LiveObjectMixin, models.Model): ordering = ('name', ) verbose_name = _(u'app') verbose_name_plural = _(u'apps') + + +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 = + # day - 1 days + # weekly - days of week checkbox + # month - day of month, day of week + # * repetition option field + # * ends + # - never + # - After # ocurrences + # - On date + # * end option field + # * type + # - Full + # - Incremental + storage_module_name = models.CharField(max_length=32, 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) + + def __unicode__(self): + return self.name + + @property + def storage_module(self): + return StorageModuleBase.get(self.storage_module_name) + + def backup(self, dry_run=False): + logger.debug('starting: %s', self) + logger.debug('dry_run: %s' % dry_run) + storage_module = self.storage_module + #TODO: loads + for app in self.apps.all(): + app_backup = AppBackup.get(app) + app_backup.backup(storage_module(backup_path='/tmp'), dry_run=dry_run) + + def save(self, *args, **kwargs): + #dump + super(BackupJob, self).save(*args, **kwargs) + + @models.permalink + def get_absolute_url(self): + return ('checkout_info', [self.document.pk]) + + class Meta: + verbose_name = _(u'document checkout') + verbose_name_plural = _(u'document checkouts') + + +#class BackupJobLog diff --git a/apps/backups/permissions.py b/apps/app_registry/permissions.py similarity index 100% rename from apps/backups/permissions.py rename to apps/app_registry/permissions.py diff --git a/apps/app_registry/urls.py b/apps/app_registry/urls.py index 2adcf71cf8..97ae9caca2 100644 --- a/apps/app_registry/urls.py +++ b/apps/app_registry/urls.py @@ -2,4 +2,9 @@ from django.conf.urls.defaults import patterns, url urlpatterns = patterns('app_registry.views', url(r'^list/$', 'app_list', (), 'app_list'), + url(r'^jobs/list/$', 'backup_job_list', (), 'backup_job_list'), + url(r'^jobs/create/$', 'backup_job_create', (), 'backup_job_create'), + url(r'^jobs/(?P\d+)/edit/$', 'backup_job_edit', (), 'backup_job_edit'), + url(r'^jobs/(?P\d+)/test/$', 'backup_job_test', (), 'backup_job_test'), + #url(r'^jobs/(?P\d+)/delete/$', 'backup_job_delete', (), 'backup_job_delete'), ) diff --git a/apps/app_registry/views.py b/apps/app_registry/views.py index bbbb02c4b0..4bc396d03d 100644 --- a/apps/app_registry/views.py +++ b/apps/app_registry/views.py @@ -1,12 +1,19 @@ from __future__ import absolute_import -from django.http import HttpResponse, HttpResponseRedirect +from django.conf import settings +from django.contrib import messages +from django.core.urlresolvers import reverse +from django.http import HttpResponseRedirect from django.shortcuts import render_to_response, get_object_or_404 from django.template import RequestContext from django.utils.translation import ugettext as _ -from django.core.urlresolvers import reverse -from .models import App +from permissions.models import Permission + +from .classes import AppBackup +from .forms import BackupJobForm +from .models import App, BackupJob +from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT def app_list(request): @@ -21,3 +28,112 @@ def app_list(request): {'name': _(u'icon'), 'attribute': 'icon'}, ], }, context_instance=RequestContext(request)) + + +def backup_job_list(request): + pre_object_list = BackupJob.objects.all() + + try: + Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_VIEW]) + except PermissionDenied: + # If user doesn't have global permission, get a list of backup jobs + # for which he/she does have access use it to filter the + # provided object_list + final_object_list = AccessEntry.objects.filter_objects_by_access(PERMISSION_BACKUP_JOB_VIEW, request.user, pre_object_list) + else: + final_object_list = pre_object_list + + context = { + 'object_list': final_object_list, + 'title': _(u'backup jobs'), + 'hide_link': True, + #'extra_columns': [ + # {'name': _(u'info'), 'attribute': 'info'}, + #], + } + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) + + +def backup_job_create(request): + Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_CREATE]) + + if request.method == 'POST': + form = BackupJobForm(data=request.POST) + if form.is_valid(): + try: + backup_job = form.save() + except Exception, exc: + messages.error(request, _(u'Error creating backup job; %s') % exc) + else: + messages.success(request, _(u'Backup job "%s" created successfully.') % backup_job) + return HttpResponseRedirect(reverse('backup_job_list')) + else: + form = BackupJobForm() + + return render_to_response('generic_form.html', { + 'form': form, + 'title': _(u'Create backup job') + }, context_instance=RequestContext(request)) + + +def backup_job_edit(request, backup_job_pk): + backup_job = get_object_or_404(BackupJob, pk=backup_job_pk) + try: + Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_EDIT]) + except PermissionDenied: + AccessEntry.objects.check_access(PERMISSION_BACKUP_JOB_EDIT, request.user, backup_job) + + if request.method == 'POST': + form = BackupJobForm(data=request.POST, instance=backup_job) + if form.is_valid(): + try: + backup_job = form.save() + except Exception, exc: + messages.error(request, _(u'Error editing backup job; %s') % exc) + else: + messages.success(request, _(u'Backup job "%s" edited successfully.') % backup_job) + return HttpResponseRedirect(reverse('backup_job_list')) + else: + form = BackupJobForm(instance=backup_job) + + return render_to_response('generic_form.html', { + 'form': form, + 'object': backup_job, + 'title': _(u'Edit backup job: %s') % backup_job + }, context_instance=RequestContext(request)) + + +def backup_job_test(request, backup_job_pk): + backup_job = get_object_or_404(BackupJob, pk=backup_job_pk) + #try: + # Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_EDIT]) + #except PermissionDenied: + # AccessEntry.objects.check_access(PERMISSION_BACKUP_JOB_EDIT, request.user, backup_job) + + try: + backup_job.backup(dry_run=True) + except Exception, exc: + if settings.DEBUG: + raise + else: + messages.error(request, _(u'Error testing backup job; %s') % exc) + return HttpResponseRedirect(reverse('backup_job_list')) + else: + messages.success(request, _(u'Test for backup job "%s" finished successfully.') % backup_job) + return HttpResponseRedirect(reverse('backup_job_list')) + + +def backup_view(request): + #Permission.objects.check_permissions(request.user, []) + + context = { + 'object_list': AppBackup.get_all(), + 'title': _(u'registered apps for backup'), + 'hide_link': True, + 'extra_columns': [ + {'name': _(u'info'), 'attribute': 'info'}, + ], + } + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) diff --git a/apps/backups/__init__.py b/apps/backups/__init__.py deleted file mode 100644 index 1eb74df044..0000000000 --- a/apps/backups/__init__.py +++ /dev/null @@ -1,53 +0,0 @@ -from __future__ import absolute_import - -from django.db import transaction, DatabaseError -from django.utils.translation import ugettext_lazy as _ - -from app_registry import register_app, UnableToRegister -from common.utils import encapsulate -from job_processor.exceptions import JobQueuePushError -from job_processor.models import JobQueue, JobType -from icons.literals import BACKUPS -from navigation.api import bind_links, register_model_list_columns -from project_setup.api import register_setup -from project_tools.api import register_tool - -from .api import AppBackup, ModelBackup -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 - -# TODO: move to literals -BACKUP_JOB_QUEUE_NAME = 'backups_queue' - - -@transaction.commit_on_success -def create_backups_job_queue(): - global backups_job_queue - try: - backups_job_queue, created = JobQueue.objects.get_or_create(name=BACKUP_JOB_QUEUE_NAME, defaults={'label': _('Backups'), 'unique_jobs': True}) - except DatabaseError: - transaction.rollback() - - -create_backups_job_queue() -#backup_job_type = JobType('remote_backup', _(u'Remove backup'), do_backup) - -register_setup(backup_tool_link) -register_tool(restore_tool_link) -bind_links([BackupJob, 'backup_job_list', 'backup_job_create'], [backup_job_list], menu_name='secondary_menu') -bind_links([BackupJob, 'backup_job_list', 'backup_job_create'], [backup_job_create], menu_name='sidebar') -bind_links([BackupJob], [backup_job_edit, backup_job_test]) - -register_model_list_columns(BackupJob, [ - {'name':_(u'begin date time'), 'attribute': 'begin_datetime'}, - {'name':_(u'storage module'), 'attribute': 'storage_module.label'}, - {'name':_(u'apps'), 'attribute': encapsulate(lambda x: u', '.join([unicode(app) for app in x.apps.all()]))}, -]) - -try: - app = register_app('backups', _(u'Backups'), icon=BACKUPS) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) -# 'attribute': encapsulate(lambda x: x.user.get_full_name() if x.user.get_full_name() else x.user) diff --git a/apps/backups/links.py b/apps/backups/links.py deleted file mode 100644 index 87c1cc8614..0000000000 --- a/apps/backups/links.py +++ /dev/null @@ -1,16 +0,0 @@ -from __future__ import absolute_import - -from django.utils.translation import ugettext_lazy as _ - -from navigation.api import Link - -from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT, PERMISSION_BACKUP_JOB_DELETE - -backup_tool_link = Link(text=_(u'backups'), view='backup_job_list', icon='cd_burn.png', permissions=[PERMISSION_BACKUP_JOB_VIEW]) -backup_job_list = Link(text=_(u'backup job list'), view='backup_job_list', sprite='cd_burn', permissions=[PERMISSION_BACKUP_JOB_VIEW]) -backup_job_create = Link(text=_(u'create'), view='backup_job_create', sprite='cd_add', permissions=[PERMISSION_BACKUP_JOB_CREATE]) -backup_job_edit = Link(text=_(u'edit'), view='backup_job_edit', args='object.pk', sprite='cd_edit', permissions=[PERMISSION_BACKUP_JOB_EDIT]) -backup_job_test = Link(text=_(u'test'), view='backup_job_test', args='object.pk', sprite='cd_go')#, permissions=[PERMISSION_BACKUP_JOB_TEST]) -backup_job_delete = Link(text=_(u'delete'), view='backup_job_delete', args='object.pk', sprite='cd_delete', permissions=[PERMISSION_BACKUP_JOB_DELETE]) - -restore_tool_link = Link(text=_(u'restore'), view='restore_view', icon='cd_eject.png')#, permissions=[]) diff --git a/apps/backups/migrations/0001_initial.py b/apps/backups/migrations/0001_initial.py deleted file mode 100644 index e9bc72946a..0000000000 --- a/apps/backups/migrations/0001_initial.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- 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 'BackupJob' - db.create_table('backups_backupjob', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('label', self.gf('django.db.models.fields.CharField')(max_length=64)), - ('begin_datetime', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2012, 8, 11, 0, 0))), - ('storage_module', self.gf('django.db.models.fields.CharField')(max_length=16)), - ('storage_arguments_json', self.gf('django.db.models.fields.TextField')(blank=True)), - )) - db.send_create_signal('backups', ['BackupJob']) - - # Adding model 'BackupJobApp' - db.create_table('backups_backupjobapp', ( - ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), - ('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)), - )) - db.send_create_signal('backups', ['BackupJobApp']) - - - def backwards(self, orm): - # Deleting model 'BackupJob' - db.delete_table('backups_backupjob') - - # Deleting model 'BackupJobApp' - db.delete_table('backups_backupjobapp') - - - models = { - 'backups.backupjob': { - 'Meta': {'object_name': 'BackupJob'}, - 'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 11, 0, 0)'}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), - 'label': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'storage_arguments_json': ('django.db.models.fields.TextField', [], {'blank': 'True'}), - 'storage_module': ('django.db.models.fields.CharField', [], {'max_length': '16'}) - }, - 'backups.backupjobapp': { - 'Meta': {'object_name': 'BackupJobApp'}, - 'app_backup': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'backup_job': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backups.BackupJob']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } - - complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/migrations/0002_auto__del_field_backupjob_label__add_field_backupjob_name.py b/apps/backups/migrations/0002_auto__del_field_backupjob_label__add_field_backupjob_name.py deleted file mode 100644 index cb2f24e520..0000000000 --- a/apps/backups/migrations/0002_auto__del_field_backupjob_label__add_field_backupjob_name.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- 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 field 'BackupJob.label' - db.delete_column('backups_backupjob', 'label') - - # Adding field 'BackupJob.name' - db.add_column('backups_backupjob', 'name', - self.gf('django.db.models.fields.CharField')(default=' ', max_length=64), - keep_default=False) - - - def backwards(self, orm): - - # User chose to not deal with backwards NULL issues for 'BackupJob.label' - raise RuntimeError("Cannot reverse this migration. 'BackupJob.label' and its values cannot be restored.") - # Deleting field 'BackupJob.name' - db.delete_column('backups_backupjob', 'name') - - - models = { - 'backups.backupjob': { - 'Meta': {'object_name': 'BackupJob'}, - 'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 11, 0, 0)'}), - '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': ('django.db.models.fields.CharField', [], {'max_length': '16'}) - }, - 'backups.backupjobapp': { - 'Meta': {'object_name': 'BackupJobApp'}, - 'app_backup': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'backup_job': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backups.BackupJob']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } - - complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/migrations/0003_auto__del_field_backupjob_storage_module__add_field_backupjob_storage_.py b/apps/backups/migrations/0003_auto__del_field_backupjob_storage_module__add_field_backupjob_storage_.py deleted file mode 100644 index 1d0479cf68..0000000000 --- a/apps/backups/migrations/0003_auto__del_field_backupjob_storage_module__add_field_backupjob_storage_.py +++ /dev/null @@ -1,45 +0,0 @@ -# -*- 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 field 'BackupJob.storage_module' - db.delete_column('backups_backupjob', 'storage_module') - - # Adding field 'BackupJob.storage_module_name' - db.add_column('backups_backupjob', 'storage_module_name', - self.gf('django.db.models.fields.CharField')(default=' ', max_length=16), - keep_default=False) - - - def backwards(self, orm): - - # User chose to not deal with backwards NULL issues for 'BackupJob.storage_module' - raise RuntimeError("Cannot reverse this migration. 'BackupJob.storage_module' and its values cannot be restored.") - # Deleting field 'BackupJob.storage_module_name' - db.delete_column('backups_backupjob', 'storage_module_name') - - - models = { - 'backups.backupjob': { - 'Meta': {'object_name': 'BackupJob'}, - 'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 11, 0, 0)'}), - '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'}) - }, - 'backups.backupjobapp': { - 'Meta': {'object_name': 'BackupJobApp'}, - 'app_backup': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'backup_job': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backups.BackupJob']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } - - complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/migrations/0004_auto__add_field_backupjob_enabled.py b/apps/backups/migrations/0004_auto__add_field_backupjob_enabled.py deleted file mode 100644 index 8cbf704a3f..0000000000 --- a/apps/backups/migrations/0004_auto__add_field_backupjob_enabled.py +++ /dev/null @@ -1,40 +0,0 @@ -# -*- 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 field 'BackupJob.enabled' - db.add_column('backups_backupjob', 'enabled', - self.gf('django.db.models.fields.BooleanField')(default=True), - keep_default=False) - - - def backwards(self, orm): - # Deleting field 'BackupJob.enabled' - db.delete_column('backups_backupjob', 'enabled') - - - models = { - 'backups.backupjob': { - 'Meta': {'object_name': 'BackupJob'}, - 'begin_datetime': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2012, 8, 11, 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'}) - }, - 'backups.backupjobapp': { - 'Meta': {'object_name': 'BackupJobApp'}, - 'app_backup': ('django.db.models.fields.CharField', [], {'max_length': '64'}), - 'backup_job': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['backups.BackupJob']"}), - 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) - } - } - - complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/migrations/0005_auto__del_backupjobapp.py b/apps/backups/migrations/0005_auto__del_backupjobapp.py deleted file mode 100644 index e0c98b05b4..0000000000 --- a/apps/backups/migrations/0005_auto__del_backupjobapp.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- 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 deleted file mode 100644 index 4cbb57f304..0000000000 --- a/apps/backups/migrations/0006_auto.py +++ /dev/null @@ -1,55 +0,0 @@ -# -*- 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/migrations/0007_auto__chg_field_backupjob_storage_module_name.py b/apps/backups/migrations/0007_auto__chg_field_backupjob_storage_module_name.py deleted file mode 100644 index f7b3e39796..0000000000 --- a/apps/backups/migrations/0007_auto__chg_field_backupjob_storage_module_name.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- 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 'BackupJob.storage_module_name' - db.alter_column('backups_backupjob', 'storage_module_name', self.gf('django.db.models.fields.CharField')(max_length=32)) - - def backwards(self, orm): - - # Changing field 'BackupJob.storage_module_name' - db.alter_column('backups_backupjob', 'storage_module_name', self.gf('django.db.models.fields.CharField')(max_length=16)) - - 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, 17, 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': '32'}) - } - } - - complete_apps = ['backups'] \ No newline at end of file diff --git a/apps/backups/migrations/__init__.py b/apps/backups/migrations/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/apps/backups/models.py b/apps/backups/models.py deleted file mode 100644 index 618e34989f..0000000000 --- a/apps/backups/models.py +++ /dev/null @@ -1,69 +0,0 @@ -from __future__ import absolute_import - -import logging -import datetime - -from django.db import models -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__) - - -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 = - # day - 1 days - # weekly - days of week checkbox - # month - day of month, day of week - # * repetition option field - # * ends - # - never - # - After # ocurrences - # - On date - # * end option field - # * type - # - Full - # - Incremental - storage_module_name = models.CharField(max_length=32, 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) - - def __unicode__(self): - return self.name - - @property - def storage_module(self): - return StorageModuleBase.get(self.storage_module_name) - - def backup(self, dry_run=False): - logger.debug('starting: %s', self) - logger.debug('dry_run: %s' % dry_run) - storage_module = self.storage_module - #TODO: loads - for app in self.apps.all(): - app_backup = AppBackup.get(app) - app_backup.backup(storage_module(backup_path='/tmp'), dry_run=dry_run) - - def save(self, *args, **kwargs): - #dump - super(BackupJob, self).save(*args, **kwargs) - - @models.permalink - def get_absolute_url(self): - return ('checkout_info', [self.document.pk]) - - class Meta: - verbose_name = _(u'document checkout') - verbose_name_plural = _(u'document checkouts') - - -#class BackupJobLog diff --git a/apps/backups/static/images/icons/cd_burn.png b/apps/backups/static/images/icons/cd_burn.png deleted file mode 100644 index d00b382878b5a18089d5b02654317318818a6b4d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2348 zcmV+{3Dfq8P)bzQSJmvfP<+@e-N3Ej0^rQQ3`%}}?k3RTgo_n6zb9}Sp4ZIK! zd%a8M#i>0Jq}GsRZ*1P2DOPD{yh#0nSxQgndeta>_wkLZUcn>l{{pb-;h#lsU31Ss zTRhaZa&d~<<6aso6Xi@Itx8nIu{B6UCGvWR0t!(JBp?!{Cv|$ef0TwYg^~B)KCtAq z=by-b5&*(aUjEA}e?95?K_MP0*r7n73`H_V33C}D;=avK1m{d$ z9}MQ`@CQSb9lo$&+xPChc)hU91Ry;8i&qzPbT2!%;r1?)Rhjy7@FBLTu2Ne$c1a!w zKm&vbnGn&@PTH-8!4lPW3#p|Ti8x%&B^3OeE%oj9!Dv=UvV?2hF}+qH8M=g z@c^tZ0szlt#Lx$%rMyPHIDa%dxgA@62hkcH5FX$0`aRK*-x~;fNf54CJ>_cGat=pK zbwb0+uUsuTiNtdtDj?>$ylIPBsgobB358_}VuK3Qsi==y!hSF7YZL%`KnX>Yn>*T* zq@k{TA7VLM%ps}3)%%VOQs3nqd4SeJ+!|Dvj+x{Y(!zd&-NDIpBgF9 z>CrRvojbdzt1}2Uo8$)o6{W(;9S|P!;GFhEh(uZGWxWi5Lm+!ZsVyE=rjn}J{eJOU zc^x=$1ps9nsFH&6(hB)AJo+#fQMPZLN>ei7rAR~p0MP~!2sl8v`k7DKVhYZX+E{NR z1R|FYTkNS{W41=ZHD9MkHS#O6&3fA(*?8Z-``=4d1xgnT94L_lI@AieeklJZ6CK7; zy)W+S(^_+#Vink0LT!!*Oh3rJP5ltte={=%~WGge3 zx{}RR*rT*CiEbl^aH~XL+Vbe>UmY2Gmq(u0vA(D+=j%y?FGYd*o+mIK&8xPnT$>&D6iEWVUi?~>WH@hYh|x*C67Fp;eorl zTWsUFU9+WS1DvrGVD@jKa;8K&j2O*VsA}lxW&ky#R5*EVI7bz;?kZ*~t-4fdQU$2T z#!V!qK=gF3?&mv`NdT~H8ZCfYb)#x0T_7lu0wNjD88i!JwzkVpYxygv zWKlBUL=nVCV~BB;<1RU|*H0Y6`>3cnDCL)bPgms^X%JsEXU?43%Uc>AFkX4?i8nKo z1@k<-FgfASsg6+i{7j`11@V;;0-gHM@<8uo)|?nez;wV$S#-N`-68kl-w)B`Isw)X zQuXLw3N6GUK4_vHMXK-kDXn{^lU5&otVm9Z*on`1DbDNcHpOuAj;ItS0j~C;BQc3E z2p?F98%l%SI3zk;UFH#DSk7q%z*vuT)2tqg@}nV2XuB!g$q(Ral-bDPF`Bn5O{rSw zt2+mbr`Zc0w*-p2wr$;=naF0x^s5w!s&*6MX2Kx2nJ}}-V5tfx7%R4%jMm+Ijmzzw z{nWOsLdhPS_{W_zdj*bWTOn#3%$iSAe2GP^%MJSTy687K0u8PMMjC&9>$ko(kRB#W ztb)xH3Wdurilm(M>R4O0nU(l+bi$Ejw{Cx@MG^)@ zWN{NYJ#LB!s-?n&3E~`}_?!((=ckDKgCIIo%8bTb&hh3tH=Bj)8!k@n+(<2p@Gjo* zszBjwu$!YHpn^}B2Vk~7=AFBvPk*-Q8`chE=Fq;E-b!D-xY015+VjPg-E>Q5tIcQ( zf)kG2ZMj6lKsft3ojDvH+0E^+J9?Wq4rhq`GHWcc@9p0OS(@=x%%K?l*YS6bUwL%X z`r6aGcAvVGimkb&lV-;PbhY9rtTx!LiSZbiSaW+^$gOhkjPLKd>kYgk)SOlEI{yXy zNGlf$He5#f9OlSgNrZ=n3f4Y#`UVJ#wWX34(9_hLWiw2_0^?$Bzs} z-FtlAQw#z&HwQ&J-|rvXbxwQnqkhd4*O>{HuWb3jnngX!*M}nUMT)8>r~OPIK{d;h zp@AbOzyAKVJ5zU96cPdL3?AO>THgl;pd_zWeRT1tKeysw_6t}&|FQpuE`IJZ5f_l( zb#(LBg5^e?z31D%Cj3}uL|zwAsxrEi+g%Y`O&mOyG4}oNz2fUwy3Ca)-00u2>k-ve z{$ZiBT!3*Gu-x?bWw}A&!pyqGS-DXFpX6e2J~stD(|^|NbkW?3v&-PW0t^77DxQ$v S3i_r10000cxP zrAnV{ZY7HV^l5*Lvs5_wdjGKfba3J)adKx-Fu^h7(qII!>5cVAo^`F{Wi zzj^a-GuRAk#t*q8J!(~(l`v_qlz6W3@R|BV3aXeAQIj~ZXyJy@EpC+Pahxc zpuQ{ZW1jo@qvvmwmf-+|HP62@roL%%+e3FWlHyY6ct2u@Z7$oWX&k#`(E{LrkRT&H zMVhb&fujCsmUbOHOMP7(w?F&id7lplAr()SuKIPLsrjyshwdCtX<4C@5zC+suQbUL z7lV*2K&m}w@haBHPbQP6#9)pFVO&vU8WSp|w%+7Quh;+bsg^^D>x!)CT}94Yr#FqH zoTAXhD3rpm8=_0sgW$R5tlMiIg&V=3WHLwbI0OKqaTMmo0m>(dW;NE(9SfGUvYi_N z5ZC`{|B9-huj-cC0CmJIkKEGrMs&I8y$F;Cqk*b44MP$M7>{Kra*ZWRm*CCV>L67G zyjAO8-M^yPai?Tl{=kThlgHLjIAK+?li&Z!w`dvV@T+zO<&f-HEJvwy-iiRcj{yMB z735F{(s(36&CuV~H?R>~-hw2Y2nbJa+Vfzk&#ig<8VSOX*M(5qo^v_^E-N)`{OZ5s zRw3~mh@!}Oe6I%AL zZluNrFT$KAHvqWMDs0>WA(99^HRV2%6t$V{G5}72B1&>7SgIC^syO^^X{f#SwOj>2 z1qxlHqP-H)$Qd4W%q6t#Ur&XpqFker5)}X>6NJZO0padvJ_!X>=#WEf*GYlI?ZY06 z#t^eP1y}r>?n;nbRZP~~_~hb6U$*`$Tt8u28;_Sghte*_?q&6(}4{L7_}C=r9rOZ-wz=OmrB#l7rD!-B&h2 z23hyS(>SbLlq=Ga&s#Lk$5MV6_nLUPkW?FzV>}N}xSwOF?C3z6%5mC=2(u*18IjF$Kj$fxvV?ov>r-fK zg_}A+E*#bemjCkf{2#13A}h)a)|Ug|aUs2+jh%UA%QiFb%YXJbrNI^GOcDV^5QYKB zrIX=!B3ZcVNBJ-O>0^W=f+CR&WmCy;aSC#&c=SZum43>k4H_J@=roE8hDD`m$^dnDZyH7f zS~@jA4dpte3<(}dl+H^u8uR5dgXU?Og2Js^chKR_KA}yUH`7b6Y^JO2XXwvcc2FL5 z7VeKxaxiv+?6TlUDRqq#RaaT{{o|`fz~ih*qt^zqpwujKE|CXJrlGAkH9oY~*h-bA z*J@OUmYO|Ar!hf=1h~SyxD&=t9&4es>(%56gsteO=sQ4`K=`gD4Lqx))ViJo@Dx6;qYsOCI8}RZB zjIVlf4Yjqko2MhEgBi22v4OU{{1Pc;HO31Y);41KG6Rt8JDXJ3(3F<^6|+laKfDo0 z$BD!wqQheyAoxIW*o{+?L{TAINQHI4zPV*PbzeG9%T}zQ_V)8;T{s27@4dZ!bPpnN z@ocLwx^C2{qsNZzX4}q%#Q5UiN0)D3uyBdT?Q&OFloq^aqs(d?1sQ$C#<``^eB&`J z4exHeWuubGFQbVPBtlEfTp#lO|0DrDw;Fs;!;U($ccW;X1CJ-WQ+x z(f3Y^VvVdpUN!+o60*^;+<{GSItq-oP

|?Oj|f71TCzEc2D-0YZ2x%AYd?|2l{=T--Anp0?&OTrCq z$qZsdc~#B0)xUf7z53d!z?>-!R2}fpxflvBYa7a0BdCB*e7Kjwr(3LW7!K137==Ov z%(k(QB#uBPli9!inYG`MhXLT7@R7QDyRPJ(Suy|qCBInr-SeGuR#yl8YOrP`l?DQ& z;jqcr*KPwE+KwEcMT?i1krH7{l&p|T5S}C7SY!6&5jBNo-?n}Geau1f4gQ!Ic2RaS znD;hqc#UYoUmjV$dd|4prp@z}1jnf^SA`iacql0vC_6KLQK@XP#_~G`HBm P00000NkvXXu0mjfPdj@e diff --git a/apps/backups/urls.py b/apps/backups/urls.py deleted file mode 100644 index c6f5f47084..0000000000 --- a/apps/backups/urls.py +++ /dev/null @@ -1,9 +0,0 @@ -from django.conf.urls.defaults import patterns, url - -urlpatterns = patterns('backups.views', - url(r'^jobs/list/$', 'backup_job_list', (), 'backup_job_list'), - url(r'^jobs/create/$', 'backup_job_create', (), 'backup_job_create'), - url(r'^jobs/(?P\d+)/edit/$', 'backup_job_edit', (), 'backup_job_edit'), - url(r'^jobs/(?P\d+)/test/$', 'backup_job_test', (), 'backup_job_test'), - #url(r'^jobs/(?P\d+)/delete/$', 'backup_job_delete', (), 'backup_job_delete'), -) diff --git a/apps/backups/views.py b/apps/backups/views.py deleted file mode 100644 index 53dba58329..0000000000 --- a/apps/backups/views.py +++ /dev/null @@ -1,125 +0,0 @@ -from __future__ import absolute_import - -from django.utils.translation import ugettext_lazy as _ -from django.http import HttpResponseRedirect -from django.shortcuts import render_to_response, get_object_or_404 -from django.template import RequestContext -from django.contrib import messages -from django.core.urlresolvers import reverse -from django.conf import settings - -from permissions.models import Permission - -from .api import AppBackup -from .forms import BackupJobForm -from .models import BackupJob -from .permissions import PERMISSION_BACKUP_JOB_VIEW, PERMISSION_BACKUP_JOB_CREATE, PERMISSION_BACKUP_JOB_EDIT - - -def backup_job_list(request): - pre_object_list = BackupJob.objects.all() - - try: - Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_VIEW]) - except PermissionDenied: - # If user doesn't have global permission, get a list of backup jobs - # for which he/she does have access use it to filter the - # provided object_list - final_object_list = AccessEntry.objects.filter_objects_by_access(PERMISSION_BACKUP_JOB_VIEW, request.user, pre_object_list) - else: - final_object_list = pre_object_list - - context = { - 'object_list': final_object_list, - 'title': _(u'backup jobs'), - 'hide_link': True, - #'extra_columns': [ - # {'name': _(u'info'), 'attribute': 'info'}, - #], - } - return render_to_response('generic_list.html', context, - context_instance=RequestContext(request)) - - -def backup_job_create(request): - Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_CREATE]) - - if request.method == 'POST': - form = BackupJobForm(data=request.POST) - if form.is_valid(): - try: - backup_job = form.save() - except Exception, exc: - messages.error(request, _(u'Error creating backup job; %s') % exc) - else: - messages.success(request, _(u'Backup job "%s" created successfully.') % backup_job) - return HttpResponseRedirect(reverse('backup_job_list')) - else: - form = BackupJobForm() - - return render_to_response('generic_form.html', { - 'form': form, - 'title': _(u'Create backup job') - }, context_instance=RequestContext(request)) - - -def backup_job_edit(request, backup_job_pk): - backup_job = get_object_or_404(BackupJob, pk=backup_job_pk) - try: - Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_EDIT]) - except PermissionDenied: - AccessEntry.objects.check_access(PERMISSION_BACKUP_JOB_EDIT, request.user, backup_job) - - if request.method == 'POST': - form = BackupJobForm(data=request.POST, instance=backup_job) - if form.is_valid(): - try: - backup_job = form.save() - except Exception, exc: - messages.error(request, _(u'Error editing backup job; %s') % exc) - else: - messages.success(request, _(u'Backup job "%s" edited successfully.') % backup_job) - return HttpResponseRedirect(reverse('backup_job_list')) - else: - form = BackupJobForm(instance=backup_job) - - return render_to_response('generic_form.html', { - 'form': form, - 'object': backup_job, - 'title': _(u'Edit backup job: %s') % backup_job - }, context_instance=RequestContext(request)) - - -def backup_job_test(request, backup_job_pk): - backup_job = get_object_or_404(BackupJob, pk=backup_job_pk) - #try: - # Permission.objects.check_permissions(request.user, [PERMISSION_BACKUP_JOB_EDIT]) - #except PermissionDenied: - # AccessEntry.objects.check_access(PERMISSION_BACKUP_JOB_EDIT, request.user, backup_job) - - try: - backup_job.backup(dry_run=True) - except Exception, exc: - if settings.DEBUG: - raise - else: - messages.error(request, _(u'Error testing backup job; %s') % exc) - return HttpResponseRedirect(reverse('backup_job_list')) - else: - messages.success(request, _(u'Test for backup job "%s" finished successfully.') % backup_job) - return HttpResponseRedirect(reverse('backup_job_list')) - - -def backup_view(request): - #Permission.objects.check_permissions(request.user, []) - - context = { - 'object_list': AppBackup.get_all(), - 'title': _(u'registered apps for backup'), - 'hide_link': True, - 'extra_columns': [ - {'name': _(u'info'), 'attribute': 'info'}, - ], - } - return render_to_response('generic_list.html', context, - context_instance=RequestContext(request)) diff --git a/apps/checkouts/__init__.py b/apps/checkouts/__init__.py index cf9952a37c..bab2fbcbac 100644 --- a/apps/checkouts/__init__.py +++ b/apps/checkouts/__init__.py @@ -3,8 +3,8 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions -from app_registry import register_app, UnableToRegister -from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup from documents.models import Document from navigation.api import bind_links, register_top_menu from scheduler.api import LocalScheduler @@ -42,9 +42,9 @@ checkouts_scheduler.start() initialize_document_checkout_extra_methods() -try: - app = register_app('checkouts', _(u'Checkouts')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('checkouts', _(u'Checkouts')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/common/models.py b/apps/common/models.py index f028f3bc76..16c798d82b 100644 --- a/apps/common/models.py +++ b/apps/common/models.py @@ -60,3 +60,46 @@ class AutoAdminSingleton(Singleton): class Meta: verbose_name = verbose_name_plural = _(u'auto admin properties') + + +class TranslatableLabelMixin(models.Model): + _labels = {} + + @property + def label(self): + try: + return self.__class__._labels[self.pk] + except KeyError: + return unicode(self.__class__) + + def __setattr__(self, attr, value): + if attr == 'label': + self.__class__._labels[self.pk] = value + else: + return super(TranslatableLabelMixin, self).__setattr__(attr, value) + + def __unicode__(self): + return unicode(self.label) + + class Meta: + abstract = True + + +class LiveObjectsManager(models.Manager): + def get_query_set(self): + return super(LiveObjectsManager, self).get_query_set().filter(pk__in=(entry.pk for entry in self.model._registry)) + + +class LiveObjectMixin(models.Model): + _registry = [] + + def save(self, *args, **kwargs): + super(LiveObjectMixin, self).save(*args, **kwargs) + self.__class__._registry.append(self) + return self + + live = LiveObjectsManager() + objects = models.Manager() + + class Meta: + abstract = True diff --git a/apps/document_indexing/__init__.py b/apps/document_indexing/__init__.py index 42487ef565..aadec89bf2 100644 --- a/apps/document_indexing/__init__.py +++ b/apps/document_indexing/__init__.py @@ -6,8 +6,8 @@ from django.db.models.signals import post_save, pre_delete, post_delete from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from documents.models import Document from maintenance.api import MaintenanceNamespace from metadata.models import DocumentMetadata @@ -72,9 +72,9 @@ def document_metadata_index_post_delete(sender, **kwargs): # TODO: save result in index log update_indexes(kwargs['instance'].document) -try: - app = register_app('document_indexing', _(u'Document indexing')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('document_indexing', _(u'Document indexing')) +#except UnableToRegister: +# pass +#aelse: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/documents/__init__.py b/apps/documents/__init__.py index 91a8b47075..413fcaede9 100644 --- a/apps/documents/__init__.py +++ b/apps/documents/__init__.py @@ -5,8 +5,8 @@ import tempfile from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions -from backups.api import AppBackup, ModelBackup, FileBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup, FileBackup +#from app_registry import register_app, UnableToRegister from common.utils import validate_path, encapsulate from diagnostics.api import DiagnosticNamespace from history.permissions import PERMISSION_HISTORY_VIEW @@ -139,9 +139,9 @@ class_permissions(Document, [ register_statistics(get_statistics) -try: - app = register_app('documents', _(u'Documents')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup(), FileBackup(document_settings.STORAGE_BACKEND)]) +#try: +# app = register_app('documents', _(u'Documents')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup(), FileBackup(document_settings.STORAGE_BACKEND)]) diff --git a/apps/folders/__init__.py b/apps/folders/__init__.py index 23d0db9d55..7fad3039cc 100644 --- a/apps/folders/__init__.py +++ b/apps/folders/__init__.py @@ -4,8 +4,8 @@ from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL -from app_registry import register_app, UnableToRegister -from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup from documents.models import Document from navigation.api import (bind_links, register_top_menu, register_multi_item_links, register_sidebar_template, Link) @@ -39,9 +39,9 @@ class_permissions(Document, [ PERMISSION_FOLDER_REMOVE_DOCUMENT, ]) -try: - app = register_app('folders', _(u'Folders')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('folders', _(u'Folders')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/history/__init__.py b/apps/history/__init__.py index 85b9942475..7348977036 100644 --- a/apps/history/__init__.py +++ b/apps/history/__init__.py @@ -2,7 +2,7 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup +#from backups.api import AppBackup, ModelBackup from app_registry import register_app, UnableToRegister from common.utils import encapsulate from navigation.api import bind_links, register_model_list_columns @@ -35,5 +35,5 @@ try: app = register_app('history', _(u'History')) except UnableToRegister: pass -else: - AppBackup(app, [ModelBackup()]) +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/installation/__init__.py b/apps/installation/__init__.py index eb6ba41001..3dbd2e7bf8 100644 --- a/apps/installation/__init__.py +++ b/apps/installation/__init__.py @@ -7,8 +7,8 @@ from django.db.utils import DatabaseError from django.db import transaction from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from project_tools.api import register_tool from .links import installation_details @@ -39,9 +39,9 @@ register_tool(installation_details) check_first_run() -try: - app = register_app('installation', _(u'Installation')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('installation', _(u'Installation')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/job_processor/__init__.py b/apps/job_processor/__init__.py index 803cc8ec9e..b249827696 100644 --- a/apps/job_processor/__init__.py +++ b/apps/job_processor/__init__.py @@ -9,8 +9,8 @@ from django.db import transaction, DatabaseError from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from scheduler.api import LocalScheduler from navigation.api import bind_links, register_model_list_columns from project_tools.api import register_tool @@ -91,9 +91,9 @@ def kill_all_node_processes(): atexit.register(kill_all_node_processes) -try: - app = register_app('job_processor', _(u'Job processor')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('job_processor', _(u'Job processor')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/linking/__init__.py b/apps/linking/__init__.py index c4c4b54ab3..d8a6649146 100644 --- a/apps/linking/__init__.py +++ b/apps/linking/__init__.py @@ -4,8 +4,8 @@ from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions from acls.permissions import ACLS_EDIT_ACL, ACLS_VIEW_ACL -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from documents.models import Document from navigation.api import bind_links, register_sidebar_template from project_setup.api import register_setup @@ -36,9 +36,9 @@ class_permissions(SmartLink, [ ACLS_VIEW_ACL ]) -try: - app = register_app('linking', _(u'Document linking')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('linking', _(u'Document linking')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/metadata/__init__.py b/apps/metadata/__init__.py index b72aa851a3..3620f2429f 100644 --- a/apps/metadata/__init__.py +++ b/apps/metadata/__init__.py @@ -3,8 +3,8 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from common.utils import encapsulate from documents.models import Document, DocumentType from navigation.api import (bind_links, register_sidebar_template, @@ -59,9 +59,9 @@ register_model_list_columns(Document, [ ]) -try: - app = register_app('metadata', _(u'Metadata')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('metadata', _(u'Metadata')) +#except UnableToRegister: +# pass +#else: +#a AppBackup(app, [ModelBackup()]) diff --git a/apps/permissions/__init__.py b/apps/permissions/__init__.py index 9f0cf83eed..1791e98567 100644 --- a/apps/permissions/__init__.py +++ b/apps/permissions/__init__.py @@ -5,8 +5,8 @@ from django.db.models.signals import post_save from django.core.exceptions import ObjectDoesNotExist from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from navigation.api import bind_links, register_multi_item_links from project_setup.api import register_setup @@ -41,9 +41,9 @@ post_save.connect(user_post_save, sender=User) register_setup(role_list) -try: - app = register_app('permissions', _(u'Permissions')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('permissions', _(u'Permissions')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/sources/__init__.py b/apps/sources/__init__.py index 03f8fb5a3e..3cf8e6122b 100644 --- a/apps/sources/__init__.py +++ b/apps/sources/__init__.py @@ -2,8 +2,8 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from common.utils import encapsulate from documents.models import Document from navigation.api import (bind_links, register_model_list_columns, @@ -68,9 +68,9 @@ sources_scheduler.start() bind_links(['document_list_recent', 'document_list', 'document_create', 'document_create_multiple', 'upload_interactive', 'staging_file_delete'], [document_create_multiple], menu_name='secondary_menu') bind_links([Document], [document_create_multiple], menu_name='secondary_menu') -try: - app = register_app('sources', _(u'Sources')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('sources', _(u'Sources')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/tags/__init__.py b/apps/tags/__init__.py index 2d26ccfe0b..5a4f3a360d 100644 --- a/apps/tags/__init__.py +++ b/apps/tags/__init__.py @@ -3,8 +3,8 @@ from __future__ import absolute_import from django.utils.translation import ugettext_lazy as _ from acls.api import class_permissions -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#afrom backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from common.utils import encapsulate from documents.models import Document from navigation.api import (bind_links, register_top_menu, @@ -60,9 +60,9 @@ class_permissions(Tag, [ Document.add_to_class('tags', TaggableManager()) -try: - app = register_app('tags', _(u'Tags')) -except UnableToRegister: - pass -else: - AppBackup(app, [ModelBackup()]) +#try: +# app = register_app('tags', _(u'Tags')) +#except UnableToRegister: +# pass +#else: +# AppBackup(app, [ModelBackup()]) diff --git a/apps/user_management/__init__.py b/apps/user_management/__init__.py index b6c7a92789..dcd34605a8 100644 --- a/apps/user_management/__init__.py +++ b/apps/user_management/__init__.py @@ -3,8 +3,8 @@ from __future__ import absolute_import from django.contrib.auth.models import User, Group from django.utils.translation import ugettext_lazy as _ -from backups.api import AppBackup, ModelBackup -from app_registry import register_app, UnableToRegister +#from backups.api import AppBackup, ModelBackup +#from app_registry import register_app, UnableToRegister from navigation.api import bind_links, register_multi_item_links from project_setup.api import register_setup @@ -31,9 +31,9 @@ user_management_views = [ register_setup(user_setup) register_setup(group_setup) -try: - app = register_app('user_management', _(u'User management')) -except UnableToRegister: - pass +#try: +# app = register_app('user_management', _(u'User management')) +#except UnableToRegister: +# pass #else: # AppBackup(app, [ModelBackup()]) diff --git a/settings.py b/settings.py index 63b73e4985..f34dce1e11 100644 --- a/settings.py +++ b/settings.py @@ -166,7 +166,6 @@ INSTALLED_APPS = ( 'clustering', 'scheduler', 'job_processor', - 'backups', 'app_registry', 'icons', # Mayan EDMS diff --git a/urls.py b/urls.py index 525da391a5..996798c638 100644 --- a/urls.py +++ b/urls.py @@ -43,8 +43,7 @@ urlpatterns = patterns('', (r'^statistics/', include('statistics.urls')), (r'^clustering/', include('clustering.urls')), (r'^trash/', include('trash.urls')), - (r'^backups/', include('backups.urls')), - (r'^apps/', include('app_registry.urls')), + (r'^apps/', include('app_registry.urls')),#, namespace='user_blogs')), )