diff --git a/apps/app_registry/__init__.py b/apps/app_registry/__init__.py index 19cdead95a..07d832c59c 100644 --- a/apps/app_registry/__init__.py +++ b/apps/app_registry/__init__.py @@ -8,62 +8,17 @@ from django.db import transaction, DatabaseError from django.utils.translation import ugettext_lazy as _ from django.utils.importlib import import_module -#from common.utils import encapsulate -#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 .classes import AppBackup, ModelBackup +#from navigation.api import bind_links, register_model_list_columns #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 .literals import BACKUP_JOB_QUEUE_NAME -from .models import App -#from . import models - -#class UnableToRegister(Exception): -# pass - -#apipkg.initpkg(__name__, { -# #'App': _App, -## 'App': 'app_registry.models:App', -# #'App': models.App -#}) -#pp = 1 -#from .models import App#as _App#, BackupJob as _BackupJob - -#@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() - #bind_links(['app_list'], [app_list], menu_name='secondary_menu') - -#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()]))}, -#]) - ###app.set_backup([ModelBackup()]) - for app_name in settings.INSTALLED_APPS: App.register(app_name) print 'registry', app_name diff --git a/apps/app_registry/links.py b/apps/app_registry/links.py index aa038c5b99..7e9f412bbe 100644 --- a/apps/app_registry/links.py +++ b/apps/app_registry/links.py @@ -5,16 +5,6 @@ from django.utils.translation import ugettext_lazy as _ from navigation.api import Link from .icons import icon_app -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=icon_app)#, permissions=[PERMISSION_BACKUP_JOB_VIEW]) app_list = Link(text=_(u'app list'), view='app_list', sprite=icon_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/urls.py b/apps/app_registry/urls.py index 71f57c7ca9..2adcf71cf8 100644 --- a/apps/app_registry/urls.py +++ b/apps/app_registry/urls.py @@ -2,9 +2,4 @@ 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 74a378d480..c272c89988 100644 --- a/apps/app_registry/views.py +++ b/apps/app_registry/views.py @@ -11,10 +11,7 @@ from django.utils.translation import ugettext as _ from common.utils import encapsulate 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 +from .models import App from .icons import icon_app @@ -32,113 +29,3 @@ def app_list(request): {'name':_(u'dependencies'), 'attribute': encapsulate(lambda x: u', '.join([unicode(dependency) for dependency in x.dependencies.all()]))}, ], }, 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 new file mode 100644 index 0000000000..19cdead95a --- /dev/null +++ b/apps/backups/__init__.py @@ -0,0 +1,80 @@ +from __future__ import absolute_import + +import inspect +#import runpy + +from django.conf import settings +from django.db import transaction, DatabaseError +from django.utils.translation import ugettext_lazy as _ +from django.utils.importlib import import_module + +#from common.utils import encapsulate +#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 .classes import AppBackup, ModelBackup + +#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 .literals import BACKUP_JOB_QUEUE_NAME +from .models import App +#from . import models + +#class UnableToRegister(Exception): +# pass + +#apipkg.initpkg(__name__, { +# #'App': _App, +## 'App': 'app_registry.models:App', +# #'App': models.App +#}) +#pp = 1 +#from .models import App#as _App#, BackupJob as _BackupJob + +#@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() + + +#bind_links(['app_list'], [app_list], menu_name='secondary_menu') + +#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()]))}, +#]) + +###app.set_backup([ModelBackup()]) + + +for app_name in settings.INSTALLED_APPS: + App.register(app_name) + print 'registry', app_name + + try: + post_init = import_module('%s.post_init' % app_name) + except ImportError: + pass + else: + print 'post', post_init + if post_init: + for name, value in inspect.getmembers(post_init): + if hasattr(value, '__call__') and name.startswith('init'): + value() diff --git a/apps/app_registry/classes.py b/apps/backups/classes.py similarity index 100% rename from apps/app_registry/classes.py rename to apps/backups/classes.py diff --git a/apps/app_registry/forms.py b/apps/backups/forms.py similarity index 100% rename from apps/app_registry/forms.py rename to apps/backups/forms.py diff --git a/apps/backups/links.py b/apps/backups/links.py new file mode 100644 index 0000000000..536a0f94a2 --- /dev/null +++ b/apps/backups/links.py @@ -0,0 +1,17 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from navigation.api import Link + +from .icons import icon_app +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/app_registry/literals.py b/apps/backups/literals.py similarity index 100% rename from apps/app_registry/literals.py rename to apps/backups/literals.py diff --git a/apps/backups/models.py b/apps/backups/models.py new file mode 100644 index 0000000000..67753ed44a --- /dev/null +++ b/apps/backups/models.py @@ -0,0 +1,58 @@ +from django.db import models + +from app_registry.models import App + +""" +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/app_registry/permissions.py b/apps/backups/permissions.py similarity index 100% rename from apps/app_registry/permissions.py rename to apps/backups/permissions.py diff --git a/apps/backups/urls.py b/apps/backups/urls.py new file mode 100644 index 0000000000..b8114349d6 --- /dev/null +++ b/apps/backups/urls.py @@ -0,0 +1,9 @@ +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 new file mode 100644 index 0000000000..30a025c8cc --- /dev/null +++ b/apps/backups/views.py @@ -0,0 +1,126 @@ +from __future__ import absolute_import + +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 common.utils import encapsulate +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 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/mimetype/models.py b/apps/mimetype/models.py deleted file mode 100644 index 71a8362390..0000000000 --- a/apps/mimetype/models.py +++ /dev/null @@ -1,3 +0,0 @@ -from django.db import models - -# Create your models here. diff --git a/apps/mimetype/views.py b/apps/mimetype/views.py deleted file mode 100644 index 60f00ef0ef..0000000000 --- a/apps/mimetype/views.py +++ /dev/null @@ -1 +0,0 @@ -# Create your views here.