Commit af91933f99eda376ddc88a8b9b77c9c461905919

Authored by Bruno Barbosa
1 parent b831b2b5
Exists in master

Implementado a opção do usuário excluir seus próprios dados

pf/listatelefonica/browser/templates/pessoaview.pt 100644 → 100755
@@ -13,6 +13,7 @@ @@ -13,6 +13,7 @@
13 13
14 <metal:main fill-slot="main"> 14 <metal:main fill-slot="main">
15 15
  16 + <tal:view condition="not: view/was_deleted">
16 <div class="row"> 17 <div class="row">
17 <div class="cell width-full position-0 "> 18 <div class="cell width-full position-0 ">
18 <div class="tile azul ui-droppable"> 19 <div class="tile azul ui-droppable">
@@ -62,6 +63,19 @@ @@ -62,6 +63,19 @@
62 </div> 63 </div>
63 </div> 64 </div>
64 </div> 65 </div>
  66 + </tal:view>
  67 +
  68 + <tal:view condition="view/was_deleted">
  69 + <h2>Confirmar exclusão</h2>
  70 + <p>Você optou por excluir seus dados da Lista Telefônica do DPF.</p>
  71 + <p>Clicando no botão "Confirmar Exclusão" abaixo seus dados serão totalmente excluídos da lista. Esta operação é irreversível.</p>
  72 + <p>Tem certeza de que deseja continuar?</p>
  73 + <a href="" class="btn btn-danger" style="color: #fff"
  74 + tal:attributes="href string:${context/absolute_url}/@@lista_delete_data?cancel=yes">Não, foi um engano</a>
  75 + <a href="./@@lista_delete_data" class="btn"
  76 + tal:attributes="href string:${context/absolute_url}/@@lista_delete_data">Confirmar Exclusão</a>
  77 + </tal:view>
  78 +
65 </metal:main> 79 </metal:main>
66 80
67 </body> 81 </body>
pf/listatelefonica/browser/templates/selfdeletedata.pt 0 → 100644
pf/listatelefonica/browser/views.py 100644 → 100755
@@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
2 2
3 import json 3 import json
4 4
  5 +from Products.statusmessages.interfaces import IStatusMessage
5 from plone import api 6 from plone import api
6 from five import grok 7 from five import grok
7 from zope.interface import Interface 8 from zope.interface import Interface
@@ -73,7 +74,26 @@ class ListaTelefonicaView(grok.View): @@ -73,7 +74,26 @@ class ListaTelefonicaView(grok.View):
73 return self.context.Description() 74 return self.context.Description()
74 75
75 76
76 -class PessoaView(grok.View): 77 +class PessoaMixin(object):
  78 +
  79 + def is_owner(self):
  80 + # Get username
  81 + current = api.user.get_current()
  82 + username = current.getUserName()
  83 +
  84 + # Check if logged user is object's creator
  85 + owner = self.context.Creator()
  86 + if username == owner:
  87 + return True
  88 + return False
  89 +
  90 + def was_deleted(self):
  91 + if self.is_owner() and self.context.excluir_dados:
  92 + return True
  93 + return False
  94 +
  95 +
  96 +class PessoaView(PessoaMixin, grok.View):
77 grok.context(IPessoa) 97 grok.context(IPessoa)
78 grok.require('zope2.View') 98 grok.require('zope2.View')
79 grok.name('view') 99 grok.name('view')
@@ -87,16 +107,32 @@ class PessoaView(grok.View): @@ -87,16 +107,32 @@ class PessoaView(grok.View):
87 107
88 return "<span>{0}</span> <br /> <span>{1}</span>".format(ramal1, ramal2) 108 return "<span>{0}</span> <br /> <span>{1}</span>".format(ramal1, ramal2)
89 109
90 - def is_owner(self):  
91 - # Get username  
92 - current = api.user.get_current()  
93 - username = current.getUserName()  
94 110
95 - # Check if logged user is object's creator  
96 - owner = self.context.Creator()  
97 - if username == owner:  
98 - return True  
99 - return False 111 +class SelfDeleteData(PessoaMixin, grok.View):
  112 + """ """
  113 + grok.context(IPessoa)
  114 + grok.require('zope2.View')
  115 + grok.name('lista_delete_data')
  116 +
  117 + def __call__(self):
  118 + if not self.was_deleted() or not self.is_owner():
  119 + return self.redirect(self.context.absolute_url())
  120 + self.delete()
  121 + return super(SelfDeleteData, self).__call__()
  122 +
  123 + def delete(self):
  124 + if 'cancel' in self.request.form and self.request.form['cancel'] == 'yes':
  125 + import transaction
  126 + self.context.excluir_dados = False
  127 + transaction.commit()
  128 + return self.redirect(self.context.absolute_url())
  129 + else:
  130 + api.content.delete(self.context)
  131 + messages = IStatusMessage(self.request)
  132 + messages.add(u'Seus dados foram excluídos com sucesso!', type=u'info')
  133 + portal_url = api.portal.get().absolute_url()
  134 + url_return = "{0}/lista-telefonica".format(portal_url)
  135 + return self.redirect(url_return)
100 136
101 137
102 class UnidadesView(grok.View): 138 class UnidadesView(grok.View):
@@ -205,6 +241,12 @@ class UnidadesView(grok.View): @@ -205,6 +241,12 @@ class UnidadesView(grok.View):
205 def update(self): 241 def update(self):
206 self.persons = self.get_results() 242 self.persons = self.get_results()
207 243
  244 + def registry(self):
  245 + """ """
  246 + portal_url = self.context.absolute_url()
  247 + login_url = "{0}/login_form?came_from=after_login".format(portal_url)
  248 + return login_url
  249 +
208 250
209 class UnidadesIframeView(UnidadesView): 251 class UnidadesIframeView(UnidadesView):
210 grok.name('unidade_iframe') 252 grok.name('unidade_iframe')
pf/listatelefonica/pessoa.py 100644 → 100755
@@ -89,6 +89,19 @@ class IPessoa(model.Schema): @@ -89,6 +89,19 @@ class IPessoa(model.Schema):
89 required=False 89 required=False
90 ) 90 )
91 91
  92 + excluir_dados = schema.Bool(
  93 + title=u"Apagar meus dados",
  94 + description=u"Selecione essa opção apenas se tiver absoluta certeza de que deseja apagar todos os seus dados da Lista Telefônica.",
  95 + required=False,
  96 + default=False,
  97 + )
  98 +
  99 + model.fieldset(
  100 + 'privacidade',
  101 + label=u"Privacidade",
  102 + fields=['excluir_dados', ]
  103 + )
  104 +
92 105
93 @form.default_value(field=IPessoa['email']) 106 @form.default_value(field=IPessoa['email'])
94 def default_email(data): 107 def default_email(data):