From fd3eed6bd13c4b43e070db2f2e5acac8579ac729 Mon Sep 17 00:00:00 2001 From: Roberto Rosario Date: Fri, 10 Aug 2012 13:51:33 -0400 Subject: [PATCH] Initial commit of the backup/restore app --- apps/backups/__init__.py | 9 ++++ apps/backups/api.py | 42 ++++++++++++++++++ apps/backups/links.py | 10 +++++ apps/backups/models.py | 3 ++ apps/backups/static/images/icons/cd_burn.png | Bin 0 -> 2348 bytes apps/backups/static/images/icons/cd_eject.png | Bin 0 -> 2345 bytes apps/backups/urls.py | 5 +++ apps/backups/views.py | 29 ++++++++++++ settings.py | 1 + urls.py | 1 + 10 files changed, 100 insertions(+) create mode 100644 apps/backups/__init__.py create mode 100644 apps/backups/api.py create mode 100644 apps/backups/links.py create mode 100644 apps/backups/models.py create mode 100644 apps/backups/static/images/icons/cd_burn.png create mode 100644 apps/backups/static/images/icons/cd_eject.png create mode 100644 apps/backups/urls.py create mode 100644 apps/backups/views.py diff --git a/apps/backups/__init__.py b/apps/backups/__init__.py new file mode 100644 index 0000000000..1993add381 --- /dev/null +++ b/apps/backups/__init__.py @@ -0,0 +1,9 @@ +from __future__ import absolute_import + +from project_tools.api import register_tool +from navigation.api import bind_links + +from .links import backup_tool_link, restore_tool_link + +register_tool(backup_tool_link) +register_tool(restore_tool_link) diff --git a/apps/backups/api.py b/apps/backups/api.py new file mode 100644 index 0000000000..5717d99e50 --- /dev/null +++ b/apps/backups/api.py @@ -0,0 +1,42 @@ +from django.utils.translation import ugettext_lazy as _ + + +class ModuleBackup(object): + _registry = {} + + STATE_BACKING_UP = 'backing_up' + STATE_RESTORING = 'restoring' + STATE_IDLE = 'idle' + + STATE_CHOICES = ( + (STATE_BACKING_UP, _(u'backing up')), + (STATE_RESTORING, _(u'restoring')), + (STATE_IDLE, _(u'idle')), + ) + + @classmethod + def get(cls, name): + return cls._registry[name] + + @classmethod + def get_all(cls): + return cls._registry.values() + + def __init__(self, name, label): + self.label = label + self.name = name + self.state = self.__class__.STATE_IDLE + self.__class__._registry[name] = self + + def backup(self, storage_module=None): + self.state = self.__class__.STATE_BACKING_UP + # call storage_module + self.state = self.__class__.STATE_IDLE + + def restore(self, storage_module=None): + self.state = self.__class__.STATE_RESTORING + # call storage_module + self.state = self.__class__.STATE_IDLE + + def __unicode__(self): + return unicode(self.label) diff --git a/apps/backups/links.py b/apps/backups/links.py new file mode 100644 index 0000000000..43117d73d4 --- /dev/null +++ b/apps/backups/links.py @@ -0,0 +1,10 @@ +from __future__ import absolute_import + +from django.utils.translation import ugettext_lazy as _ + +from navigation.api import Link + +#from .permissions import + +backup_tool_link = Link(text=_(u'backup'), view='backup_view', icon='cd_burn.png')#, permissions=[]) +restore_tool_link = Link(text=_(u'restore'), view='restore_view', icon='cd_eject.png')#, permissions=[]) diff --git a/apps/backups/models.py b/apps/backups/models.py new file mode 100644 index 0000000000..71a8362390 --- /dev/null +++ b/apps/backups/models.py @@ -0,0 +1,3 @@ +from django.db import models + +# Create your models here. diff --git a/apps/backups/static/images/icons/cd_burn.png b/apps/backups/static/images/icons/cd_burn.png new file mode 100644 index 0000000000000000000000000000000000000000..d00b382878b5a18089d5b02654317318818a6b4d GIT binary patch literal 2348 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 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 literal 0 HcmV?d00001 diff --git a/apps/backups/urls.py b/apps/backups/urls.py new file mode 100644 index 0000000000..0e94bc9070 --- /dev/null +++ b/apps/backups/urls.py @@ -0,0 +1,5 @@ +from django.conf.urls.defaults import patterns, url + +urlpatterns = patterns('backups.views', + url(r'^backup/$', 'backup_view', (), 'backup_view'), +) diff --git a/apps/backups/views.py b/apps/backups/views.py new file mode 100644 index 0000000000..9e83e82162 --- /dev/null +++ b/apps/backups/views.py @@ -0,0 +1,29 @@ +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 +from django.template import RequestContext +from django.contrib import messages +from django.core.urlresolvers import reverse + +from permissions.models import Permission + +from .api import ModuleBackup +#from .permissions import + + +def backup_view(request): + #Permission.objects.check_permissions(request.user, []) + + context = { + 'object_list': ModuleBackup.get_all(), + 'title': _(u'apps registered for backup'), + 'hide_link': True, + #'extra_columns': [ + # {'name': _(u'description'), 'attribute': 'description'}, + #], + } + + return render_to_response('generic_list.html', context, + context_instance=RequestContext(request)) diff --git a/settings.py b/settings.py index 878f60cc28..6728aaa3ef 100644 --- a/settings.py +++ b/settings.py @@ -166,6 +166,7 @@ INSTALLED_APPS = ( 'clustering', 'scheduler', 'job_processor', + 'backups', # Mayan EDMS 'diagnostics', 'maintenance', diff --git a/urls.py b/urls.py index 665c8ad2de..b62b2a388b 100644 --- a/urls.py +++ b/urls.py @@ -43,6 +43,7 @@ urlpatterns = patterns('', (r'^statistics/', include('statistics.urls')), (r'^clustering/', include('clustering.urls')), (r'^trash/', include('trash.urls')), + (r'^backups/', include('backups.urls')), )