diff --git a/conftest.py b/conftest.py
index 62064338e..efd1af9c1 100644
--- a/conftest.py
+++ b/conftest.py
@@ -3,18 +3,17 @@ from django_webtest import DjangoTestApp, WebTestMixin
class OurTestApp(DjangoTestApp):
-
def __init__(self, *args, **kwargs):
- self.default_user = kwargs.pop('default_user', None)
+ self.default_user = kwargs.pop("default_user", None)
super(OurTestApp, self).__init__(*args, **kwargs)
def get(self, *args, **kwargs):
- kwargs.setdefault('user', self.default_user)
- kwargs.setdefault('auto_follow', True)
+ kwargs.setdefault("user", self.default_user)
+ kwargs.setdefault("auto_follow", True)
return super(OurTestApp, self).get(*args, **kwargs)
-@pytest.fixture(scope='function')
+@pytest.fixture(scope="function")
def app(request, admin_user):
"""WebTest's TestApp.
diff --git a/docker/startup_scripts/create_admin.py b/docker/startup_scripts/create_admin.py
index cc0e75bd4..eccff073c 100755
--- a/docker/startup_scripts/create_admin.py
+++ b/docker/startup_scripts/create_admin.py
@@ -8,24 +8,27 @@ os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sapl.settings")
def get_enviroment_admin_password(username):
- password = os.environ.get('ADMIN_PASSWORD')
+ password = os.environ.get("ADMIN_PASSWORD")
if not password:
print(
"[SUPERUSER] Environment variable $ADMIN_PASSWORD"
- " for user %s was not set. Leaving..." % username)
- sys.exit('MISSING_ADMIN_PASSWORD')
+ " for user %s was not set. Leaving..." % username
+ )
+ sys.exit("MISSING_ADMIN_PASSWORD")
return password
def create_user_interlegis():
from django.contrib.auth.models import User
- password = get_enviroment_admin_password('interlegis')
+ password = get_enviroment_admin_password("interlegis")
print("[SUPERUSER INTERLEGIS] Creating interlegis superuser...")
- user, created = User.objects.get_or_create(username='interlegis')
+ user, created = User.objects.get_or_create(username="interlegis")
if not created:
- print("[SUPERUSER INTERLEGIS] User interlegis already exists."
- " Updating password.")
+ print(
+ "[SUPERUSER INTERLEGIS] User interlegis already exists."
+ " Updating password."
+ )
user.is_superuser = True
user.is_staff = True
user.set_password(password)
@@ -37,19 +40,21 @@ def create_superuser():
from django.contrib.auth.models import User
username = "admin"
- email = os.environ.get('ADMIN_EMAIL', '')
+ email = os.environ.get("ADMIN_EMAIL", "")
if User.objects.filter(username=username).exists():
- print("[SUPERUSER] User %s already exists."
- " Exiting without change." % username)
- sys.exit('ADMIN_USER_EXISTS')
+ print(
+ "[SUPERUSER] User %s already exists." " Exiting without change." % username
+ )
+ sys.exit("ADMIN_USER_EXISTS")
else:
password = get_enviroment_admin_password(username)
print("[SUPERUSER] Creating superuser...")
u = User.objects.create_superuser(
- username=username, password=password, email=email)
+ username=username, password=password, email=email
+ )
u.save()
print("[SUPERUSER] Done.")
@@ -57,7 +62,7 @@ def create_superuser():
sys.exit(0)
-if __name__ == '__main__':
+if __name__ == "__main__":
django.setup()
create_user_interlegis() # must come before create_superuser
create_superuser()
diff --git a/docker/startup_scripts/genkey.py b/docker/startup_scripts/genkey.py
index 4bf92f1ac..4bf39ebca 100644
--- a/docker/startup_scripts/genkey.py
+++ b/docker/startup_scripts/genkey.py
@@ -2,10 +2,15 @@ import random
def generate_secret():
- return (''.join([random.SystemRandom().choice(
- 'abcdefghijklmnopqrst'
- 'uvwxyz0123456789!@#$%^&*(-_=+)') for i in range(50)]))
+ return "".join(
+ [
+ random.SystemRandom().choice(
+ "abcdefghijklmnopqrst" "uvwxyz0123456789!@#$%^&*(-_=+)"
+ )
+ for i in range(50)
+ ]
+ )
-if __name__ == '__main__':
+if __name__ == "__main__":
print(generate_secret())
diff --git a/docker/startup_scripts/gunicorn.conf.py b/docker/startup_scripts/gunicorn.conf.py
index 2272eb15e..589846521 100644
--- a/docker/startup_scripts/gunicorn.conf.py
+++ b/docker/startup_scripts/gunicorn.conf.py
@@ -35,9 +35,9 @@ wsgi_app = WSGI_APP
# Logs
loglevel = "debug"
-errorlog = "-" # send to stderr (so you see it in docker logs or terminal)
-accesslog = "-" # send to stdout
-capture_output = True # capture print/tracebacks from app
+errorlog = "-" # send to stderr (so you see it in docker logs or terminal)
+accesslog = "-" # send to stdout
+capture_output = True # capture print/tracebacks from app
# accesslog = "/var/log/sapl/access.log"
# errorlog = "/var/log/sapl/error.log"
@@ -68,6 +68,7 @@ def on_starting(server):
def post_fork(server, worker):
try:
from django import db
+
db.connections.close_all()
except Exception:
# Django not initialized yet or not available
diff --git a/docker/startup_scripts/solr_cli.py b/docker/startup_scripts/solr_cli.py
index e7600914a..b42704c42 100755
--- a/docker/startup_scripts/solr_cli.py
+++ b/docker/startup_scripts/solr_cli.py
@@ -40,16 +40,16 @@ SECURITY_FILE_TEMPLATE = """
}
"""
-URL_PATTERN = 'https?://(([a-zA-Z0-9]+):([a-zA-Z0-9]+)@)?([a-zA-Z0-9.-]+)(:[0-9]{4})?'
+URL_PATTERN = "https?://(([a-zA-Z0-9]+):([a-zA-Z0-9]+)@)?([a-zA-Z0-9.-]+)(:[0-9]{4})?"
def solr_hash_password(password: str, salt: str = None):
"""
- Generates a password and salt to be used in Basic Auth Solr
+ Generates a password and salt to be used in Basic Auth Solr
- password: clean text password string
- salt (optional): base64 salt string
- returns: sha256 hash of password and salt (both base64 strings)
+ password: clean text password string
+ salt (optional): base64 salt string
+ returns: sha256 hash of password and salt (both base64 strings)
"""
logger.debug("Generating Solr password")
m = sha256()
@@ -57,15 +57,15 @@ def solr_hash_password(password: str, salt: str = None):
salt = secrets.token_bytes(32)
else:
salt = b64decode(salt)
- m.update(salt + password.encode('utf-8'))
+ m.update(salt + password.encode("utf-8"))
digest = m.digest()
m = sha256()
m.update(digest)
digest = m.digest()
- cypher = b64encode(digest).decode('utf-8')
- salt = b64encode(salt).decode('utf-8')
+ cypher = b64encode(digest).decode("utf-8")
+ salt = b64encode(salt).decode("utf-8")
return cypher, salt
@@ -81,18 +81,18 @@ def upload_security_file(zk_host):
zk_port = 9983 # embedded ZK port
logger.info(f"Uploading security file to Solr, ZK server={zk_host}:{zk_port}...")
try:
- with open('security.json', 'r') as f:
+ with open("security.json", "r") as f:
data = f.read()
zk = KazooClient(hosts=f"{zk_host}:{zk_port}")
zk.start()
logger.info("Uploading security.json file...")
- if zk.exists('/security.json'):
+ if zk.exists("/security.json"):
zk.set("/security.json", str.encode(data))
else:
zk.create("/security.json", str.encode(data))
- data, stat = zk.get('/security.json')
+ data, stat = zk.get("/security.json")
logger.info("file uploaded!")
- logger.info(data.decode('utf-8'))
+ logger.info(data.decode("utf-8"))
zk.stop()
except Exception as e:
logger.error(e)
@@ -103,14 +103,17 @@ class SolrClient:
LIST_CONFIGSETS = "{}/solr/admin/configs?action=LIST&omitHeader=true&wt=json"
UPLOAD_CONFIGSET = "{}/solr/admin/configs?action=UPLOAD&name={}&wt=json"
LIST_COLLECTIONS = "{}/solr/admin/collections?action=LIST&wt=json"
- STATUS_COLLECTION = "{}/solr/admin/collections?action=CLUSTERSTATUS" \
- "&collection={}&wt=json"
+ STATUS_COLLECTION = (
+ "{}/solr/admin/collections?action=CLUSTERSTATUS" "&collection={}&wt=json"
+ )
STATUS_CORE = "{}/admin/cores?action=STATUS&name={}"
EXISTS_COLLECTION = "{}/solr/{}/admin/ping?wt=json"
OPTIMIZE_COLLECTION = "{}/solr/{}/update?optimize=true&wt=json"
- CREATE_COLLECTION = "{}/solr/admin/collections?action=CREATE&name={}" \
- "&collection.configName={}&numShards={}" \
- "&replicationFactor={}&maxShardsPerNode={}&wt=json"
+ CREATE_COLLECTION = (
+ "{}/solr/admin/collections?action=CREATE&name={}"
+ "&collection.configName={}&numShards={}"
+ "&replicationFactor={}&maxShardsPerNode={}&wt=json"
+ )
DELETE_COLLECTION = "{}/solr/admin/collections?action=DELETE&name={}&wt=json"
DELETE_DATA = "{}/solr/{}/update?commitWithin=1000&overwrite=true&wt=json"
QUERY_DATA = "{}/solr/{}/select?q=*:*"
@@ -130,7 +133,7 @@ class SolrClient:
dic = res.json()
return dic["response"]["numFound"]
except Exception as e:
- print(F"Erro no get_num_docs. Erro: {e}")
+ print(f"Erro no get_num_docs. Erro: {e}")
print(res.content)
return 0
@@ -140,9 +143,9 @@ class SolrClient:
res = requests.get(req_url)
try:
dic = res.json()
- return dic['collections']
+ return dic["collections"]
except Exception as e:
- print(F"Erro no list_collections. Erro: {e}")
+ print(f"Erro no list_collections. Erro: {e}")
print(res.content)
return 0
@@ -156,8 +159,8 @@ class SolrClient:
# zip files in memory
_zipfile = BytesIO()
- with zipfile.ZipFile(_zipfile, 'w', zipfile.ZIP_DEFLATED) as zipf:
- for file in base_path.rglob('*'):
+ with zipfile.ZipFile(_zipfile, "w", zipfile.ZIP_DEFLATED) as zipf:
+ for file in base_path.rglob("*"):
zipf.write(file, file.relative_to(base_path))
return _zipfile
except Exception as e:
@@ -169,23 +172,26 @@ class SolrClient:
res = requests.get(req_url)
try:
dic = res.json()
- configsets = dic['configSets']
+ configsets = dic["configSets"]
except Exception as e:
- print(F"Erro ao configurar configsets. Erro: {e}")
+ print(f"Erro ao configurar configsets. Erro: {e}")
print(res.content)
# UPLOAD configset
if not self.CONFIGSET_NAME in configsets or force:
-
# GENERATE in memory configset
configset_zip = self.zip_configset()
data = configset_zip.getvalue()
configset_zip.close()
- files = {'file': ('saplconfigset.zip',
- data,
- 'application/octet-stream',
- {'Expires': '0'})}
+ files = {
+ "file": (
+ "saplconfigset.zip",
+ data,
+ "application/octet-stream",
+ {"Expires": "0"},
+ )
+ }
req_url = self.UPLOAD_CONFIGSET.format(self.url, self.CONFIGSET_NAME)
@@ -193,16 +199,20 @@ class SolrClient:
print(resp.content)
else:
- print('O %s já presente no servidor, NÃO enviando.' % self.CONFIGSET_NAME)
+ print("O %s já presente no servidor, NÃO enviando." % self.CONFIGSET_NAME)
- def create_collection(self, collection_name, shards=1, replication_factor=1, max_shards_per_node=1):
+ def create_collection(
+ self, collection_name, shards=1, replication_factor=1, max_shards_per_node=1
+ ):
self.maybe_upload_configset()
- req_url = self.CREATE_COLLECTION.format(self.url,
- collection_name,
- self.CONFIGSET_NAME,
- shards,
- replication_factor,
- max_shards_per_node)
+ req_url = self.CREATE_COLLECTION.format(
+ self.url,
+ collection_name,
+ self.CONFIGSET_NAME,
+ shards,
+ replication_factor,
+ max_shards_per_node,
+ )
res = requests.post(req_url)
if res.ok:
print("Collection '%s' created succesfully" % collection_name)
@@ -210,15 +220,15 @@ class SolrClient:
print("Error creating collection '%s'" % collection_name)
try:
as_json = res.json()
- print("Error %s: %s" % (res.status_code, as_json['error']['msg']))
+ print("Error %s: %s" % (res.status_code, as_json["error"]["msg"]))
except Exception as e:
- print(F"Erro ao verificar erro na resposta. Erro: {e}")
+ print(f"Erro ao verificar erro na resposta. Erro: {e}")
print(res.content)
return False
return True
def delete_collection(self, collection_name):
- if collection_name == '*':
+ if collection_name == "*":
collections = self.list_collections()
else:
collections = [collection_name]
@@ -234,9 +244,11 @@ class SolrClient:
def delete_index_data(self, collection_name):
req_url = self.DELETE_DATA.format(self.url, collection_name)
- res = requests.post(req_url,
- data='*:*',
- headers={'Content-Type': 'application/xml'})
+ res = requests.post(
+ req_url,
+ data="*:*",
+ headers={"Content-Type": "application/xml"},
+ )
if not res.ok:
print("Error deleting index for collection '%s'", collection_name)
print("Code {}: {}".format(res.status_code, res.text))
@@ -257,33 +269,67 @@ def setup_embedded_zk(solr_url):
create_security_file(solr_user, solr_pwd)
upload_security_file(solr_host)
else:
- print(f"Missing Solr's username, password, and host: {solr_user}/{solr_pwd}/{solr_host}")
+ print(
+ f"Missing Solr's username, password, and host: {solr_user}/{solr_pwd}/{solr_host}"
+ )
sys.exit(-1)
else:
print(f"Solr URL path doesn't match the required format: {solr_url}")
sys.exit(-1)
-if __name__ == '__main__':
-
- parser = argparse.ArgumentParser(description='Cria uma collection no Solr')
+if __name__ == "__main__":
+ parser = argparse.ArgumentParser(description="Cria uma collection no Solr")
# required arguments
- parser.add_argument('-u', type=str, metavar='URL', nargs=1, dest='url',
- required=True, help='Endereço do servidor Solr na forma http(s)://
[:port]')
- parser.add_argument('-c', type=str, metavar='COLLECTION', dest='collection', nargs=1,
- required=True, help='Collection Solr a ser criada')
+ parser.add_argument(
+ "-u",
+ type=str,
+ metavar="URL",
+ nargs=1,
+ dest="url",
+ required=True,
+ help="Endereço do servidor Solr na forma http(s)://[:port]",
+ )
+ parser.add_argument(
+ "-c",
+ type=str,
+ metavar="COLLECTION",
+ dest="collection",
+ nargs=1,
+ required=True,
+ help="Collection Solr a ser criada",
+ )
# optional arguments
- parser.add_argument('-s', type=int, dest='shards', nargs='?',
- help='Number of shards (default=1)', default=1)
- parser.add_argument('-rf', type=int, dest='replication_factor', nargs='?',
- help='Replication factor (default=1)', default=1)
- parser.add_argument('-ms', type=int, dest='max_shards_per_node', nargs='?',
- help='Max shards per node (default=1)', default=1)
-
- parser.add_argument("--embedded_zk", default=False, action="store_true",
- help="Embedded ZooKeeper")
+ parser.add_argument(
+ "-s",
+ type=int,
+ dest="shards",
+ nargs="?",
+ help="Number of shards (default=1)",
+ default=1,
+ )
+ parser.add_argument(
+ "-rf",
+ type=int,
+ dest="replication_factor",
+ nargs="?",
+ help="Replication factor (default=1)",
+ default=1,
+ )
+ parser.add_argument(
+ "-ms",
+ type=int,
+ dest="max_shards_per_node",
+ nargs="?",
+ help="Max shards per node (default=1)",
+ default=1,
+ )
+
+ parser.add_argument(
+ "--embedded_zk", default=False, action="store_true", help="Embedded ZooKeeper"
+ )
try:
args = parser.parse_args()
@@ -305,10 +351,12 @@ if __name__ == '__main__':
## Add --clean option to clean uploadconfig and collection
if not client.exists_collection(collection):
print("Collection '%s' doesn't exists. Creating a new one..." % collection)
- created = client.create_collection(collection,
- shards=args.shards,
- replication_factor=args.replication_factor,
- max_shards_per_node=args.max_shards_per_node)
+ created = client.create_collection(
+ collection,
+ shards=args.shards,
+ replication_factor=args.replication_factor,
+ max_shards_per_node=args.max_shards_per_node,
+ )
if not created:
sys.exit(-1)
else:
diff --git a/drfautoapi/drfautoapi.py b/drfautoapi/drfautoapi.py
index 9f3a3c502..56275d242 100644
--- a/drfautoapi/drfautoapi.py
+++ b/drfautoapi/drfautoapi.py
@@ -36,25 +36,22 @@ class SplitStringCharFilter(django_filters.CharFilter):
return qs
if self.distinct:
qs = qs.distinct()
- lookup = '%s__%s' % (self.field_name, self.lookup_expr)
+ lookup = "%s__%s" % (self.field_name, self.lookup_expr)
values = [value]
- if self.lookup_expr == 'icontains':
+ if self.lookup_expr == "icontains":
if not '"' in value:
- values = value.split(' ')
+ values = value.split(" ")
else:
values = list(
filter(
- lambda x: x and x != ' ' and x[0] != '"',
- self._re.findall(value)
+ lambda x: x and x != " " and x[0] != '"',
+ self._re.findall(value),
)
) + list(
map(
lambda x: x[1:-1],
- filter(
- lambda x: x and x[0] == '"',
- self._re.findall(value)
- )
+ filter(lambda x: x and x[0] == '"', self._re.findall(value)),
)
)
@@ -66,36 +63,34 @@ class SplitStringCharFilter(django_filters.CharFilter):
class ApiFilterSetMixin(FilterSet):
-
- o = CharFilter(method='filter_o')
+ o = CharFilter(method="filter_o")
class Meta:
- fields = '__all__'
+ fields = "__all__"
filter_overrides = {
FileField: {
- 'filter_class': django_filters.CharFilter,
- 'extra': lambda f: {
- 'lookup_expr': 'exact',
+ "filter_class": django_filters.CharFilter,
+ "extra": lambda f: {
+ "lookup_expr": "exact",
},
},
CharField: {
- 'filter_class': SplitStringCharFilter,
+ "filter_class": SplitStringCharFilter,
},
TextField: {
- 'filter_class': SplitStringCharFilter,
+ "filter_class": SplitStringCharFilter,
},
JSONField: {
- 'filter_class': django_filters.CharFilter,
- 'extra': lambda f: {
- 'lookup_expr': 'exact',
+ "filter_class": django_filters.CharFilter,
+ "extra": lambda f: {
+ "lookup_expr": "exact",
},
},
}
def filter_o(self, queryset, name, value):
try:
- return queryset.order_by(
- *map(str.strip, value.split(',')))
+ return queryset.order_by(*map(str.strip, value.split(",")))
except:
return queryset
@@ -113,29 +108,34 @@ class ApiFilterSetMixin(FilterSet):
for f_str in fields_model:
if f_str not in fields:
-
f = model._meta.get_field(f_str)
if f.many_to_many:
- fields[f_str] = ['exact']
+ fields[f_str] = ["exact"]
continue
- fields[f_str] = ['exact']
+ fields[f_str] = ["exact"]
def get_keys_lookups(cl, sub_f):
r = []
for lk, lv in cl.items():
-
- if lk in ('contained_by', 'trigram_similar', 'unaccent', 'search'):
+ if lk in (
+ "contained_by",
+ "trigram_similar",
+ "unaccent",
+ "search",
+ ):
continue
sflk = f'{sub_f}{"__" if sub_f else ""}{lk}'
r.append(sflk)
- if hasattr(lv, 'get_lookups'):
+ if hasattr(lv, "get_lookups"):
r += get_keys_lookups(lv.get_lookups(), sflk)
- if hasattr(lv, 'output_field') and hasattr(lv, 'output_field.get_lookups'):
+ if hasattr(lv, "output_field") and hasattr(
+ lv, "output_field.get_lookups"
+ ):
r.append(f'{sflk}{"__" if sflk else ""}range')
r += get_keys_lookups(lv.output_field.class_lookups, sflk)
@@ -143,31 +143,30 @@ class ApiFilterSetMixin(FilterSet):
return r
fields[f_str] = list(
- set(fields[f_str] + get_keys_lookups(f.get_lookups(), '')))
+ set(fields[f_str] + get_keys_lookups(f.get_lookups(), ""))
+ )
# Remove excluded fields
exclude = exclude or []
- fields = [(f, lookups)
- for f, lookups in fields.items() if f not in exclude]
+ fields = [(f, lookups) for f, lookups in fields.items() if f not in exclude]
return OrderedDict(fields)
@classmethod
- def filter_for_field(cls, f, name, lookup_expr='exact'):
+ def filter_for_field(cls, f, name, lookup_expr="exact"):
# Redefine método estático para ignorar filtro para
# fields que não possuam lookup_expr informado
f, lookup_type = resolve_field(f, lookup_expr)
default = {
- 'field_name': name,
- 'label': capfirst(f.verbose_name),
- 'lookup_expr': lookup_expr
+ "field_name": name,
+ "label": capfirst(f.verbose_name),
+ "lookup_expr": lookup_expr,
}
- filter_class, params = cls.filter_for_lookup(
- f, lookup_type)
+ filter_class, params = cls.filter_for_lookup(f, lookup_type)
default.update(params)
if filter_class is not None:
return filter_class(**default)
@@ -175,7 +174,7 @@ class ApiFilterSetMixin(FilterSet):
class BusinessRulesNotImplementedMixin:
- http_method_names = ['get', 'head', 'options', 'trace']
+ http_method_names = ["get", "head", "options", "trace"]
def create(self, request, *args, **kwargs):
raise Exception(_("POST Create não implementado"))
@@ -187,8 +186,7 @@ class BusinessRulesNotImplementedMixin:
raise Exception(_("DELETE Delete não implementado"))
-class ApiViewSetConstrutor():
-
+class ApiViewSetConstrutor:
_built_sets = {}
class ApiViewSet(ModelViewSet):
@@ -214,13 +212,14 @@ class ApiViewSetConstrutor():
app_label = getattr(app, "label", app.name.split(".")[-1])
for model, viewset in built_sets.items():
router.register(
- f'{app.label}/{model._meta.model_name}', viewset,
- basename=f"{app_label}-{model._meta.model_name}")
+ f"{app.label}/{model._meta.model_name}",
+ viewset,
+ basename=f"{app_label}-{model._meta.model_name}",
+ )
return router
@classmethod
def build_class(cls, apps_or_models):
-
DRFAUTOAPI = settings.DRFAUTOAPI
serializers_classes = {}
@@ -231,35 +230,38 @@ class ApiViewSetConstrutor():
try:
if DRFAUTOAPI:
- if 'DEFAULT_SERIALIZER_MODULE' in DRFAUTOAPI:
+ if "DEFAULT_SERIALIZER_MODULE" in DRFAUTOAPI:
serializers = importlib.import_module(
- DRFAUTOAPI['DEFAULT_SERIALIZER_MODULE']
+ DRFAUTOAPI["DEFAULT_SERIALIZER_MODULE"]
)
serializers_classes = inspect.getmembers(serializers)
- serializers_classes = {i[0]: i[1] for i in filter(
- lambda x: x[0].endswith('Serializer'),
- serializers_classes
- )}
+ serializers_classes = {
+ i[0]: i[1]
+ for i in filter(
+ lambda x: x[0].endswith("Serializer"), serializers_classes
+ )
+ }
- if 'DEFAULT_FILTER_MODULE' in DRFAUTOAPI:
+ if "DEFAULT_FILTER_MODULE" in DRFAUTOAPI:
filters = importlib.import_module(
- DRFAUTOAPI['DEFAULT_FILTER_MODULE']
+ DRFAUTOAPI["DEFAULT_FILTER_MODULE"]
)
filters_classes = inspect.getmembers(filters)
- filters_classes = {i[0]: i[1] for i in filter(
- lambda x: x[0].endswith('FilterSet'),
- filters_classes
- )}
-
- if 'GLOBAL_SERIALIZER_MIXIN' in DRFAUTOAPI:
- cs = DRFAUTOAPI['GLOBAL_SERIALIZER_MIXIN'].split('.')
- module = importlib.import_module(
- '.'.join(cs[0:-1]))
+ filters_classes = {
+ i[0]: i[1]
+ for i in filter(
+ lambda x: x[0].endswith("FilterSet"), filters_classes
+ )
+ }
+
+ if "GLOBAL_SERIALIZER_MIXIN" in DRFAUTOAPI:
+ cs = DRFAUTOAPI["GLOBAL_SERIALIZER_MIXIN"].split(".")
+ module = importlib.import_module(".".join(cs[0:-1]))
global_serializer_mixin = getattr(module, cs[-1])
- if 'GLOBAL_FILTERSET_MIXIN' in DRFAUTOAPI:
- cs = DRFAUTOAPI['GLOBAL_FILTERSET_MIXIN'].split('.')
- m = importlib.import_module('.'.join(cs[0:-1]))
+ if "GLOBAL_FILTERSET_MIXIN" in DRFAUTOAPI:
+ cs = DRFAUTOAPI["GLOBAL_FILTERSET_MIXIN"].split(".")
+ m = importlib.import_module(".".join(cs[0:-1]))
global_filter_class = getattr(m, cs[-1])
except Exception as e:
@@ -270,45 +272,50 @@ class ApiViewSetConstrutor():
def build(_model):
object_name = _model._meta.object_name
- serializer_name = f'{object_name}Serializer'
+ serializer_name = f"{object_name}Serializer"
_serializer_class = serializers_classes.get(
- serializer_name, global_serializer_mixin)
+ serializer_name, global_serializer_mixin
+ )
- filter_name = f'{object_name}FilterSet'
- _filterset_class = filters_classes.get(
- filter_name, global_filter_class)
+ filter_name = f"{object_name}FilterSet"
+ _filterset_class = filters_classes.get(filter_name, global_filter_class)
def create_class():
-
- _meta_serializer = object if not hasattr(
- _serializer_class, 'Meta') else _serializer_class.Meta
+ _meta_serializer = (
+ object
+ if not hasattr(_serializer_class, "Meta")
+ else _serializer_class.Meta
+ )
class ApiSerializer(_serializer_class):
-
class Meta(_meta_serializer):
- if not hasattr(_meta_serializer, 'ref_name'):
- ref_name = f'{object_name}Serializer'
+ if not hasattr(_meta_serializer, "ref_name"):
+ ref_name = f"{object_name}Serializer"
- if not hasattr(_meta_serializer, 'model'):
+ if not hasattr(_meta_serializer, "model"):
model = _model
- if hasattr(_meta_serializer, 'exclude'):
+ if hasattr(_meta_serializer, "exclude"):
exclude = _meta_serializer.exclude
else:
- if not hasattr(_meta_serializer, 'fields'):
- fields = '__all__'
- elif _meta_serializer.fields != '__all__':
+ if not hasattr(_meta_serializer, "fields"):
+ fields = "__all__"
+ elif _meta_serializer.fields != "__all__":
fields = list(_meta_serializer.fields)
else:
fields = _meta_serializer.fields
- _meta_filterset = object if not hasattr(
- _filterset_class, 'Meta') else _filterset_class.Meta
+ _meta_filterset = (
+ object
+ if not hasattr(_filterset_class, "Meta")
+ else _filterset_class.Meta
+ )
class ApiFilterSet(_filterset_class):
-
- class Meta(_meta_filterset, ):
- if not hasattr(_meta_filterset, 'model'):
+ class Meta(
+ _meta_filterset,
+ ):
+ if not hasattr(_meta_filterset, "model"):
model = _model
class ModelApiViewSet(ApiViewSetConstrutor.ApiViewSet):
@@ -319,11 +326,10 @@ class ApiViewSetConstrutor():
return ModelApiViewSet
viewset = create_class()
- viewset.__name__ = '%sModelViewSet' % _model.__name__
+ viewset.__name__ = "%sModelViewSet" % _model.__name__
return viewset
for am in apps_or_models:
-
if isinstance(am, ModelBase):
app = am._meta.app_config
else:
@@ -353,17 +359,16 @@ class ApiViewSetConstrutor():
class wrapper_queryset_response_for_drf_action(object):
-
def __init__(self, model):
self.model = model
def __call__(self, cls):
-
def wrapper(instance_view, *args, **kwargs):
# recupera a viewset do model anotado
iv = instance_view
viewset_from_model = ApiViewSetConstrutor._built_sets[
- self.model._meta.app_config][self.model]
+ self.model._meta.app_config
+ ][self.model]
# apossa da instancia da viewset mae do action
# em uma viewset que processa dados do model passado no decorator
@@ -371,41 +376,38 @@ class wrapper_queryset_response_for_drf_action(object):
iv.serializer_class = viewset_from_model.serializer_class
iv.filterset_class = viewset_from_model.filterset_class
- iv.queryset = instance_view.filter_queryset(
- iv.get_queryset())
+ iv.queryset = instance_view.filter_queryset(iv.get_queryset())
# chama efetivamente o metodo anotado que deve devolver um queryset
# com os filtros específicos definido pelo programador customizador
qs = cls(instance_view, *args, **kwargs)
page = iv.paginate_queryset(qs)
- data = iv.get_serializer(
- page if page is not None else qs, many=True).data
+ data = iv.get_serializer(page if page is not None else qs, many=True).data
- return iv.get_paginated_response(
- data) if page is not None else Response(data)
+ return (
+ iv.get_paginated_response(data) if page is not None else Response(data)
+ )
return wrapper
# decorator para recuperar e transformar o default
class customize(object):
-
def __init__(self, model):
self.model = model
def __call__(self, cls):
-
class _ApiViewSet(
cls,
- ApiViewSetConstrutor._built_sets[
- self.model._meta.app_config][self.model]
+ ApiViewSetConstrutor._built_sets[self.model._meta.app_config][self.model],
):
pass
- if hasattr(_ApiViewSet, 'build'):
+ if hasattr(_ApiViewSet, "build"):
_ApiViewSet = _ApiViewSet.build()
- ApiViewSetConstrutor._built_sets[
- self.model._meta.app_config][self.model] = _ApiViewSet
+ ApiViewSetConstrutor._built_sets[self.model._meta.app_config][
+ self.model
+ ] = _ApiViewSet
return _ApiViewSet
diff --git a/sapl/api/apps.py b/sapl/api/apps.py
index eb66f400b..02023a245 100644
--- a/sapl/api/apps.py
+++ b/sapl/api/apps.py
@@ -3,9 +3,9 @@ from django.utils.translation import gettext_lazy as _
class AppConfig(apps.AppConfig):
- name = 'sapl.api'
- label = 'api'
- verbose_name = _('API Rest')
+ name = "sapl.api"
+ label = "api"
+ verbose_name = _("API Rest")
def ready(self):
from . import signals
diff --git a/sapl/api/deprecated.py b/sapl/api/deprecated.py
index d876f66e4..1a2b29f5e 100644
--- a/sapl/api/deprecated.py
+++ b/sapl/api/deprecated.py
@@ -7,13 +7,11 @@ from sapl.api.serializers import SessaoPlenariaECidadaniaSerializer
from sapl.sessao.models import SessaoPlenaria
-class SessaoPlenariaViewSet(ListModelMixin,
- RetrieveModelMixin,
- GenericViewSet):
+class SessaoPlenariaViewSet(ListModelMixin, RetrieveModelMixin, GenericViewSet):
"""
Deprecated - Será eliminado na versão 3.2
- * TODO:
+ * TODO:
* eliminar endpoint, transferido para SaplApiViewSetConstrutor
* /api/sessao-planaria -> /api/sessao/sessaoplenaria/ecidadania
* /api/sessao-planaria/{pk} -> /api/sessao/sessaoplenaria/{pk}/ecidadania
@@ -24,4 +22,4 @@ class SessaoPlenariaViewSet(ListModelMixin,
serializer_class = SessaoPlenariaECidadaniaSerializer
queryset = SessaoPlenaria.objects.all()
filter_backends = (DjangoFilterBackend,)
- filter_fields = ('data_inicio', 'data_fim', 'interativa')
+ filter_fields = ("data_inicio", "data_fim", "interativa")
diff --git a/sapl/api/forms.py b/sapl/api/forms.py
index 995d9d962..3a563c9f5 100644
--- a/sapl/api/forms.py
+++ b/sapl/api/forms.py
@@ -8,7 +8,7 @@ from django_filters.filterset import FilterSet
from rest_framework import serializers
from drfautoapi.drfautoapi import ApiFilterSetMixin
-from sapl.base.models import TipoAutor, Autor
+from sapl.base.models import Autor, TipoAutor
from sapl.parlamentares.models import Legislatura
from sapl.utils import generic_relations_for_model
@@ -20,19 +20,17 @@ class SaplFilterSetMixin(ApiFilterSetMixin):
class AutorFilterSet(SaplFilterSetMixin):
- q = CharFilter(method='filter_q')
+ q = CharFilter(method="filter_q")
tipo = ModelChoiceFilter(queryset=TipoAutor.objects.all())
def filter_q(self, queryset, name, value):
-
- query = value.split(' ')
+ query = value.split(" ")
if query:
q = Q()
for qtext in query:
if not qtext:
continue
- q_fs = Q(nome__icontains=qtext) | Q(
- tipo__descricao__icontains=qtext)
+ q_fs = Q(nome__icontains=qtext) | Q(tipo__descricao__icontains=qtext)
order_by = []
@@ -45,17 +43,23 @@ class AutorFilterSet(SaplFilterSetMixin):
for field in item.fields_search:
if flag_order_by:
flag_order_by = False
- order_by.append('%s__%s' % (
- item.related_query_name(),
- field[0])
+ order_by.append(
+ "%s__%s" % (item.related_query_name(), field[0])
)
# if len(field) == 3 and field[2](qtext) is not
# None:
- q_fs = q_fs | Q(**{'%s__%s%s' % (
- item.related_query_name(),
- field[0],
- field[1]): qtext if len(field) == 2
- else field[2](qtext)})
+ q_fs = q_fs | Q(
+ **{
+ "%s__%s%s"
+ % (
+ item.related_query_name(),
+ field[0],
+ field[1],
+ ): qtext
+ if len(field) == 2
+ else field[2](qtext)
+ }
+ )
q = q & q_fs
@@ -66,25 +70,28 @@ class AutorFilterSet(SaplFilterSetMixin):
class AutoresPossiveisFilterSet(SaplFilterSetMixin):
- data_relativa = DateFilter(method='filter_data_relativa')
- tipo = CharFilter(method='filter_tipo')
+ data_relativa = DateFilter(method="filter_data_relativa")
+ tipo = CharFilter(method="filter_tipo")
class Meta:
model = Autor
- fields = ['data_relativa', 'tipo', ]
+ fields = [
+ "data_relativa",
+ "tipo",
+ ]
def filter_data_relativa(self, queryset, name, value):
return queryset
def filter_tipo(self, queryset, name, value):
-
try:
logger.debug(
- "Tentando obter TipoAutor correspondente à pk {}.".format(value))
+ "Tentando obter TipoAutor correspondente à pk {}.".format(value)
+ )
tipo = TipoAutor.objects.get(pk=value)
except:
logger.error("TipoAutor(pk={}) inexistente.".format(value))
- raise serializers.ValidationError(_('Tipo de Autor inexistente.'))
+ raise serializers.ValidationError(_("Tipo de Autor inexistente."))
qs = queryset.filter(tipo=tipo)
@@ -94,11 +101,15 @@ class AutoresPossiveisFilterSet(SaplFilterSetMixin):
def qs(self):
qs = super().qs
- data_relativa = self.form.cleaned_data['data_relativa'] \
- if 'data_relativa' in self.form.cleaned_data else None
+ data_relativa = (
+ self.form.cleaned_data["data_relativa"]
+ if "data_relativa" in self.form.cleaned_data
+ else None
+ )
- tipo = self.form.cleaned_data['tipo'] \
- if 'tipo' in self.form.cleaned_data else None
+ tipo = (
+ self.form.cleaned_data["tipo"] if "tipo" in self.form.cleaned_data else None
+ )
if not tipo:
return qs
@@ -107,7 +118,7 @@ class AutoresPossiveisFilterSet(SaplFilterSetMixin):
if not tipo.content_type:
return qs
- filter_for_model = 'filter_%s' % tipo.content_type.model
+ filter_for_model = "filter_%s" % tipo.content_type.model
if not hasattr(self, filter_for_model):
return qs
@@ -120,62 +131,79 @@ class AutoresPossiveisFilterSet(SaplFilterSetMixin):
def filter_parlamentar(self, queryset, data_relativa):
# não leva em conta afastamentos
legislatura_relativa = Legislatura.objects.filter(
- data_inicio__lte=data_relativa,
- data_fim__gte=data_relativa).first()
+ data_inicio__lte=data_relativa, data_fim__gte=data_relativa
+ ).first()
q = Q(
parlamentar_set__mandato__data_inicio_mandato__lte=data_relativa,
- parlamentar_set__mandato__data_fim_mandato__isnull=True) | Q(
+ parlamentar_set__mandato__data_fim_mandato__isnull=True,
+ ) | Q(
parlamentar_set__mandato__data_inicio_mandato__lte=data_relativa,
- parlamentar_set__mandato__data_fim_mandato__gte=data_relativa)
+ parlamentar_set__mandato__data_fim_mandato__gte=data_relativa,
+ )
if legislatura_relativa.atual():
q = q & Q(parlamentar_set__ativo=True)
- legislatura_anterior = self.request.GET.get(
- 'legislatura_anterior', 'False')
- if legislatura_anterior.lower() == 'true':
+ legislatura_anterior = self.request.GET.get("legislatura_anterior", "False")
+ if legislatura_anterior.lower() == "true":
legislaturas = Legislatura.objects.filter(
- data_fim__lte=data_relativa).order_by('-data_fim')[:2]
+ data_fim__lte=data_relativa
+ ).order_by("-data_fim")[:2]
if len(legislaturas) == 2:
_, leg_anterior = legislaturas
q = q | Q(
- parlamentar_set__mandato__data_inicio_mandato__gte=leg_anterior.data_inicio)
+ parlamentar_set__mandato__data_inicio_mandato__gte=leg_anterior.data_inicio
+ )
qs = queryset.filter(q)
return qs
def filter_comissao(self, queryset, data_relativa):
return queryset.filter(
- Q(comissao_set__data_extincao__isnull=True,
- comissao_set__data_fim_comissao__isnull=True) |
- Q(comissao_set__data_extincao__gte=data_relativa,
- comissao_set__data_fim_comissao__isnull=True) |
- Q(comissao_set__data_extincao__gte=data_relativa,
- comissao_set__data_fim_comissao__isnull=True) |
- Q(comissao_set__data_extincao__isnull=True,
- comissao_set__data_fim_comissao__gte=data_relativa) |
- Q(comissao_set__data_extincao__gte=data_relativa,
- comissao_set__data_fim_comissao__gte=data_relativa),
- comissao_set__data_criacao__lte=data_relativa)
+ Q(
+ comissao_set__data_extincao__isnull=True,
+ comissao_set__data_fim_comissao__isnull=True,
+ )
+ | Q(
+ comissao_set__data_extincao__gte=data_relativa,
+ comissao_set__data_fim_comissao__isnull=True,
+ )
+ | Q(
+ comissao_set__data_extincao__gte=data_relativa,
+ comissao_set__data_fim_comissao__isnull=True,
+ )
+ | Q(
+ comissao_set__data_extincao__isnull=True,
+ comissao_set__data_fim_comissao__gte=data_relativa,
+ )
+ | Q(
+ comissao_set__data_extincao__gte=data_relativa,
+ comissao_set__data_fim_comissao__gte=data_relativa,
+ ),
+ comissao_set__data_criacao__lte=data_relativa,
+ )
def filter_frente(self, queryset, data_relativa):
return queryset.filter(
- Q(frente_set__data_extincao__isnull=True) |
- Q(frente_set__data_extincao__gte=data_relativa),
- frente_set__data_criacao__lte=data_relativa)
+ Q(frente_set__data_extincao__isnull=True)
+ | Q(frente_set__data_extincao__gte=data_relativa),
+ frente_set__data_criacao__lte=data_relativa,
+ )
def filter_bancada(self, queryset, data_relativa):
return queryset.filter(
- Q(bancada_set__data_extincao__isnull=True) |
- Q(bancada_set__data_extincao__gte=data_relativa),
- bancada_set__data_criacao__lte=data_relativa)
+ Q(bancada_set__data_extincao__isnull=True)
+ | Q(bancada_set__data_extincao__gte=data_relativa),
+ bancada_set__data_criacao__lte=data_relativa,
+ )
def filter_bloco(self, queryset, data_relativa):
return queryset.filter(
- Q(bloco_set__data_extincao__isnull=True) |
- Q(bloco_set__data_extincao__gte=data_relativa),
- bloco_set__data_criacao__lte=data_relativa)
+ Q(bloco_set__data_extincao__isnull=True)
+ | Q(bloco_set__data_extincao__gte=data_relativa),
+ bloco_set__data_criacao__lte=data_relativa,
+ )
def filter_orgao(self, queryset, data_relativa):
# na implementação, não havia regras a implementar para orgao
diff --git a/sapl/api/pagination.py b/sapl/api/pagination.py
index 67aecd7f5..54d15925e 100644
--- a/sapl/api/pagination.py
+++ b/sapl/api/pagination.py
@@ -5,71 +5,73 @@ from rest_framework.response import Response
class StandardPagination(pagination.PageNumberPagination):
page_size = 10
- page_size_query_param = 'page_size'
+ page_size_query_param = "page_size"
max_page_size = 100
def paginate_queryset(self, queryset, request, view=None):
- if request.query_params.get('get_all', '').lower() == 'true':
+ if request.query_params.get("get_all", "").lower() == "true":
return None
return super().paginate_queryset(queryset, request, view=view)
def get_paginated_response_schema(self, schema):
r = {
- 'type': 'object',
- 'properties': {
- 'pagination': {
- 'type': 'object',
- 'properties': {
- 'links': {
- 'type': 'object',
- 'properties': {
- 'next': {
- 'type': 'string',
- 'nullable': True,
- 'format': 'uri',
- 'example': 'http://api.example.org/accounts/?{page_query_param}=4'.format(
- page_query_param=self.page_query_param)
+ "type": "object",
+ "properties": {
+ "pagination": {
+ "type": "object",
+ "properties": {
+ "links": {
+ "type": "object",
+ "properties": {
+ "next": {
+ "type": "string",
+ "nullable": True,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?{page_query_param}=4".format(
+ page_query_param=self.page_query_param
+ ),
},
- 'previous': {
- 'type': 'string',
- 'nullable': True,
- 'format': 'uri',
- 'example': 'http://api.example.org/accounts/?{page_query_param}=2'.format(
- page_query_param=self.page_query_param)
+ "previous": {
+ "type": "string",
+ "nullable": True,
+ "format": "uri",
+ "example": "http://api.example.org/accounts/?{page_query_param}=2".format(
+ page_query_param=self.page_query_param
+ ),
},
- }
+ },
},
- 'previous_page': {
- 'type': 'integer',
- 'example': 123,
+ "previous_page": {
+ "type": "integer",
+ "example": 123,
},
- 'next_page': {
- 'type': 'integer',
- 'example': 123,
+ "next_page": {
+ "type": "integer",
+ "example": 123,
},
- 'start_index': {
- 'type': 'integer',
- 'example': 123,
+ "start_index": {
+ "type": "integer",
+ "example": 123,
},
- 'end_index': {
- 'type': 'integer',
- 'example': 123,
+ "end_index": {
+ "type": "integer",
+ "example": 123,
},
- 'total_entries': {
- 'type': 'integer',
- 'example': 123,
+ "total_entries": {
+ "type": "integer",
+ "example": 123,
},
- 'total_pages': {
- 'type': 'integer',
- 'example': 123,
+ "total_pages": {
+ "type": "integer",
+ "example": 123,
},
- 'page': {
- 'type': 'integer',
- 'example': 123,
+ "page": {
+ "type": "integer",
+ "example": 123,
},
- }
+ },
},
- 'results': schema,
+ "results": schema,
},
}
return r
@@ -85,20 +87,21 @@ class StandardPagination(pagination.PageNumberPagination):
except EmptyPage:
next_page_number = None
- return Response({
- 'pagination': {
- 'links': {
- 'next': self.get_next_link(),
- 'previous': self.get_previous_link(),
+ return Response(
+ {
+ "pagination": {
+ "links": {
+ "next": self.get_next_link(),
+ "previous": self.get_previous_link(),
+ },
+ "previous_page": previous_page_number,
+ "next_page": next_page_number,
+ "start_index": self.page.start_index(),
+ "end_index": self.page.end_index(),
+ "total_entries": self.page.paginator.count,
+ "total_pages": self.page.paginator.num_pages,
+ "page": self.page.number,
},
- 'previous_page': previous_page_number,
- 'next_page': next_page_number,
- 'start_index': self.page.start_index(),
- 'end_index': self.page.end_index(),
- 'total_entries': self.page.paginator.count,
- 'total_pages': self.page.paginator.num_pages,
- 'page': self.page.number,
- },
- 'results': data,
-
- })
+ "results": data,
+ }
+ )
diff --git a/sapl/api/permissions.py b/sapl/api/permissions.py
index ae39f8ca9..ed43b3c2a 100644
--- a/sapl/api/permissions.py
+++ b/sapl/api/permissions.py
@@ -1,42 +1,47 @@
from rest_framework.permissions import DjangoModelPermissions
+
from sapl.rules.map_rules import rules_patterns_public
class SaplModelPermissions(DjangoModelPermissions):
-
perms_map = {
- 'GET': ['%(app_label)s.list_%(model_name)s',
- '%(app_label)s.detail_%(model_name)s'],
- 'OPTIONS': ['%(app_label)s.list_%(model_name)s',
- '%(app_label)s.detail_%(model_name)s'],
- 'HEAD': ['%(app_label)s.list_%(model_name)s',
- '%(app_label)s.detail_%(model_name)s'],
- 'POST': ['%(app_label)s.add_%(model_name)s'],
- 'PUT': ['%(app_label)s.change_%(model_name)s'],
- 'PATCH': ['%(app_label)s.change_%(model_name)s'],
- 'DELETE': ['%(app_label)s.delete_%(model_name)s'],
-
+ "GET": [
+ "%(app_label)s.list_%(model_name)s",
+ "%(app_label)s.detail_%(model_name)s",
+ ],
+ "OPTIONS": [
+ "%(app_label)s.list_%(model_name)s",
+ "%(app_label)s.detail_%(model_name)s",
+ ],
+ "HEAD": [
+ "%(app_label)s.list_%(model_name)s",
+ "%(app_label)s.detail_%(model_name)s",
+ ],
+ "POST": ["%(app_label)s.add_%(model_name)s"],
+ "PUT": ["%(app_label)s.change_%(model_name)s"],
+ "PATCH": ["%(app_label)s.change_%(model_name)s"],
+ "DELETE": ["%(app_label)s.delete_%(model_name)s"],
}
def has_permission(self, request, view):
- if getattr(view, '_ignore_model_permissions', False):
+ if getattr(view, "_ignore_model_permissions", False):
return True
- if hasattr(view, 'get_queryset'):
+ if hasattr(view, "get_queryset"):
queryset = view.get_queryset()
else:
- queryset = getattr(view, 'queryset', None)
+ queryset = getattr(view, "queryset", None)
assert queryset is not None, (
- 'Cannot apply DjangoModelPermissions on a view that '
- 'does not set `.queryset` or have a `.get_queryset()` method.'
+ "Cannot apply DjangoModelPermissions on a view that "
+ "does not set `.queryset` or have a `.get_queryset()` method."
)
perms = self.get_required_permissions(request.method, queryset.model)
- key = '{}:{}'.format(
- queryset.model._meta.app_label,
- queryset.model._meta.model_name)
+ key = "{}:{}".format(
+ queryset.model._meta.app_label, queryset.model._meta.model_name
+ )
if key in rules_patterns_public:
perms = set(perms)
@@ -47,7 +52,7 @@ class SaplModelPermissions(DjangoModelPermissions):
return True
return (
- request.user and
- (request.user.is_authenticated or not self.authenticated_users_only) and
- request.user.has_perms(perms)
+ request.user
+ and (request.user.is_authenticated or not self.authenticated_users_only)
+ and request.user.has_perms(perms)
)
diff --git a/sapl/api/serializers.py b/sapl/api/serializers.py
index 903051d10..6545eb293 100644
--- a/sapl/api/serializers.py
+++ b/sapl/api/serializers.py
@@ -9,7 +9,7 @@ from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
from sapl.base.models import Autor, CasaLegislativa, Metadata
-from sapl.parlamentares.models import Parlamentar, Mandato, Legislatura
+from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
from sapl.sessao.models import OrdemDia, SessaoPlenaria
@@ -18,7 +18,7 @@ class SaplSerializerMixin(serializers.ModelSerializer):
metadata = SerializerMethodField()
class Meta:
- fields = '__all__'
+ fields = "__all__"
def get___str__(self, obj) -> str:
return str(obj)
@@ -26,9 +26,8 @@ class SaplSerializerMixin(serializers.ModelSerializer):
def get_metadata(self, obj) -> dict:
try:
metadata = Metadata.objects.get(
- content_type=ContentType.objects.get_for_model(
- obj._meta.model),
- object_id=obj.id
+ content_type=ContentType.objects.get_for_model(obj._meta.model),
+ object_id=obj.id,
).metadata
except:
metadata = {}
@@ -48,7 +47,6 @@ class ChoiceSerializer(serializers.Serializer):
class ModelChoiceSerializer(ChoiceSerializer):
-
def get_text(self, obj):
return str(obj)
@@ -57,18 +55,16 @@ class ModelChoiceSerializer(ChoiceSerializer):
class ModelChoiceObjectRelatedField(serializers.RelatedField):
-
def to_representation(self, value):
return ModelChoiceSerializer(value).data
class AutorSerializer(SaplSerializerMixin):
-
autor_related = ModelChoiceObjectRelatedField(read_only=True)
class Meta:
model = Autor
- fields = '__all__'
+ fields = "__all__"
class CasaLegislativaSerializer(SaplSerializerMixin):
@@ -79,46 +75,57 @@ class CasaLegislativaSerializer(SaplSerializerMixin):
class Meta:
model = CasaLegislativa
- fields = '__all__'
+ fields = "__all__"
class ParlamentarSerializerPublic(SaplSerializerMixin):
-
class Meta:
model = Parlamentar
- exclude = ["cpf", "rg", "fax", "data_nascimento",
- "endereco_residencia", "municipio_residencia",
- "uf_residencia", "cep_residencia", "situacao_militar",
- "telefone_residencia", "titulo_eleitor", "fax_residencia"]
+ exclude = [
+ "cpf",
+ "rg",
+ "fax",
+ "data_nascimento",
+ "endereco_residencia",
+ "municipio_residencia",
+ "uf_residencia",
+ "cep_residencia",
+ "situacao_militar",
+ "telefone_residencia",
+ "titulo_eleitor",
+ "fax_residencia",
+ ]
class ParlamentarSerializerVerbose(SaplSerializerMixin):
- titular = serializers.SerializerMethodField('check_titular')
- partido = serializers.SerializerMethodField('check_partido')
- fotografia_cropped = serializers.SerializerMethodField('crop_fotografia')
+ titular = serializers.SerializerMethodField("check_titular")
+ partido = serializers.SerializerMethodField("check_partido")
+ fotografia_cropped = serializers.SerializerMethodField("crop_fotografia")
logger = logging.getLogger(__name__)
def crop_fotografia(self, obj):
thumbnail_url = ""
try:
import os
+
if not obj.fotografia or not os.path.exists(obj.fotografia.path):
return thumbnail_url
self.logger.warning(f"Iniciando cropping da imagem {obj.fotografia}")
thumbnail_url = get_backend().get_thumbnail_url(
obj.fotografia,
{
- 'size': (128, 128),
- 'box': obj.cropping,
- 'crop': True,
- 'detail': True,
- }
+ "size": (128, 128),
+ "box": obj.cropping,
+ "crop": True,
+ "detail": True,
+ },
+ )
+ self.logger.warning(
+ f"Cropping da imagem {obj.fotografia} realizado com sucesso"
)
- self.logger.warning(f"Cropping da imagem {obj.fotografia} realizado com sucesso")
except Exception as e:
self.logger.error(e)
- self.logger.error('erro processando arquivo: %s' %
- obj.fotografia.path)
+ self.logger.error("erro processando arquivo: %s" % obj.fotografia.path)
return thumbnail_url
@@ -129,19 +136,22 @@ class ParlamentarSerializerVerbose(SaplSerializerMixin):
return ""
try:
- legislatura = Legislatura.objects.get(
- id=self.context.get('legislatura'))
+ legislatura = Legislatura.objects.get(id=self.context.get("legislatura"))
except ObjectDoesNotExist:
legislatura = Legislatura.objects.first()
- mandato = Mandato.objects.filter(
- parlamentar=obj,
- data_inicio_mandato__gte=legislatura.data_inicio,
- data_fim_mandato__lte=legislatura.data_fim
- ).order_by('-data_inicio_mandato').first()
+ mandato = (
+ Mandato.objects.filter(
+ parlamentar=obj,
+ data_inicio_mandato__gte=legislatura.data_inicio,
+ data_fim_mandato__lte=legislatura.data_fim,
+ )
+ .order_by("-data_inicio_mandato")
+ .first()
+ )
if mandato:
- is_titular = 'Sim' if mandato.titular else 'Não'
+ is_titular = "Sim" if mandato.titular else "Não"
else:
- is_titular = '-'
+ is_titular = "-"
return is_titular
def check_partido(self, obj):
@@ -151,76 +161,95 @@ class ParlamentarSerializerVerbose(SaplSerializerMixin):
# da legislatura e data de desfiliação deve nula, ou maior,
# ou igual a data de fim da legislatura
- username = self.context['request'].user.username
+ username = self.context["request"].user.username
if not Legislatura.objects.exists():
self.logger.error("Não há legislaturas cadastradas.")
return ""
try:
- legislatura = Legislatura.objects.get(
- id=self.context.get('legislatura'))
+ legislatura = Legislatura.objects.get(id=self.context.get("legislatura"))
except ObjectDoesNotExist:
legislatura = Legislatura.objects.first()
try:
- self.logger.debug("user=" + username + ". Tentando obter filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
- "ou (data<={} e data_desfiliacao=Null))."
- .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
- filiacao = obj.filiacao_set.get(Q(
- data__lte=legislatura.data_fim,
- data_desfiliacao__gte=legislatura.data_fim) | Q(
- data__lte=legislatura.data_fim,
- data_desfiliacao__isnull=True))
+ self.logger.debug(
+ "user="
+ + username
+ + ". Tentando obter filiação do parlamentar com (data<={} e data_desfiliacao>={}) "
+ "ou (data<={} e data_desfiliacao=Null)).".format(
+ legislatura.data_fim, legislatura.data_fim, legislatura.data_fim
+ )
+ )
+ filiacao = obj.filiacao_set.get(
+ Q(
+ data__lte=legislatura.data_fim,
+ data_desfiliacao__gte=legislatura.data_fim,
+ )
+ | Q(data__lte=legislatura.data_fim, data_desfiliacao__isnull=True)
+ )
# Caso não exista filiação com essas condições
except ObjectDoesNotExist:
- self.logger.warning("user=" + username + ". Parlamentar com (data<={} e data_desfiliacao>={}) "
- "ou (data<={} e data_desfiliacao=Null)) não possui filiação."
- .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
- filiacao = 'Não possui filiação'
+ self.logger.warning(
+ "user="
+ + username
+ + ". Parlamentar com (data<={} e data_desfiliacao>={}) "
+ "ou (data<={} e data_desfiliacao=Null)) não possui filiação.".format(
+ legislatura.data_fim, legislatura.data_fim, legislatura.data_fim
+ )
+ )
+ filiacao = "Não possui filiação"
# Caso exista mais de uma filiação nesse intervalo
# Entretanto, NÃO DEVE OCORRER
except MultipleObjectsReturned:
- self.logger.error("user=" + username + ". O Parlamentar com (data<={} e data_desfiliacao>={}) "
- "ou (data<={} e data_desfiliacao=Null)) possui duas filiações conflitantes"
- .format(legislatura.data_fim, legislatura.data_fim, legislatura.data_fim))
- filiacao = 'O Parlamentar possui duas filiações conflitantes'
+ self.logger.error(
+ "user="
+ + username
+ + ". O Parlamentar com (data<={} e data_desfiliacao>={}) "
+ "ou (data<={} e data_desfiliacao=Null)) possui duas filiações conflitantes".format(
+ legislatura.data_fim, legislatura.data_fim, legislatura.data_fim
+ )
+ )
+ filiacao = "O Parlamentar possui duas filiações conflitantes"
# Caso encontre UMA filiação nessas condições
else:
- self.logger.debug("user=" + username +
- ". Filiação encontrada com sucesso.")
+ self.logger.debug("user=" + username + ". Filiação encontrada com sucesso.")
filiacao = filiacao.partido.sigla
return filiacao
class Meta:
model = Parlamentar
- fields = ['id', 'nome_parlamentar', 'fotografia_cropped',
- 'fotografia', 'ativo', 'partido', 'titular', ]
+ fields = [
+ "id",
+ "nome_parlamentar",
+ "fotografia_cropped",
+ "fotografia",
+ "ativo",
+ "partido",
+ "titular",
+ ]
class SessaoPlenariaECidadaniaSerializer(serializers.ModelSerializer):
-
- codReuniao = serializers.SerializerMethodField('get_pk_sessao')
- codReuniaoPrincipal = serializers.SerializerMethodField('get_pk_sessao')
- txtTituloReuniao = serializers.SerializerMethodField('get_name')
- txtSiglaOrgao = serializers.SerializerMethodField('get_sigla_orgao')
- txtApelido = serializers.SerializerMethodField('get_name')
- txtNomeOrgao = serializers.SerializerMethodField('get_nome_orgao')
- codEstadoReuniao = serializers.SerializerMethodField(
- 'get_estadoSessaoPlenaria')
- txtTipoReuniao = serializers.SerializerMethodField('get_tipo_sessao')
- txtObjeto = serializers.SerializerMethodField('get_assunto_sessao')
- txtLocal = serializers.SerializerMethodField('get_endereco_orgao')
- bolReuniaoConjunta = serializers.SerializerMethodField(
- 'get_reuniao_conjunta')
- bolHabilitarEventoInterativo = serializers.SerializerMethodField(
- 'get_iterativo')
- idYoutube = serializers.SerializerMethodField('get_url')
+ codReuniao = serializers.SerializerMethodField("get_pk_sessao")
+ codReuniaoPrincipal = serializers.SerializerMethodField("get_pk_sessao")
+ txtTituloReuniao = serializers.SerializerMethodField("get_name")
+ txtSiglaOrgao = serializers.SerializerMethodField("get_sigla_orgao")
+ txtApelido = serializers.SerializerMethodField("get_name")
+ txtNomeOrgao = serializers.SerializerMethodField("get_nome_orgao")
+ codEstadoReuniao = serializers.SerializerMethodField("get_estadoSessaoPlenaria")
+ txtTipoReuniao = serializers.SerializerMethodField("get_tipo_sessao")
+ txtObjeto = serializers.SerializerMethodField("get_assunto_sessao")
+ txtLocal = serializers.SerializerMethodField("get_endereco_orgao")
+ bolReuniaoConjunta = serializers.SerializerMethodField("get_reuniao_conjunta")
+ bolHabilitarEventoInterativo = serializers.SerializerMethodField("get_iterativo")
+ idYoutube = serializers.SerializerMethodField("get_url")
codEstadoTransmissaoYoutube = serializers.SerializerMethodField(
- 'get_estadoTransmissaoYoutube')
- datReuniaoString = serializers.SerializerMethodField('get_date')
+ "get_estadoTransmissaoYoutube"
+ )
+ datReuniaoString = serializers.SerializerMethodField("get_date")
# Constantes SessaoPlenaria (de 1-9) (apenas 3 serão usados)
SESSAO_FINALIZADA = 4
@@ -235,21 +264,21 @@ class SessaoPlenariaECidadaniaSerializer(serializers.ModelSerializer):
class Meta:
model = SessaoPlenaria
fields = (
- 'codReuniao',
- 'codReuniaoPrincipal',
- 'txtTituloReuniao',
- 'txtSiglaOrgao',
- 'txtApelido',
- 'txtNomeOrgao',
- 'codEstadoReuniao',
- 'txtTipoReuniao',
- 'txtObjeto',
- 'txtLocal',
- 'bolReuniaoConjunta',
- 'bolHabilitarEventoInterativo',
- 'idYoutube',
- 'codEstadoTransmissaoYoutube',
- 'datReuniaoString'
+ "codReuniao",
+ "codReuniaoPrincipal",
+ "txtTituloReuniao",
+ "txtSiglaOrgao",
+ "txtApelido",
+ "txtNomeOrgao",
+ "codEstadoReuniao",
+ "txtTipoReuniao",
+ "txtObjeto",
+ "txtLocal",
+ "bolReuniaoConjunta",
+ "bolHabilitarEventoInterativo",
+ "idYoutube",
+ "codEstadoTransmissaoYoutube",
+ "datReuniaoString",
)
def get_pk_sessao(self, obj):
@@ -277,9 +306,7 @@ class SessaoPlenariaECidadaniaSerializer(serializers.ModelSerializer):
def get_date(self, obj):
return "{} {}{}".format(
- obj.data_inicio.strftime("%d/%m/%Y"),
- obj.hora_inicio,
- ":00"
+ obj.data_inicio.strftime("%d/%m/%Y"), obj.hora_inicio, ":00"
)
def get_estadoTransmissaoYoutube(self, obj):
@@ -292,9 +319,9 @@ class SessaoPlenariaECidadaniaSerializer(serializers.ModelSerializer):
return self.SEM_TRANSMISSAO
def get_assunto_sessao(self, obj):
- pauta_sessao = ''
+ pauta_sessao = ""
ordem_dia = OrdemDia.objects.filter(sessao_plenaria=obj.pk)
- pauta_sessao = ', '.join([i.materia.__str__() for i in ordem_dia])
+ pauta_sessao = ", ".join([i.materia.__str__() for i in ordem_dia])
return str(pauta_sessao)
diff --git a/sapl/api/urls.py b/sapl/api/urls.py
index 5c84121e3..7c99d94bc 100644
--- a/sapl/api/urls.py
+++ b/sapl/api/urls.py
@@ -1,16 +1,14 @@
-
from django.urls import include, path, re_path
-from drf_spectacular.views import SpectacularAPIView, SpectacularSwaggerView, \
- SpectacularRedocView
+from drf_spectacular.views import (SpectacularAPIView, SpectacularRedocView,
+ SpectacularSwaggerView)
from rest_framework.authtoken.views import obtain_auth_token
from sapl.api.deprecated import SessaoPlenariaViewSet
-from sapl.api.views import AppVersionView, recria_token,\
- SaplApiViewSetConstrutor
+from sapl.api.views import (AppVersionView, SaplApiViewSetConstrutor,
+ recria_token)
from .apps import AppConfig
-
app_name = AppConfig.name
router = SaplApiViewSetConstrutor.router()
@@ -19,26 +17,30 @@ router = SaplApiViewSetConstrutor.router()
# verificar se ainda permanece necessidade desses endpoint's
# /api/sessao-planaria -> /api/sessao/sessaoplenaria/ecidadania
# /api/sessao-planaria/{pk} -> /api/sessao/sessaoplenaria/{pk}/ecidadania
-router.register(r'sessao-plenaria', SessaoPlenariaViewSet,
- basename='sessao_plenaria_old')
+router.register(
+ r"sessao-plenaria", SessaoPlenariaViewSet, basename="sessao_plenaria_old"
+)
urlpatterns_router = router.urls
urlpatterns_api_doc = [
- re_path('^schema/swagger-ui/',
- SpectacularSwaggerView.as_view(url_name='sapl.api:schema_api'),
- name='swagger_ui_schema_api'),
- re_path('^schema/redoc/',
- SpectacularRedocView.as_view(url_name='sapl.api:schema_api'),
- name='redoc_schema_api'),
- re_path('^schema/', SpectacularAPIView.as_view(), name='schema_api'),
+ re_path(
+ "^schema/swagger-ui/",
+ SpectacularSwaggerView.as_view(url_name="sapl.api:schema_api"),
+ name="swagger_ui_schema_api",
+ ),
+ re_path(
+ "^schema/redoc/",
+ SpectacularRedocView.as_view(url_name="sapl.api:schema_api"),
+ name="redoc_schema_api",
+ ),
+ re_path("^schema/", SpectacularAPIView.as_view(), name="schema_api"),
]
urlpatterns = [
- path('api/', include(urlpatterns_api_doc)),
- path('api/', include(urlpatterns_router)),
-
- re_path(r'^api/version', AppVersionView.as_view()),
- path('api/auth/token', obtain_auth_token),
- re_path(r'^api/recriar-token/(?P\d*)$', recria_token, name="recria_token"),
+ path("api/", include(urlpatterns_api_doc)),
+ path("api/", include(urlpatterns_router)),
+ re_path(r"^api/version", AppVersionView.as_view()),
+ path("api/auth/token", obtain_auth_token),
+ re_path(r"^api/recriar-token/(?P\d*)$", recria_token, name="recria_token"),
]
diff --git a/sapl/api/views.py b/sapl/api/views.py
index a9c0686e8..b3fde1ea1 100644
--- a/sapl/api/views.py
+++ b/sapl/api/views.py
@@ -3,7 +3,7 @@ import logging
from django.conf import settings
from rest_framework.authtoken.models import Token
from rest_framework.decorators import api_view, permission_classes
-from rest_framework.permissions import IsAuthenticated, IsAdminUser
+from rest_framework.permissions import IsAdminUser, IsAuthenticated
from rest_framework.response import Response
from rest_framework.views import APIView
@@ -12,7 +12,7 @@ from drfautoapi.drfautoapi import ApiViewSetConstrutor
logger = logging.getLogger(__name__)
-@api_view(['POST'])
+@api_view(["POST"])
@permission_classes([IsAdminUser])
def recria_token(request, pk):
Token.objects.filter(user_id=pk).delete()
@@ -26,28 +26,30 @@ class AppVersionView(APIView):
def get(self, request):
content = {
- 'name': 'SAPL',
- 'description': 'Sistema de Apoio ao Processo Legislativo',
- 'version': settings.SAPL_VERSION,
- 'user': request.user.username,
- 'is_authenticated': request.user.is_authenticated,
+ "name": "SAPL",
+ "description": "Sistema de Apoio ao Processo Legislativo",
+ "version": settings.SAPL_VERSION,
+ "user": request.user.username,
+ "is_authenticated": request.user.is_authenticated,
}
return Response(content)
SaplApiViewSetConstrutor = ApiViewSetConstrutor
-SaplApiViewSetConstrutor.import_modules([
- 'sapl.api.views_audiencia',
- 'sapl.api.views_base',
- 'sapl.api.views_comissoes',
- 'sapl.api.views_compilacao',
- 'sapl.api.views_materia',
- 'sapl.api.views_norma',
- 'sapl.api.views_painel',
- 'sapl.api.views_parlamentares',
- 'sapl.api.views_protocoloadm',
- 'sapl.api.views_sessao',
-])
+SaplApiViewSetConstrutor.import_modules(
+ [
+ "sapl.api.views_audiencia",
+ "sapl.api.views_base",
+ "sapl.api.views_comissoes",
+ "sapl.api.views_compilacao",
+ "sapl.api.views_materia",
+ "sapl.api.views_norma",
+ "sapl.api.views_painel",
+ "sapl.api.views_parlamentares",
+ "sapl.api.views_protocoloadm",
+ "sapl.api.views_sessao",
+ ]
+)
"""
diff --git a/sapl/api/views_audiencia.py b/sapl/api/views_audiencia.py
index c636be92f..756ea0b19 100644
--- a/sapl/api/views_audiencia.py
+++ b/sapl/api/views_audiencia.py
@@ -1,11 +1,8 @@
-
from django.apps.registry import apps
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
AudienciaApiViewSetConstrutor = ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('audiencia')
- ]
+ [apps.get_app_config("audiencia")]
)
diff --git a/sapl/api/views_base.py b/sapl/api/views_base.py
index 04dbd3fc9..aec2dc8dc 100644
--- a/sapl/api/views_base.py
+++ b/sapl/api/views_base.py
@@ -11,22 +11,18 @@ from drfautoapi.drfautoapi import ApiViewSetConstrutor, customize
from sapl.api.forms import AutoresPossiveisFilterSet
from sapl.api.serializers import ChoiceSerializer
from sapl.base.models import Autor, TipoAutor
-from sapl.utils import models_with_gr_for_model, SaplGenericRelation
-
+from sapl.utils import SaplGenericRelation, models_with_gr_for_model
logger = logging.getLogger(__name__)
ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('contenttypes'),
- apps.get_app_config('base')
- ]
+ [apps.get_app_config("contenttypes"), apps.get_app_config("base")]
)
@customize(ContentType)
class _ContentTypeSet:
- http_method_names = ['get', 'head', 'options', 'trace']
+ http_method_names = ["get", "head", "options", "trace"]
@customize(Autor)
@@ -74,7 +70,6 @@ class _AutorViewSet:
@classmethod
def build(cls):
-
models_with_gr_for_autor = models_with_gr_for_model(Autor)
for _model in models_with_gr_for_autor:
@@ -87,10 +82,10 @@ class _AutorViewSet:
return self.list_for_content_type(content_type)
func = actionclass
- func.mapping['get'] = func.kwargs['name']
- func.url_name = func.kwargs['name']
- func.url_path = func.kwargs['name']
- func.__name__ = func.kwargs['name']
+ func.mapping["get"] = func.kwargs["name"]
+ func.url_name = func.kwargs["name"]
+ func.url_path = func.kwargs["name"]
+ func.__name__ = func.kwargs["name"]
func.__model = _model
setattr(cls, _model._meta.model_name, func)
@@ -103,7 +98,6 @@ class _AutorViewSet:
@action(detail=False)
def provaveis(self, request, *args, **kwargs):
-
self.get_queryset = self.provaveis__get_queryset
self.filter_backends = []
@@ -112,15 +106,15 @@ class _AutorViewSet:
return self.list(request, *args, **kwargs)
def provaveis__get_queryset(self):
- params = {'content_type__isnull': False}
+ params = {"content_type__isnull": False}
username = self.request.user.username
- tipo = ''
+ tipo = ""
try:
- tipo = int(self.request.GET.get('tipo', ''))
+ tipo = int(self.request.GET.get("tipo", ""))
if tipo:
- params['id'] = tipo
+ params["id"] = tipo
except Exception as e:
- logger.error('user= ' + username + '. ' + str(e))
+ logger.error("user= " + username + ". " + str(e))
pass
tipos = TipoAutor.objects.filter(**params)
@@ -130,14 +124,17 @@ class _AutorViewSet:
r = []
for tipo in tipos:
- q = self.request.GET.get('q', '').strip()
+ q = self.request.GET.get("q", "").strip()
model_class = tipo.content_type.model_class()
- fields = list(filter(
- lambda field: isinstance(field, SaplGenericRelation) and
- field.related_model == Autor,
- model_class._meta.get_fields(include_hidden=True)))
+ fields = list(
+ filter(
+ lambda field: isinstance(field, SaplGenericRelation)
+ and field.related_model == Autor,
+ model_class._meta.get_fields(include_hidden=True),
+ )
+ )
"""
fields - é um array de SaplGenericRelation que deve possuir o
@@ -145,11 +142,13 @@ class _AutorViewSet:
a estrutura de fields_search.
"""
- assert len(fields) >= 1, (_(
- 'Não foi encontrado em %(model)s um atributo do tipo '
- 'SaplGenericRelation que use o model %(model_autor)s') % {
- 'model': model_class._meta.verbose_name,
- 'model_autor': Autor._meta.verbose_name})
+ assert len(fields) >= 1, _(
+ "Não foi encontrado em %(model)s um atributo do tipo "
+ "SaplGenericRelation que use o model %(model_autor)s"
+ ) % {
+ "model": model_class._meta.verbose_name,
+ "model_autor": Autor._meta.verbose_name,
+ }
qs = model_class.objects.all()
@@ -160,19 +159,18 @@ class _AutorViewSet:
continue
q_fs = Q()
for field in item.fields_search:
- q_fs = q_fs | Q(**{'%s%s' % (
- field[0],
- field[1]): q})
+ q_fs = q_fs | Q(**{"%s%s" % (field[0], field[1]): q})
q_filter = q_filter & q_fs
- qs = qs.filter(q_filter).distinct(
- fields[0].fields_search[0][0]).order_by(
- fields[0].fields_search[0][0])
+ qs = (
+ qs.filter(q_filter)
+ .distinct(fields[0].fields_search[0][0])
+ .order_by(fields[0].fields_search[0][0])
+ )
else:
qs = qs.order_by(fields[0].fields_search[0][0])
- qs = qs.values_list(
- 'id', fields[0].fields_search[0][0])
+ qs = qs.values_list("id", fields[0].fields_search[0][0])
r += list(qs)
if tipos.count() > 1:
diff --git a/sapl/api/views_comissoes.py b/sapl/api/views_comissoes.py
index a1722be3b..5635d3fcb 100644
--- a/sapl/api/views_comissoes.py
+++ b/sapl/api/views_comissoes.py
@@ -1,23 +1,16 @@
-
from django.apps.registry import apps
-
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
-from sapl.comissoes.models import Comissao
from rest_framework.decorators import action
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
+from sapl.comissoes.models import Comissao
from sapl.materia.models import MateriaEmTramitacao
+ApiViewSetConstrutor.build_class([apps.get_app_config("comissoes")])
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('comissoes')
- ]
-)
@customize(Comissao)
class _ComissaoViewSet:
-
@action(detail=True)
def materiaemtramitacao(self, request, *args, **kwargs):
return self.get_materiaemtramitacao(**kwargs)
@@ -25,5 +18,5 @@ class _ComissaoViewSet:
@wrapper_queryset_response_for_drf_action(model=MateriaEmTramitacao)
def get_materiaemtramitacao(self, **kwargs):
return self.get_queryset().filter(
- unidade_tramitacao_atual__comissao=kwargs['pk'],
- )
\ No newline at end of file
+ unidade_tramitacao_atual__comissao=kwargs["pk"],
+ )
diff --git a/sapl/api/views_compilacao.py b/sapl/api/views_compilacao.py
index 341c0a959..84e463d83 100644
--- a/sapl/api/views_compilacao.py
+++ b/sapl/api/views_compilacao.py
@@ -1,12 +1,6 @@
-
from django.apps.registry import apps
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
-
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('compilacao')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("compilacao")])
diff --git a/sapl/api/views_materia.py b/sapl/api/views_materia.py
index d37658afa..f679589f2 100644
--- a/sapl/api/views_materia.py
+++ b/sapl/api/views_materia.py
@@ -1,21 +1,15 @@
-
from django.apps.registry import apps
from django.db.models import Q
from rest_framework.decorators import action
from rest_framework.response import Response
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
from sapl.api.permissions import SaplModelPermissions
-from sapl.materia.models import TipoMateriaLegislativa, Tramitacao,\
- MateriaLegislativa, Proposicao
-
+from sapl.materia.models import (MateriaLegislativa, Proposicao,
+ TipoMateriaLegislativa, Tramitacao)
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('materia')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("materia")])
@customize(Proposicao)
@@ -46,9 +40,8 @@ class _ProposicaoViewSet:
"""
class ProposicaoPermission(SaplModelPermissions):
-
def has_permission(self, request, view):
- if request.method == 'GET':
+ if request.method == "GET":
return True
# se a solicitação é list ou detail, libera o teste de permissão
# e deixa o get_queryset filtrar de acordo com a regra de
@@ -68,7 +61,6 @@ class _ProposicaoViewSet:
q = Q(data_recebimento__isnull=False, object_id__isnull=False)
if not self.request.user.is_anonymous:
-
autor_do_usuario_logado = self.request.user.autor_set.first()
# se usuário logado é operador de algum autor
@@ -76,9 +68,8 @@ class _ProposicaoViewSet:
q = Q(autor=autor_do_usuario_logado)
# se é operador de protocolo, ve qualquer coisa enviada
- if self.request.user.has_perm('protocoloadm.list_protocolo'):
- q = Q(data_envio__isnull=False) | Q(
- data_devolucao__isnull=False)
+ if self.request.user.has_perm("protocoloadm.list_protocolo"):
+ q = Q(data_envio__isnull=False) | Q(data_devolucao__isnull=False)
qs = qs.filter(q)
return qs
@@ -86,26 +77,26 @@ class _ProposicaoViewSet:
@customize(MateriaLegislativa)
class _MateriaLegislativaViewSet:
-
class Meta:
- ordering = ['-ano', 'tipo', 'numero']
+ ordering = ["-ano", "tipo", "numero"]
- @action(detail=True, methods=['GET'])
+ @action(detail=True, methods=["GET"])
def ultima_tramitacao(self, request, *args, **kwargs):
-
materia = self.get_object()
if not materia.tramitacao_set.exists():
return Response({})
ultima_tramitacao = materia.tramitacao_set.order_by(
- '-data_tramitacao', '-id').first()
+ "-data_tramitacao", "-id"
+ ).first()
serializer_class = ApiViewSetConstrutor.get_viewset_for_model(
- Tramitacao).serializer_class(ultima_tramitacao)
+ Tramitacao
+ ).serializer_class(ultima_tramitacao)
return Response(serializer_class.data)
- @action(detail=True, methods=['GET'])
+ @action(detail=True, methods=["GET"])
def anexadas(self, request, *args, **kwargs):
self.queryset = self.get_object().anexadas.all()
return self.list(request, *args, **kwargs)
@@ -113,17 +104,13 @@ class _MateriaLegislativaViewSet:
@customize(TipoMateriaLegislativa)
class _TipoMateriaLegislativaViewSet:
-
- @action(detail=True, methods=['POST'])
+ @action(detail=True, methods=["POST"])
def change_position(self, request, *args, **kwargs):
- result = {
- 'status': 200,
- 'message': 'OK'
- }
+ result = {"status": 200, "message": "OK"}
d = request.data
- if 'pos_ini' in d and 'pos_fim' in d:
- if d['pos_ini'] != d['pos_fim']:
- pk = kwargs['pk']
- TipoMateriaLegislativa.objects.reposicione(pk, d['pos_fim'])
+ if "pos_ini" in d and "pos_fim" in d:
+ if d["pos_ini"] != d["pos_fim"]:
+ pk = kwargs["pk"]
+ TipoMateriaLegislativa.objects.reposicione(pk, d["pos_fim"])
return Response(result)
diff --git a/sapl/api/views_norma.py b/sapl/api/views_norma.py
index 1b962f38d..07305504c 100644
--- a/sapl/api/views_norma.py
+++ b/sapl/api/views_norma.py
@@ -1,14 +1,8 @@
-
from django.apps.registry import apps
from rest_framework.decorators import action
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
from sapl.norma.models import NormaJuridica
-
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('norma')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("norma")])
diff --git a/sapl/api/views_painel.py b/sapl/api/views_painel.py
index 66f918658..76be28488 100644
--- a/sapl/api/views_painel.py
+++ b/sapl/api/views_painel.py
@@ -1,11 +1,6 @@
-
from django.apps.registry import apps
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('painel')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("painel")])
diff --git a/sapl/api/views_parlamentares.py b/sapl/api/views_parlamentares.py
index e8888160d..2dec4b412 100644
--- a/sapl/api/views_parlamentares.py
+++ b/sapl/api/views_parlamentares.py
@@ -1,34 +1,25 @@
-
from django.apps.registry import apps
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist
from rest_framework.decorators import action
from rest_framework.response import Response
-from drfautoapi.drfautoapi import customize, ApiViewSetConstrutor, \
- wrapper_queryset_response_for_drf_action
-
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
from sapl.api.permissions import SaplModelPermissions
-from sapl.api.serializers import ParlamentarSerializerVerbose, \
- ParlamentarSerializerPublic
+from sapl.api.serializers import (ParlamentarSerializerPublic,
+ ParlamentarSerializerVerbose)
from sapl.materia.models import Proposicao
-from sapl.parlamentares.models import Mandato, Legislatura
-from sapl.parlamentares.models import Parlamentar
+from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('parlamentares')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("parlamentares")])
@customize(Parlamentar)
class _ParlamentarViewSet:
-
class ParlamentarPermission(SaplModelPermissions):
-
def has_permission(self, request, view):
- if request.method == 'GET':
+ if request.method == "GET":
return True
else:
perm = super().has_permission(request, view)
@@ -37,7 +28,7 @@ class _ParlamentarViewSet:
permission_classes = (ParlamentarPermission,)
def get_serializer(self, *args, **kwargs):
- if not self.request.user.has_perm('parlamentares.add_parlamentar'):
+ if not self.request.user.has_perm("parlamentares.add_parlamentar"):
self.serializer_class = ParlamentarSerializerPublic
return super().get_serializer(*args, **kwargs)
@@ -58,35 +49,30 @@ class _ParlamentarViewSet:
@wrapper_queryset_response_for_drf_action(model=Proposicao)
def get_proposicoes(self, **kwargs):
-
return self.get_queryset().filter(
data_envio__isnull=False,
data_recebimento__isnull=False,
cancelado=False,
- autor__object_id=kwargs['pk'],
- autor__content_type=ContentType.objects.get_for_model(Parlamentar)
+ autor__object_id=kwargs["pk"],
+ autor__content_type=ContentType.objects.get_for_model(Parlamentar),
)
- @action(detail=False, methods=['GET'])
+ @action(detail=False, methods=["GET"])
def search_parlamentares(self, request, *args, **kwargs):
- nome = request.query_params.get('nome_parlamentar', '')
- parlamentares = Parlamentar.objects.filter(
- nome_parlamentar__icontains=nome)
+ nome = request.query_params.get("nome_parlamentar", "")
+ parlamentares = Parlamentar.objects.filter(nome_parlamentar__icontains=nome)
serializer_class = ParlamentarSerializerVerbose(
- parlamentares, many=True, context={'request': request})
+ parlamentares, many=True, context={"request": request}
+ )
return Response(serializer_class.data)
@customize(Legislatura)
class _LegislaturaViewSet:
-
@action(detail=True)
def parlamentares(self, request, *args, **kwargs):
-
def get_serializer_context():
- return {
- 'request': self.request, 'legislatura': kwargs['pk']
- }
+ return {"request": self.request, "legislatura": kwargs["pk"]}
def get_serializer_class():
return ParlamentarSerializerVerbose
@@ -98,22 +84,21 @@ class _LegislaturaViewSet:
@wrapper_queryset_response_for_drf_action(model=Parlamentar)
def get_parlamentares(self):
-
try:
- legislatura = Legislatura.objects.get(pk=self.kwargs['pk'])
+ legislatura = Legislatura.objects.get(pk=self.kwargs["pk"])
except ObjectDoesNotExist:
return Response("")
filter_params = {
- 'legislatura': legislatura,
- 'data_inicio_mandato__gte': legislatura.data_inicio,
- 'data_fim_mandato__lte': legislatura.data_fim,
+ "legislatura": legislatura,
+ "data_inicio_mandato__gte": legislatura.data_inicio,
+ "data_fim_mandato__lte": legislatura.data_fim,
}
- mandatos = Mandato.objects.filter(
- **filter_params).order_by('-data_inicio_mandato')
+ mandatos = Mandato.objects.filter(**filter_params).order_by(
+ "-data_inicio_mandato"
+ )
- parlamentares = self.get_queryset().filter(
- mandato__in=mandatos).distinct()
+ parlamentares = self.get_queryset().filter(mandato__in=mandatos).distinct()
return parlamentares
diff --git a/sapl/api/views_protocoloadm.py b/sapl/api/views_protocoloadm.py
index 5ebe77ec1..9f6bdadd3 100644
--- a/sapl/api/views_protocoloadm.py
+++ b/sapl/api/views_protocoloadm.py
@@ -1,29 +1,23 @@
-
from django.apps.registry import apps
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
from sapl.api.permissions import SaplModelPermissions
-from sapl.base.models import AppConfig, DOC_ADM_OSTENSIVO
-from sapl.protocoloadm.models import DocumentoAdministrativo, \
- DocumentoAcessorioAdministrativo, TramitacaoAdministrativo, Anexado
-
+from sapl.base.models import DOC_ADM_OSTENSIVO, AppConfig
+from sapl.protocoloadm.models import (Anexado,
+ DocumentoAcessorioAdministrativo,
+ DocumentoAdministrativo,
+ TramitacaoAdministrativo)
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('protocoloadm')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("protocoloadm")])
@customize(DocumentoAdministrativo)
class _DocumentoAdministrativoViewSet:
-
class DocumentoAdministrativoPermission(SaplModelPermissions):
-
def has_permission(self, request, view):
- if request.method == 'GET':
- comportamento = AppConfig.attr('documentos_administrativos')
+ if request.method == "GET":
+ comportamento = AppConfig.attr("documentos_administrativos")
if comportamento == DOC_ADM_OSTENSIVO:
return True
"""
@@ -54,9 +48,9 @@ class _DocumentoAdministrativoViewSet:
@customize(DocumentoAcessorioAdministrativo)
class _DocumentoAcessorioAdministrativoViewSet:
-
permission_classes = (
- _DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission,)
+ _DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission,
+ )
def get_queryset(self):
qs = super().get_queryset()
@@ -72,10 +66,11 @@ class _TramitacaoAdministrativoViewSet:
# tramitacação de adm possui regras previstas de limitação de origem
# destino
- http_method_names = ['get', 'head', 'options', 'trace']
+ http_method_names = ["get", "head", "options", "trace"]
permission_classes = (
- _DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission,)
+ _DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission,
+ )
def get_queryset(self):
qs = super().get_queryset()
@@ -89,10 +84,11 @@ class _TramitacaoAdministrativoViewSet:
class _AnexadoViewSet:
# TODO: Implementar regras de manutenção post, put, patch
# anexado deve possuir controle que impeça anexação cíclica
- http_method_names = ['get', 'head', 'options', 'trace']
+ http_method_names = ["get", "head", "options", "trace"]
permission_classes = (
- _DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission,)
+ _DocumentoAdministrativoViewSet.DocumentoAdministrativoPermission,
+ )
def get_queryset(self):
qs = super().get_queryset()
diff --git a/sapl/api/views_sessao.py b/sapl/api/views_sessao.py
index 75807f8cd..f3b874386 100644
--- a/sapl/api/views_sessao.py
+++ b/sapl/api/views_sessao.py
@@ -1,26 +1,19 @@
-
from django.apps.registry import apps
from rest_framework.decorators import action
from rest_framework.response import Response
-from drfautoapi.drfautoapi import ApiViewSetConstrutor, \
- customize, wrapper_queryset_response_for_drf_action
-from sapl.api.serializers import ChoiceSerializer,\
- SessaoPlenariaECidadaniaSerializer
-from sapl.sessao.models import SessaoPlenaria, ExpedienteSessao
+from drfautoapi.drfautoapi import (ApiViewSetConstrutor, customize,
+ wrapper_queryset_response_for_drf_action)
+from sapl.api.serializers import (ChoiceSerializer,
+ SessaoPlenariaECidadaniaSerializer)
+from sapl.sessao.models import ExpedienteSessao, SessaoPlenaria
from sapl.utils import choice_anos_com_sessaoplenaria
-
-ApiViewSetConstrutor.build_class(
- [
- apps.get_app_config('sessao')
- ]
-)
+ApiViewSetConstrutor.build_class([apps.get_app_config("sessao")])
@customize(SessaoPlenaria)
class _SessaoPlenariaViewSet:
-
@action(detail=False)
def years(self, request, *args, **kwargs):
years = choice_anos_com_sessaoplenaria()
@@ -34,14 +27,14 @@ class _SessaoPlenariaViewSet:
@wrapper_queryset_response_for_drf_action(model=ExpedienteSessao)
def get_expedientes(self):
- return self.get_queryset().filter(sessao_plenaria_id=self.kwargs['pk'])
+ return self.get_queryset().filter(sessao_plenaria_id=self.kwargs["pk"])
@action(detail=True)
def ecidadania(self, request, *args, **kwargs):
self.serializer_class = SessaoPlenariaECidadaniaSerializer
return self.retrieve(request, *args, **kwargs)
- @action(detail=False, url_path='ecidadania')
+ @action(detail=False, url_path="ecidadania")
def ecidadania_list(self, request, *args, **kwargs):
self.serializer_class = SessaoPlenariaECidadaniaSerializer
return self.list(request, *args, **kwargs)
diff --git a/sapl/audiencia/apps.py b/sapl/audiencia/apps.py
index 148d4ac5b..fc006b948 100644
--- a/sapl/audiencia/apps.py
+++ b/sapl/audiencia/apps.py
@@ -3,6 +3,6 @@ from django.utils.translation import gettext_lazy as _
class AppConfig(apps.AppConfig):
- name = 'sapl.audiencia'
- label = 'audiencia'
- verbose_name = _('Audiência Pública')
\ No newline at end of file
+ name = "sapl.audiencia"
+ label = "audiencia"
+ verbose_name = _("Audiência Pública")
diff --git a/sapl/audiencia/forms.py b/sapl/audiencia/forms.py
index 9629ccf40..8614393f6 100755
--- a/sapl/audiencia/forms.py
+++ b/sapl/audiencia/forms.py
@@ -1,19 +1,19 @@
import logging
-
from datetime import datetime
+from crispy_forms.layout import HTML, Button, Column, Fieldset, Layout
from django import forms
from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import transaction
from django.utils.translation import gettext_lazy as _
-from crispy_forms.layout import Button, Column, Fieldset, HTML, Layout
-
-from sapl.audiencia.models import AudienciaPublica, TipoAudienciaPublica, AnexoAudienciaPublica
-from sapl.crispy_layout_mixin import form_actions, SaplFormHelper, SaplFormLayout, to_row
+from sapl.audiencia.models import (AnexoAudienciaPublica, AudienciaPublica,
+ TipoAudienciaPublica)
+from sapl.crispy_layout_mixin import (SaplFormHelper, SaplFormLayout,
+ form_actions, to_row)
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
from sapl.parlamentares.models import Parlamentar
-from sapl.utils import timezone, FileFieldCheckMixin, validar_arquivo
+from sapl.utils import FileFieldCheckMixin, timezone, validar_arquivo
class AudienciaForm(FileFieldCheckMixin, forms.ModelForm):
@@ -22,57 +22,83 @@ class AudienciaForm(FileFieldCheckMixin, forms.ModelForm):
tipo = forms.ModelChoiceField(
required=True,
- label=_('Tipo de Audiência Pública'),
- queryset=TipoAudienciaPublica.objects.all().order_by('nome'))
+ label=_("Tipo de Audiência Pública"),
+ queryset=TipoAudienciaPublica.objects.all().order_by("nome"),
+ )
tipo_materia = forms.ModelChoiceField(
- label=_('Tipo Matéria'),
+ label=_("Tipo Matéria"),
required=False,
queryset=TipoMateriaLegislativa.objects.all(),
- empty_label=_('Selecione'))
+ empty_label=_("Selecione"),
+ )
- numero_materia = forms.CharField(
- label=_('Número Matéria'),
- required=False)
+ numero_materia = forms.CharField(label=_("Número Matéria"), required=False)
- ano_materia = forms.CharField(
- label=_('Ano Matéria'),
- required=False)
+ ano_materia = forms.CharField(label=_("Ano Matéria"), required=False)
materia = forms.ModelChoiceField(
required=False,
widget=forms.HiddenInput(),
- queryset=MateriaLegislativa.objects.all())
+ queryset=MateriaLegislativa.objects.all(),
+ )
parlamentar_autor = forms.ModelChoiceField(
- label=_("Parlamentar Autor"),
- required=False,
- queryset=Parlamentar.objects.all())
+ label=_("Parlamentar Autor"), required=False, queryset=Parlamentar.objects.all()
+ )
requerimento = forms.ModelChoiceField(
label=_("Requerimento"),
required=False,
- queryset=MateriaLegislativa.objects.select_related("tipo").filter(tipo__descricao="Requerimento"))
+ queryset=MateriaLegislativa.objects.select_related("tipo").filter(
+ tipo__descricao="Requerimento"
+ ),
+ )
class Meta:
model = AudienciaPublica
- fields = ['tipo', 'numero', 'ano', 'nome',
- 'tema', 'data', 'hora_inicio', 'hora_fim',
- 'observacao', 'audiencia_cancelada', 'parlamentar_autor', 'requerimento', 'url_audio',
- 'url_video', 'upload_pauta', 'upload_ata',
- 'upload_anexo', 'tipo_materia', 'numero_materia',
- 'ano_materia', 'materia']
+ fields = [
+ "tipo",
+ "numero",
+ "ano",
+ "nome",
+ "tema",
+ "data",
+ "hora_inicio",
+ "hora_fim",
+ "observacao",
+ "audiencia_cancelada",
+ "parlamentar_autor",
+ "requerimento",
+ "url_audio",
+ "url_video",
+ "upload_pauta",
+ "upload_ata",
+ "upload_anexo",
+ "tipo_materia",
+ "numero_materia",
+ "ano_materia",
+ "materia",
+ ]
def __init__(self, **kwargs):
super(AudienciaForm, self).__init__(**kwargs)
tipos = []
- if not self.fields['tipo'].queryset:
- tipos.append(TipoAudienciaPublica.objects.create(nome='Audiência Pública', tipo='A'))
- tipos.append(TipoAudienciaPublica.objects.create(nome='Plebiscito', tipo='P'))
- tipos.append(TipoAudienciaPublica.objects.create(nome='Referendo', tipo='R'))
- tipos.append(TipoAudienciaPublica.objects.create(nome='Iniciativa Popular', tipo='I'))
+ if not self.fields["tipo"].queryset:
+ tipos.append(
+ TipoAudienciaPublica.objects.create(nome="Audiência Pública", tipo="A")
+ )
+ tipos.append(
+ TipoAudienciaPublica.objects.create(nome="Plebiscito", tipo="P")
+ )
+ tipos.append(
+ TipoAudienciaPublica.objects.create(nome="Referendo", tipo="R")
+ )
+ tipos.append(
+ TipoAudienciaPublica.objects.create(nome="Iniciativa Popular", tipo="I")
+ )
for t in tipos:
t.save()
@@ -82,95 +108,125 @@ class AudienciaForm(FileFieldCheckMixin, forms.ModelForm):
if not self.is_valid():
return cleaned_data
- materia = cleaned_data['numero_materia']
- ano_materia = cleaned_data['ano_materia']
- tipo_materia = cleaned_data['tipo_materia']
+ materia = cleaned_data["numero_materia"]
+ ano_materia = cleaned_data["ano_materia"]
+ tipo_materia = cleaned_data["tipo_materia"]
parlamentar_autor = cleaned_data["parlamentar_autor"]
requerimento = cleaned_data["requerimento"]
if cleaned_data["ano"] != cleaned_data["data"].year:
- raise ValidationError(f"Ano da audiência ({cleaned_data['ano']}) difere "
- f"do ano no campo data ({cleaned_data['data'].year})")
+ raise ValidationError(
+ f"Ano da audiência ({cleaned_data['ano']}) difere "
+ f"do ano no campo data ({cleaned_data['data'].year})"
+ )
#
# TODO: converter hora_inicio e hora_fim para TimeField
#
# valida hora inicio
try:
- datetime.strptime(cleaned_data["hora_inicio"], '%H:%M').time()
+ datetime.strptime(cleaned_data["hora_inicio"], "%H:%M").time()
except ValueError:
- raise ValidationError(f"Formato de horário de início inválido: {cleaned_data['hora_inicio']}")
+ raise ValidationError(
+ f"Formato de horário de início inválido: {cleaned_data['hora_inicio']}"
+ )
# valida hora fim
if cleaned_data["hora_fim"]:
try:
- datetime.strptime(cleaned_data["hora_fim"], '%H:%M').time()
+ datetime.strptime(cleaned_data["hora_fim"], "%H:%M").time()
except ValueError:
- raise ValidationError(f"Formato de horário de fim inválido: {cleaned_data['hora_fim']}")
+ raise ValidationError(
+ f"Formato de horário de fim inválido: {cleaned_data['hora_fim']}"
+ )
if materia and ano_materia and tipo_materia:
try:
- self.logger.debug("Tentando obter MateriaLegislativa %s nº %s/%s." % (tipo_materia, materia, ano_materia))
+ self.logger.debug(
+ "Tentando obter MateriaLegislativa %s nº %s/%s."
+ % (tipo_materia, materia, ano_materia)
+ )
materia = MateriaLegislativa.objects.get(
- numero=materia,
- ano=ano_materia,
- tipo=tipo_materia)
+ numero=materia, ano=ano_materia, tipo=tipo_materia
+ )
except ObjectDoesNotExist:
- msg = _('A matéria %s nº %s/%s não existe no cadastro'
- ' de matérias legislativas.' % (tipo_materia, materia, ano_materia))
+ msg = _(
+ "A matéria %s nº %s/%s não existe no cadastro"
+ " de matérias legislativas." % (tipo_materia, materia, ano_materia)
+ )
self.logger.warning(
- 'A MateriaLegislativa %s nº %s/%s não existe no cadastro'
- ' de matérias legislativas.' % (tipo_materia, materia, ano_materia)
+ "A MateriaLegislativa %s nº %s/%s não existe no cadastro"
+ " de matérias legislativas." % (tipo_materia, materia, ano_materia)
)
raise ValidationError(msg)
else:
- self.logger.info("MateriaLegislativa %s nº %s/%s obtida com sucesso." % (tipo_materia, materia, ano_materia))
- cleaned_data['materia'] = materia
+ self.logger.info(
+ "MateriaLegislativa %s nº %s/%s obtida com sucesso."
+ % (tipo_materia, materia, ano_materia)
+ )
+ cleaned_data["materia"] = materia
else:
campos = [materia, tipo_materia, ano_materia]
- if campos.count(None) + campos.count('') < len(campos):
- msg = _('Preencha todos os campos relacionados à Matéria Legislativa')
+ if campos.count(None) + campos.count("") < len(campos):
+ msg = _("Preencha todos os campos relacionados à Matéria Legislativa")
self.logger.warning(
- 'Algum campo relacionado à MatériaLegislativa %s nº %s/%s \
- não foi preenchido.' % (tipo_materia, materia, ano_materia)
+ "Algum campo relacionado à MatériaLegislativa %s nº %s/%s \
+ não foi preenchido."
+ % (tipo_materia, materia, ano_materia)
)
raise ValidationError(msg)
- if not cleaned_data['numero']:
- ultima_audiencia = AudienciaPublica.objects.all().order_by('ano', 'numero').last()
+ if not cleaned_data["numero"]:
+ ultima_audiencia = (
+ AudienciaPublica.objects.all().order_by("ano", "numero").last()
+ )
if ultima_audiencia:
- cleaned_data['numero'] = ultima_audiencia.numero + 1
+ cleaned_data["numero"] = ultima_audiencia.numero + 1
else:
- cleaned_data['numero'] = 1
+ cleaned_data["numero"] = 1
else:
- if AudienciaPublica.objects.filter(numero=cleaned_data['numero'], ano=cleaned_data['ano']).exclude(pk=self.instance.pk).exists():
- raise ValidationError(f"Já existe uma audiência pública com a numeração {str(cleaned_data['numero']).rjust(3, '0')}/{cleaned_data['ano']}.")
+ if (
+ AudienciaPublica.objects.filter(
+ numero=cleaned_data["numero"], ano=cleaned_data["ano"]
+ )
+ .exclude(pk=self.instance.pk)
+ .exists()
+ ):
+ raise ValidationError(
+ f"Já existe uma audiência pública com a numeração {str(cleaned_data['numero']).rjust(3, '0')}/{cleaned_data['ano']}."
+ )
- if self.cleaned_data['hora_inicio'] and self.cleaned_data['hora_fim']:
- if self.cleaned_data['hora_fim'] < self.cleaned_data['hora_inicio']:
- msg = _('A hora de fim ({}) não pode ser anterior a hora de início({})'
- .format(self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio']))
- self.logger.warning(
- 'Hora de fim anterior à hora de início.'
+ if self.cleaned_data["hora_inicio"] and self.cleaned_data["hora_fim"]:
+ if self.cleaned_data["hora_fim"] < self.cleaned_data["hora_inicio"]:
+ msg = _(
+ "A hora de fim ({}) não pode ser anterior a hora de início({})".format(
+ self.cleaned_data["hora_fim"], self.cleaned_data["hora_inicio"]
+ )
)
+ self.logger.warning("Hora de fim anterior à hora de início.")
raise ValidationError(msg)
# requerimento é optativo
if parlamentar_autor and requerimento:
if parlamentar_autor.autor.first() not in requerimento.autores.all():
- raise ValidationError("Parlamentar Autor selecionado não faz"
- " parte da autoria do Requerimento "
- "selecionado.")
+ raise ValidationError(
+ "Parlamentar Autor selecionado não faz"
+ " parte da autoria do Requerimento "
+ "selecionado."
+ )
elif parlamentar_autor:
- raise ValidationError("Para informar um autor deve-se informar um requerimento.")
+ raise ValidationError(
+ "Para informar um autor deve-se informar um requerimento."
+ )
elif requerimento:
- raise ValidationError("Para informar um requerimento deve-se informar um autor.")
+ raise ValidationError(
+ "Para informar um requerimento deve-se informar um autor."
+ )
-
- upload_pauta = self.cleaned_data.get('upload_pauta', False)
- upload_ata = self.cleaned_data.get('upload_ata', False)
- upload_anexo = self.cleaned_data.get('upload_anexo', False)
+ upload_pauta = self.cleaned_data.get("upload_pauta", False)
+ upload_ata = self.cleaned_data.get("upload_ata", False)
+ upload_anexo = self.cleaned_data.get("upload_anexo", False)
if upload_pauta:
validar_arquivo(upload_pauta, "Pauta da Audiência Pública")
@@ -185,26 +241,20 @@ class AudienciaForm(FileFieldCheckMixin, forms.ModelForm):
class AnexoAudienciaPublicaForm(forms.ModelForm):
-
class Meta:
model = AnexoAudienciaPublica
- fields = ['arquivo',
- 'assunto']
+ fields = ["arquivo", "assunto"]
def __init__(self, *args, **kwargs):
+ row1 = to_row([("arquivo", 4)])
- row1 = to_row(
- [('arquivo', 4)])
-
- row2 = to_row(
- [('assunto', 12)])
+ row2 = to_row([("assunto", 12)])
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- Fieldset(_('Identificação Básica'),
- row1, row2))
- super(AnexoAudienciaPublicaForm, self).__init__(
- *args, **kwargs)
+ Fieldset(_("Identificação Básica"), row1, row2)
+ )
+ super(AnexoAudienciaPublicaForm, self).__init__(*args, **kwargs)
def clean(self):
super(AnexoAudienciaPublicaForm, self).clean()
@@ -212,7 +262,7 @@ class AnexoAudienciaPublicaForm(forms.ModelForm):
if not self.is_valid():
return self.cleaned_data
- arquivo = self.cleaned_data.get('arquivo', False)
+ arquivo = self.cleaned_data.get("arquivo", False)
if arquivo:
validar_arquivo(arquivo, "Arquivo")
diff --git a/sapl/audiencia/models.py b/sapl/audiencia/models.py
index 1b265140c..0014b05c5 100755
--- a/sapl/audiencia/models.py
+++ b/sapl/audiencia/models.py
@@ -2,130 +2,147 @@ from django.db import models
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from model_utils import Choices
-from sapl.materia.models import MateriaLegislativa
-from sapl.parlamentares.models import (CargoMesa, Parlamentar)
-from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, SaplGenericRelation,
- restringe_tipos_de_arquivo_txt, texto_upload_path,
- OverwriteStorage)
+from sapl.materia.models import MateriaLegislativa
+from sapl.parlamentares.models import CargoMesa, Parlamentar
+from sapl.utils import (RANGE_ANOS, YES_NO_CHOICES, OverwriteStorage,
+ SaplGenericRelation, restringe_tipos_de_arquivo_txt,
+ texto_upload_path)
def get_audiencia_media_path(instance, subpath, filename):
- return './sapl/audiencia/%s/%s/%s' % (instance.numero, subpath, filename)
+ return "./sapl/audiencia/%s/%s/%s" % (instance.numero, subpath, filename)
def pauta_upload_path(instance, filename):
- return texto_upload_path(
- instance, filename, subpath='pauta', pk_first=True)
+ return texto_upload_path(instance, filename, subpath="pauta", pk_first=True)
def ata_upload_path(instance, filename):
- return texto_upload_path(instance, filename, subpath='ata', pk_first=True)
+ return texto_upload_path(instance, filename, subpath="ata", pk_first=True)
def anexo_upload_path(instance, filename):
- return texto_upload_path(
- instance, filename, subpath='anexo', pk_first=True)
+ return texto_upload_path(instance, filename, subpath="anexo", pk_first=True)
class TipoAudienciaPublica(models.Model):
- TIPO_AUDIENCIA_CHOICES = Choices(('A', 'audiencia', _('Audiência Pública')),
- ('P', 'plebiscito', _('Plebiscito')),
- ('R', 'referendo', _('Referendo')),
- ('I', 'iniciativa', _('Iniciativa Popular')))
+ TIPO_AUDIENCIA_CHOICES = Choices(
+ ("A", "audiencia", _("Audiência Pública")),
+ ("P", "plebiscito", _("Plebiscito")),
+ ("R", "referendo", _("Referendo")),
+ ("I", "iniciativa", _("Iniciativa Popular")),
+ )
nome = models.CharField(
- max_length=50, verbose_name=_('Nome do Tipo de Audiência Pública'), default='Audiência Pública')
+ max_length=50,
+ verbose_name=_("Nome do Tipo de Audiência Pública"),
+ default="Audiência Pública",
+ )
tipo = models.CharField(
- max_length=1, verbose_name=_('Tipo de Audiência Pública'), choices=TIPO_AUDIENCIA_CHOICES, default='A')
+ max_length=1,
+ verbose_name=_("Tipo de Audiência Pública"),
+ choices=TIPO_AUDIENCIA_CHOICES,
+ default="A",
+ )
class Meta:
- verbose_name = _('Tipo de Audiência Pública')
- verbose_name_plural = _('Tipos de Audiência Pública')
- ordering = ['nome']
+ verbose_name = _("Tipo de Audiência Pública")
+ verbose_name_plural = _("Tipos de Audiência Pública")
+ ordering = ["nome"]
def __str__(self):
return self.nome
class AudienciaPublica(models.Model):
-
materia = models.ForeignKey(
MateriaLegislativa,
on_delete=models.PROTECT,
null=True,
blank=True,
- verbose_name=_('Matéria Legislativa'))
- tipo = models.ForeignKey(TipoAudienciaPublica,
- on_delete=models.PROTECT,
- null=True,
- blank=True,
- verbose_name=_('Tipo de Audiência Pública'))
- numero = models.PositiveIntegerField(blank=True, verbose_name=_('Número'))
- ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'),
- choices=RANGE_ANOS)
- nome = models.CharField(
- max_length=100, verbose_name=_('Nome da Audiência Pública'))
- tema = models.CharField(
- max_length=100, verbose_name=_('Tema da Audiência Pública'))
- data = models.DateField(verbose_name=_('Data'))
+ verbose_name=_("Matéria Legislativa"),
+ )
+ tipo = models.ForeignKey(
+ TipoAudienciaPublica,
+ on_delete=models.PROTECT,
+ null=True,
+ blank=True,
+ verbose_name=_("Tipo de Audiência Pública"),
+ )
+ numero = models.PositiveIntegerField(blank=True, verbose_name=_("Número"))
+ ano = models.PositiveSmallIntegerField(verbose_name=_("Ano"), choices=RANGE_ANOS)
+ nome = models.CharField(max_length=100, verbose_name=_("Nome da Audiência Pública"))
+ tema = models.CharField(max_length=100, verbose_name=_("Tema da Audiência Pública"))
+ data = models.DateField(verbose_name=_("Data"))
hora_inicio = models.CharField(
- max_length=5, verbose_name=_('Horário Início(hh:mm)'))
+ max_length=5, verbose_name=_("Horário Início(hh:mm)")
+ )
hora_fim = models.CharField(
- max_length=5, blank=True, verbose_name=_('Horário Fim(hh:mm)'))
+ max_length=5, blank=True, verbose_name=_("Horário Fim(hh:mm)")
+ )
observacao = models.TextField(
- max_length=500, blank=True, verbose_name=_('Observação'))
+ max_length=500, blank=True, verbose_name=_("Observação")
+ )
audiencia_cancelada = models.BooleanField(
- default=False,
- choices=YES_NO_CHOICES,
- verbose_name=_('Audiência Cancelada?'))
+ default=False, choices=YES_NO_CHOICES, verbose_name=_("Audiência Cancelada?")
+ )
parlamentar_autor = models.ForeignKey(
Parlamentar,
on_delete=models.PROTECT,
null=True,
blank=True,
- verbose_name=_('Parlamentar Autor'))
+ verbose_name=_("Parlamentar Autor"),
+ )
requerimento = models.ForeignKey(
MateriaLegislativa,
null=True,
blank=True,
on_delete=models.PROTECT,
- verbose_name=_('Requerimento da Audiência Pública'),
- related_name=_('requerimento'))
+ verbose_name=_("Requerimento da Audiência Pública"),
+ related_name=_("requerimento"),
+ )
url_audio = models.URLField(
- max_length=150, blank=True,
- verbose_name=_('URL Arquivo Áudio (Formatos MP3 / AAC)'))
+ max_length=150,
+ blank=True,
+ verbose_name=_("URL Arquivo Áudio (Formatos MP3 / AAC)"),
+ )
url_video = models.URLField(
- max_length=150, blank=True,
- verbose_name=_('URL Arquivo Vídeo (Formatos MP4 / FLV / WebM)'))
+ max_length=150,
+ blank=True,
+ verbose_name=_("URL Arquivo Vídeo (Formatos MP4 / FLV / WebM)"),
+ )
upload_pauta = models.FileField(
max_length=300,
blank=True,
null=True,
upload_to=pauta_upload_path,
storage=OverwriteStorage(),
- verbose_name=_('Pauta da Audiência Pública'),
- validators=[restringe_tipos_de_arquivo_txt])
+ verbose_name=_("Pauta da Audiência Pública"),
+ validators=[restringe_tipos_de_arquivo_txt],
+ )
upload_ata = models.FileField(
max_length=300,
blank=True,
null=True,
upload_to=ata_upload_path,
- verbose_name=_('Ata da Audiência Pública'),
+ verbose_name=_("Ata da Audiência Pública"),
storage=OverwriteStorage(),
- validators=[restringe_tipos_de_arquivo_txt])
+ validators=[restringe_tipos_de_arquivo_txt],
+ )
upload_anexo = models.FileField(
max_length=300,
blank=True,
null=True,
upload_to=anexo_upload_path,
storage=OverwriteStorage(),
- verbose_name=_('Anexo da Audiência Pública'))
+ verbose_name=_("Anexo da Audiência Pública"),
+ )
class Meta:
- verbose_name = _('Audiência Pública')
- verbose_name_plural = _('Audiências Públicas')
- ordering = ['ano', 'numero', 'nome', 'tipo']
+ verbose_name = _("Audiência Pública")
+ verbose_name_plural = _("Audiências Públicas")
+ ordering = ["ano", "numero", "nome", "tipo"]
def __str__(self):
return self.nome
@@ -148,49 +165,52 @@ class AudienciaPublica(models.Model):
return result
- def save(self, force_insert=False, force_update=False, using=None,
- update_fields=None):
-
- if not self.pk and (self.upload_pauta or self.upload_ata or
- self.upload_anexo):
+ def save(
+ self, force_insert=False, force_update=False, using=None, update_fields=None
+ ):
+ if not self.pk and (self.upload_pauta or self.upload_ata or self.upload_anexo):
upload_pauta = self.upload_pauta
upload_ata = self.upload_ata
upload_anexo = self.upload_anexo
self.upload_pauta = None
self.upload_ata = None
self.upload_anexo = None
- models.Model.save(self, force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields)
+ models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
self.upload_pauta = upload_pauta
self.upload_ata = upload_ata
self.upload_anexo = upload_anexo
- return models.Model.save(self, force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields)
+ return models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
class AnexoAudienciaPublica(models.Model):
- audiencia = models.ForeignKey(AudienciaPublica,
- on_delete=models.PROTECT)
+ audiencia = models.ForeignKey(AudienciaPublica, on_delete=models.PROTECT)
arquivo = models.FileField(
max_length=300,
upload_to=texto_upload_path,
storage=OverwriteStorage(),
- verbose_name=_('Arquivo'))
- data = models.DateField(
- auto_now=timezone.now)
- assunto = models.TextField(
- verbose_name=_('Assunto'))
+ verbose_name=_("Arquivo"),
+ )
+ data = models.DateField(auto_now=timezone.now)
+ assunto = models.TextField(verbose_name=_("Assunto"))
class Meta:
- verbose_name = _('Anexo de Documento Acessório')
- verbose_name_plural = _('Anexo de Documentos Acessórios')
- ordering = ('id',)
+ verbose_name = _("Anexo de Documento Acessório")
+ verbose_name_plural = _("Anexo de Documentos Acessórios")
+ ordering = ("id",)
def __str__(self):
return self.assunto
@@ -204,7 +224,9 @@ class AnexoAudienciaPublica(models.Model):
return result
- def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
+ def save(
+ self, force_insert=False, force_update=False, using=None, update_fields=None
+ ):
if not self.pk and self.arquivo:
arquivo = self.arquivo
self.arquivo = None
@@ -213,8 +235,14 @@ class AnexoAudienciaPublica(models.Model):
force_insert=force_insert,
force_update=force_update,
using=using,
- update_fields=update_fields)
+ update_fields=update_fields,
+ )
self.arquivo = arquivo
- return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using,
- update_fields=update_fields)
+ return models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
diff --git a/sapl/audiencia/tests/test_audiencia.py b/sapl/audiencia/tests/test_audiencia.py
index 62aae2b0b..8274c7fb3 100644
--- a/sapl/audiencia/tests/test_audiencia.py
+++ b/sapl/audiencia/tests/test_audiencia.py
@@ -1,57 +1,59 @@
-import pytest
import datetime
-from model_bakery import baker
+
+import pytest
from django.utils.translation import gettext as _
+from model_bakery import baker
from sapl.audiencia import forms
-from sapl.audiencia.models import AnexoAudienciaPublica
-from sapl.audiencia.models import TipoAudienciaPublica, AudienciaPublica
+from sapl.audiencia.models import (AnexoAudienciaPublica, AudienciaPublica,
+ TipoAudienciaPublica)
from sapl.materia.models import MateriaLegislativa, TipoMateriaLegislativa
@pytest.mark.django_db(transaction=False)
def test_tipo_audiencia_publica_model():
- baker.make(TipoAudienciaPublica,
- nome='Teste_Nome_Tipo_Audiencia_Publica',
- tipo='A')
+ baker.make(TipoAudienciaPublica, nome="Teste_Nome_Tipo_Audiencia_Publica", tipo="A")
tipo_audiencia_publica = TipoAudienciaPublica.objects.first()
- assert tipo_audiencia_publica.nome == 'Teste_Nome_Tipo_Audiencia_Publica'
- assert tipo_audiencia_publica.tipo == 'A'
+ assert tipo_audiencia_publica.nome == "Teste_Nome_Tipo_Audiencia_Publica"
+ assert tipo_audiencia_publica.tipo == "A"
@pytest.mark.django_db(transaction=False)
def test_audiencia_publica_model():
- baker.make(AudienciaPublica,
- numero=1,
- nome='Teste_Nome_Audiencia_Publica',
- tema='Teste_Tema_Audiencia_Publica',
- data='2016-03-21',
- hora_inicio='16:03')
+ baker.make(
+ AudienciaPublica,
+ numero=1,
+ nome="Teste_Nome_Audiencia_Publica",
+ tema="Teste_Tema_Audiencia_Publica",
+ data="2016-03-21",
+ hora_inicio="16:03",
+ )
audiencia_publica = AudienciaPublica.objects.first()
- data = '2016-03-21'
+ data = "2016-03-21"
teste_data = datetime.datetime.strptime(data, "%Y-%m-%d").date()
assert audiencia_publica.numero == 1
- assert audiencia_publica.nome == 'Teste_Nome_Audiencia_Publica'
- assert audiencia_publica.tema == 'Teste_Tema_Audiencia_Publica'
+ assert audiencia_publica.nome == "Teste_Nome_Audiencia_Publica"
+ assert audiencia_publica.tema == "Teste_Tema_Audiencia_Publica"
assert audiencia_publica.data == teste_data
- assert audiencia_publica.hora_inicio == '16:03'
+ assert audiencia_publica.hora_inicio == "16:03"
@pytest.mark.django_db(transaction=False)
def test_anexo_audiencia_publica_model():
- audiencia = baker.make(AudienciaPublica,
- numero=2,
- nome='Nome_Audiencia_Publica',
- tema='Tema_Audiencia_Publica',
- data='2017-04-22',
- hora_inicio='17:04')
+ audiencia = baker.make(
+ AudienciaPublica,
+ numero=2,
+ nome="Nome_Audiencia_Publica",
+ tema="Tema_Audiencia_Publica",
+ data="2017-04-22",
+ hora_inicio="17:04",
+ )
- baker.make(AnexoAudienciaPublica,
- audiencia=audiencia)
+ baker.make(AnexoAudienciaPublica, audiencia=audiencia)
anexo_audiencia_publica = AnexoAudienciaPublica.objects.first()
assert anexo_audiencia_publica.audiencia == audiencia
@@ -65,11 +67,11 @@ def test_valida_campos_obrigatorios_audiencia_form():
errors = form.errors
- assert errors['nome'] == [_('Este campo é obrigatório.')]
- assert errors['tema'] == [_('Este campo é obrigatório.')]
- assert errors['tipo'] == [_('Este campo é obrigatório.')]
- assert errors['data'] == [_('Este campo é obrigatório.')]
- assert errors['hora_inicio'] == [_('Este campo é obrigatório.')]
+ assert errors["nome"] == [_("Este campo é obrigatório.")]
+ assert errors["tema"] == [_("Este campo é obrigatório.")]
+ assert errors["tipo"] == [_("Este campo é obrigatório.")]
+ assert errors["data"] == [_("Este campo é obrigatório.")]
+ assert errors["hora_inicio"] == [_("Este campo é obrigatório.")]
assert len(errors) == 6
@@ -80,11 +82,14 @@ def test_audiencia_form_hora_invalida():
tipo = baker.make(TipoAudienciaPublica)
- form = forms.AudienciaForm(data={'nome': 'Nome da Audiencia',
- 'tema': 'Tema da Audiencia',
- 'tipo': tipo,
- 'data': '2016-10-01',
- 'hora_inicio': '10:00',
- 'hora_fim': '9:00',
- })
+ form = forms.AudienciaForm(
+ data={
+ "nome": "Nome da Audiencia",
+ "tema": "Tema da Audiencia",
+ "tipo": tipo,
+ "data": "2016-10-01",
+ "hora_inicio": "10:00",
+ "hora_fim": "9:00",
+ }
+ )
assert not form.is_valid()
diff --git a/sapl/audiencia/urls.py b/sapl/audiencia/urls.py
index 94064b9e9..486e9b2d0 100755
--- a/sapl/audiencia/urls.py
+++ b/sapl/audiencia/urls.py
@@ -1,10 +1,15 @@
from django.urls import include, path
-from sapl.audiencia.views import (index, AudienciaCrud, AnexoAudienciaPublicaCrud)
+
+from sapl.audiencia.views import (AnexoAudienciaPublicaCrud, AudienciaCrud,
+ index)
from .apps import AppConfig
app_name = AppConfig.name
urlpatterns = [
- path('audiencia/', include(AudienciaCrud.get_urls() + AnexoAudienciaPublicaCrud.get_urls())),
-]
\ No newline at end of file
+ path(
+ "audiencia/",
+ include(AudienciaCrud.get_urls() + AnexoAudienciaPublicaCrud.get_urls()),
+ ),
+]
diff --git a/sapl/audiencia/views.py b/sapl/audiencia/views.py
index 443fc81e8..5cf8cb3f6 100755
--- a/sapl/audiencia/views.py
+++ b/sapl/audiencia/views.py
@@ -1,13 +1,13 @@
-import sapl
-
from django.http import HttpResponse
from django.urls import reverse
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.generic import UpdateView
+
+import sapl
from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, MasterDetailCrud
-from .forms import AudienciaForm, AnexoAudienciaPublicaForm
-from .models import AudienciaPublica, AnexoAudienciaPublica
+from .forms import AnexoAudienciaPublicaForm, AudienciaForm
+from .models import AnexoAudienciaPublica, AudienciaPublica
def index(request):
@@ -16,11 +16,14 @@ def index(request):
class AudienciaCrud(Crud):
model = AudienciaPublica
- public = [RP_LIST, RP_DETAIL, ]
+ public = [
+ RP_LIST,
+ RP_DETAIL,
+ ]
class BaseMixin(Crud.BaseMixin):
- list_field_names = ['numero', 'nome', 'tipo', 'materia', 'data']
- ordering = '-ano', '-numero', '-data', 'nome', 'tipo'
+ list_field_names = ["numero", "nome", "tipo", "materia", "data"]
+ ordering = "-ano", "-numero", "-data", "nome", "tipo"
class ListView(Crud.ListView):
paginate_by = 10
@@ -28,20 +31,32 @@ class AudienciaCrud(Crud):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- audiencia_materia = {str(a.id): (a.materia, a.numero, a.ano) for a in context['object_list']}
-
- for row in context['rows']:
- audiencia_id = row[0][1].split('/')[-1]
- tema = str(audiencia_materia[audiencia_id][1]).rjust(3, '0') + '/' + str(audiencia_materia[audiencia_id][2])
+ audiencia_materia = {
+ str(a.id): (a.materia, a.numero, a.ano) for a in context["object_list"]
+ }
+
+ for row in context["rows"]:
+ audiencia_id = row[0][1].split("/")[-1]
+ tema = (
+ str(audiencia_materia[audiencia_id][1]).rjust(3, "0")
+ + "/"
+ + str(audiencia_materia[audiencia_id][2])
+ )
row[0] = (tema, row[0][1])
- coluna_materia = row[3] # Se mudar a ordem de listagem, mudar aqui.
+ coluna_materia = row[3] # Se mudar a ordem de listagem, mudar aqui.
if coluna_materia[0]:
materia = audiencia_materia[audiencia_id][0]
if materia is not None:
- url_materia = reverse('sapl.materia:materialegislativa_detail', kwargs={'pk': materia.id})
+ url_materia = reverse(
+ "sapl.materia:materialegislativa_detail",
+ kwargs={"pk": materia.id},
+ )
else:
url_materia = None
- row[3] = (coluna_materia[0], url_materia) # Se mudar a ordem de listagem, mudar aqui.
+ row[3] = (
+ coluna_materia[0],
+ url_materia,
+ ) # Se mudar a ordem de listagem, mudar aqui.
return context
class CreateView(Crud.CreateView):
@@ -56,17 +71,16 @@ class AudienciaCrud(Crud):
def get_initial(self):
initial = super(UpdateView, self).get_initial()
if self.object.materia:
- initial['tipo_materia'] = self.object.materia.tipo.id
- initial['numero_materia'] = self.object.materia.numero
- initial['ano_materia'] = self.object.materia.ano
+ initial["tipo_materia"] = self.object.materia.tipo.id
+ initial["numero_materia"] = self.object.materia.numero
+ initial["ano_materia"] = self.object.materia.ano
return initial
-
+
class DeleteView(Crud.DeleteView):
pass
class DetailView(Crud.DetailView):
-
- layout_key = 'AudienciaPublicaDetail'
+ layout_key = "AudienciaPublicaDetail"
@xframe_options_exempt
def get(self, request, *args, **kwargs):
@@ -74,10 +88,9 @@ class AudienciaCrud(Crud):
class AudienciaPublicaMixin:
-
def has_permission(self):
app_config = sapl.base.models.AppConfig.objects.last()
- if app_config and app_config.documentos_administrativos == 'O':
+ if app_config and app_config.documentos_administrativos == "O":
return True
return super().has_permission()
@@ -85,12 +98,15 @@ class AudienciaPublicaMixin:
class AnexoAudienciaPublicaCrud(MasterDetailCrud):
model = AnexoAudienciaPublica
- parent_field = 'audiencia'
- help_topic = 'numeracao_docsacess'
- public = [RP_LIST, RP_DETAIL, ]
+ parent_field = "audiencia"
+ help_topic = "numeracao_docsacess"
+ public = [
+ RP_LIST,
+ RP_DETAIL,
+ ]
class BaseMixin(MasterDetailCrud.BaseMixin):
- list_field_names = ['assunto']
+ list_field_names = ["assunto"]
class CreateView(MasterDetailCrud.CreateView):
form_class = AnexoAudienciaPublicaForm
@@ -100,11 +116,10 @@ class AnexoAudienciaPublicaCrud(MasterDetailCrud):
form_class = AnexoAudienciaPublicaForm
class ListView(AudienciaPublicaMixin, MasterDetailCrud.ListView):
-
def get_queryset(self):
qs = super(MasterDetailCrud.ListView, self).get_queryset()
- kwargs = {self.crud.parent_field: self.kwargs['pk']}
- return qs.filter(**kwargs).order_by('-data', '-id')
+ kwargs = {self.crud.parent_field: self.kwargs["pk"]}
+ return qs.filter(**kwargs).order_by("-data", "-id")
class DetailView(AudienciaPublicaMixin, MasterDetailCrud.DetailView):
pass
diff --git a/sapl/base/admin.py b/sapl/base/admin.py
index 9289254b3..6c1bdb7cb 100644
--- a/sapl/base/admin.py
+++ b/sapl/base/admin.py
@@ -7,8 +7,8 @@ from sapl.utils import register_all_models_in_admin
register_all_models_in_admin(__name__)
-admin.site.site_title = 'Administração - SAPL'
-admin.site.site_header = 'Administração - SAPL'
+admin.site.site_title = "Administração - SAPL"
+admin.site.site_header = "Administração - SAPL"
class AuditLogAdmin(admin.ModelAdmin):
diff --git a/sapl/base/apps.py b/sapl/base/apps.py
index b362fbda3..685b4d835 100644
--- a/sapl/base/apps.py
+++ b/sapl/base/apps.py
@@ -1,12 +1,11 @@
-
import django
from django.utils.translation import gettext_lazy as _
class AppConfig(django.apps.AppConfig):
- name = 'sapl.base'
- label = 'base'
- verbose_name = _('Dados Básicos')
+ name = "sapl.base"
+ label = "base"
+ verbose_name = _("Dados Básicos")
def ready(self):
from sapl.base import receivers
diff --git a/sapl/base/email_utils.py b/sapl/base/email_utils.py
index 86a251079..f329451a1 100644
--- a/sapl/base/email_utils.py
+++ b/sapl/base/email_utils.py
@@ -1,71 +1,75 @@
-from datetime import datetime as dt
import logging
+from datetime import datetime as dt
from django.core.mail import EmailMultiAlternatives, get_connection, send_mail
-from django.urls import reverse
from django.template import Context, loader
+from django.urls import reverse
from django.utils import timezone
+from django.utils.translation import gettext_lazy as _
from sapl.base.models import CasaLegislativa
from sapl.materia.models import AcompanhamentoMateria
from sapl.protocoloadm.models import AcompanhamentoDocumento
from sapl.settings import EMAIL_SEND_USER
from sapl.utils import mail_service_configured
-from django.utils.translation import gettext_lazy as _
def load_email_templates(templates, context={}):
-
emails = []
for t in templates:
tpl = loader.get_template(t)
email = tpl.render(context)
if t.endswith(".html"):
- email = email.replace('\\n', '').replace('\r', '')
+ email = email.replace("\\n", "").replace("\r", "")
emails.append(email)
return emails
def enviar_emails(sender, recipients, messages):
- '''
- Recipients is a string list of email addresses
-
- Messages is an array of dicts of the form:
- {'recipient': 'address', # useless????
- 'subject': 'subject text',
- 'txt_message': 'text message',
- 'html_message': 'html message'
- }
- '''
+ """
+ Recipients is a string list of email addresses
+
+ Messages is an array of dicts of the form:
+ {'recipient': 'address', # useless????
+ 'subject': 'subject text',
+ 'txt_message': 'text message',
+ 'html_message': 'html message'
+ }
+ """
if len(messages) == 1:
# sends an email simultaneously to all recipients
- send_mail(messages[0]['subject'],
- messages[0]['txt_message'],
- sender,
- recipients,
- html_message=messages[0]['html_message'],
- fail_silently=False)
+ send_mail(
+ messages[0]["subject"],
+ messages[0]["txt_message"],
+ sender,
+ recipients,
+ html_message=messages[0]["html_message"],
+ fail_silently=False,
+ )
elif len(recipients) > len(messages):
- raise ValueError("Message list should have size 1 \
+ raise ValueError(
+ "Message list should have size 1 \
or equal recipient list size. \
- recipients: %s, messages: %s" % (recipients, messages)
- )
+ recipients: %s, messages: %s"
+ % (recipients, messages)
+ )
else:
# sends an email simultaneously to all reciepients
- for (d, m) in zip(recipients, messages):
- send_mail(m['subject'],
- m['txt_message'],
- sender,
- [d],
- html_message=m['html_message'],
- fail_silently=False)
-
+ for d, m in zip(recipients, messages):
+ send_mail(
+ m["subject"],
+ m["txt_message"],
+ sender,
+ [d],
+ html_message=m["html_message"],
+ fail_silently=False,
+ )
-def criar_email_confirmacao(base_url, casa_legislativa, doc_mat, tipo, hash_txt=''):
+def criar_email_confirmacao(base_url, casa_legislativa, doc_mat, tipo, hash_txt=""):
if not casa_legislativa:
raise ValueError("Casa Legislativa é obrigatória")
@@ -77,36 +81,44 @@ def criar_email_confirmacao(base_url, casa_legislativa, doc_mat, tipo, hash_txt=
raise ValueError(msg)
# FIXME i18n
- casa_nome = ("{} de {} - {}".format(casa_legislativa.nome,
- casa_legislativa.municipio,
- casa_legislativa.uf))
+ casa_nome = "{} de {} - {}".format(
+ casa_legislativa.nome, casa_legislativa.municipio, casa_legislativa.uf
+ )
if tipo == "materia":
- doc_mat_url = reverse('sapl.materia:materialegislativa_detail',
- kwargs={'pk': doc_mat.id})
- confirmacao_url = reverse('sapl.materia:acompanhar_confirmar',
- kwargs={'pk': doc_mat.id})
+ doc_mat_url = reverse(
+ "sapl.materia:materialegislativa_detail", kwargs={"pk": doc_mat.id}
+ )
+ confirmacao_url = reverse(
+ "sapl.materia:acompanhar_confirmar", kwargs={"pk": doc_mat.id}
+ )
ementa = doc_mat.ementa
autores = [autoria.autor.nome for autoria in doc_mat.autoria_set.all()]
else:
- doc_mat_url = reverse('sapl.protocoloadm:documentoadministrativo_detail',
- kwargs={'pk': doc_mat.id})
- confirmacao_url = reverse('sapl.protocoloadm:acompanhar_confirmar',
- kwargs={'pk': doc_mat.id})
+ doc_mat_url = reverse(
+ "sapl.protocoloadm:documentoadministrativo_detail",
+ kwargs={"pk": doc_mat.id},
+ )
+ confirmacao_url = reverse(
+ "sapl.protocoloadm:acompanhar_confirmar", kwargs={"pk": doc_mat.id}
+ )
ementa = doc_mat.assunto
autores = ""
- templates = load_email_templates(['email/acompanhar.txt',
- 'email/acompanhar.html'],
- {"casa_legislativa": casa_nome,
- "logotipo": casa_legislativa.logotipo,
- "descricao_materia": ementa,
- "autoria": autores,
- "hash_txt": hash_txt,
- "base_url": base_url,
- "materia": str(doc_mat),
- "materia_url": doc_mat_url,
- "confirmacao_url": confirmacao_url, })
+ templates = load_email_templates(
+ ["email/acompanhar.txt", "email/acompanhar.html"],
+ {
+ "casa_legislativa": casa_nome,
+ "logotipo": casa_legislativa.logotipo,
+ "descricao_materia": ementa,
+ "autoria": autores,
+ "hash_txt": hash_txt,
+ "base_url": base_url,
+ "materia": str(doc_mat),
+ "materia_url": doc_mat_url,
+ "confirmacao_url": confirmacao_url,
+ },
+ )
return templates
@@ -117,7 +129,7 @@ def do_envia_email_confirmacao(base_url, casa, tipo, doc_mat, destinatario):
if not mail_service_configured():
logger = logging.getLogger(__name__)
- logger.warning(_('Servidor de email não configurado.'))
+ logger.warning(_("Servidor de email não configurado."))
return
sender = EMAIL_SEND_USER
@@ -130,25 +142,29 @@ def do_envia_email_confirmacao(base_url, casa, tipo, doc_mat, destinatario):
messages = []
recipients = []
- email_texts = criar_email_confirmacao(base_url,
- casa,
- doc_mat,
- tipo,
- destinatario.hash,)
+ email_texts = criar_email_confirmacao(
+ base_url,
+ casa,
+ doc_mat,
+ tipo,
+ destinatario.hash,
+ )
recipients.append(destinatario.email)
- messages.append({
- 'recipient': destinatario.email,
- 'subject': subject,
- 'txt_message': email_texts[0],
- 'html_message': email_texts[1]
- })
+ messages.append(
+ {
+ "recipient": destinatario.email,
+ "subject": subject,
+ "txt_message": email_texts[0],
+ "html_message": email_texts[1],
+ }
+ )
enviar_emails(sender, recipients, messages)
-def criar_email_tramitacao(base_url, casa_legislativa, tipo, doc_mat, status,
- unidade_destino, hash_txt=''):
-
+def criar_email_tramitacao(
+ base_url, casa_legislativa, tipo, doc_mat, status, unidade_destino, hash_txt=""
+):
if not casa_legislativa:
raise ValueError("Casa Legislativa é obrigatória")
@@ -160,47 +176,50 @@ def criar_email_tramitacao(base_url, casa_legislativa, tipo, doc_mat, status,
raise ValueError(msg)
# FIXME i18n
- casa_nome = ("{} de {} - {}".format(casa_legislativa.nome,
- casa_legislativa.municipio,
- casa_legislativa.uf))
+ casa_nome = "{} de {} - {}".format(
+ casa_legislativa.nome, casa_legislativa.municipio, casa_legislativa.uf
+ )
if tipo == "materia":
- doc_mat_url = reverse('sapl.materia:tramitacao_list',
- kwargs={'pk': doc_mat.id})
- url_excluir = reverse('sapl.materia:acompanhar_excluir',
- kwargs={'pk': doc_mat.id})
+ doc_mat_url = reverse("sapl.materia:tramitacao_list", kwargs={"pk": doc_mat.id})
+ url_excluir = reverse(
+ "sapl.materia:acompanhar_excluir", kwargs={"pk": doc_mat.id}
+ )
ementa = doc_mat.ementa
autores = [autoria.autor.nome for autoria in doc_mat.autoria_set.all()]
- tramitacao = doc_mat.tramitacao_set.order_by('-data_tramitacao', '-id').first()
+ tramitacao = doc_mat.tramitacao_set.order_by("-data_tramitacao", "-id").first()
else:
- doc_mat_url = reverse('sapl.protocoloadm:tramitacaoadministrativo_list',
- kwargs={'pk': doc_mat.id})
- url_excluir = reverse('sapl.protocoloadm:acompanhar_excluir',
- kwargs={'pk': doc_mat.id})
+ doc_mat_url = reverse(
+ "sapl.protocoloadm:tramitacaoadministrativo_list", kwargs={"pk": doc_mat.id}
+ )
+ url_excluir = reverse(
+ "sapl.protocoloadm:acompanhar_excluir", kwargs={"pk": doc_mat.id}
+ )
autores = ""
ementa = doc_mat.assunto
tramitacao = doc_mat.tramitacaoadministrativo_set.last()
- templates = load_email_templates(['email/tramitacao.txt',
- 'email/tramitacao.html'],
- {"casa_legislativa": casa_nome,
- "data_registro": dt.strftime(
- timezone.now(),
- "%d/%m/%Y"),
- "cod_materia": doc_mat.id,
- "logotipo": casa_legislativa.logotipo,
- "descricao_materia": ementa,
- "autoria": autores,
- "data": tramitacao.data_tramitacao,
- "status": status,
- "localizacao": unidade_destino,
- "texto_acao": tramitacao.texto,
- "hash_txt": hash_txt,
- "materia": str(doc_mat),
- "base_url": base_url,
- "materia_url": doc_mat_url,
- "excluir_url": url_excluir})
+ templates = load_email_templates(
+ ["email/tramitacao.txt", "email/tramitacao.html"],
+ {
+ "casa_legislativa": casa_nome,
+ "data_registro": dt.strftime(timezone.now(), "%d/%m/%Y"),
+ "cod_materia": doc_mat.id,
+ "logotipo": casa_legislativa.logotipo,
+ "descricao_materia": ementa,
+ "autoria": autores,
+ "data": tramitacao.data_tramitacao,
+ "status": status,
+ "localizacao": unidade_destino,
+ "texto_acao": tramitacao.texto,
+ "hash_txt": hash_txt,
+ "materia": str(doc_mat),
+ "base_url": base_url,
+ "materia_url": doc_mat_url,
+ "excluir_url": url_excluir,
+ },
+ )
return templates
@@ -211,18 +230,20 @@ def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino):
logger = logging.getLogger(__name__)
if not mail_service_configured():
- logger.warning(_('Servidor de email não configurado.'))
+ logger.warning(_("Servidor de email não configurado."))
return
if tipo == "materia":
- destinatarios = AcompanhamentoMateria.objects.filter(materia=doc_mat,
- confirmado=True)
+ destinatarios = AcompanhamentoMateria.objects.filter(
+ materia=doc_mat, confirmado=True
+ )
else:
- destinatarios = AcompanhamentoDocumento.objects.filter(documento=doc_mat,
- confirmado=True)
+ destinatarios = AcompanhamentoDocumento.objects.filter(
+ documento=doc_mat, confirmado=True
+ )
if not destinatarios:
- logger.debug(_('Não existem destinatários cadastrados para essa matéria.'))
+ logger.debug(_("Não existem destinatários cadastrados para essa matéria."))
return
casa = CasaLegislativa.objects.first()
@@ -240,20 +261,23 @@ def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino):
for destinatario in destinatarios:
try:
- email_texts = criar_email_tramitacao(base_url,
- casa,
- tipo,
- doc_mat,
- status,
- unidade_destino,
- destinatario.hash)
+ email_texts = criar_email_tramitacao(
+ base_url,
+ casa,
+ tipo,
+ doc_mat,
+ status,
+ unidade_destino,
+ destinatario.hash,
+ )
email = EmailMultiAlternatives(
subject,
email_texts[0],
sender,
[destinatario.email],
- connection=connection)
+ connection=connection,
+ )
email.attach_alternative(email_texts[1], "text/html")
email.send()
@@ -261,7 +285,6 @@ def do_envia_email_tramitacao(base_url, tipo, doc_mat, status, unidade_destino):
# a conexão será fechada
except Exception:
connection.close()
- raise Exception(
- 'Erro ao enviar e-mail de acompanhamento de matéria.')
+ raise Exception("Erro ao enviar e-mail de acompanhamento de matéria.")
connection.close()
diff --git a/sapl/base/forms.py b/sapl/base/forms.py
index aeaa2f1c0..d90e61b56 100644
--- a/sapl/base/forms.py
+++ b/sapl/base/forms.py
@@ -1,15 +1,18 @@
import logging
import os
-from crispy_forms.bootstrap import FieldWithButtons, InlineRadios, StrictButton, FormActions
+import django_filters
+from crispy_forms.bootstrap import (FieldWithButtons, FormActions,
+ InlineRadios, StrictButton)
from crispy_forms.helper import FormHelper
-from crispy_forms.layout import HTML, Button, Div, Field, Fieldset, Layout, Row, Submit
+from crispy_forms.layout import (HTML, Button, Div, Field, Fieldset, Layout,
+ Row, Submit)
from django import forms
from django.conf import settings
from django.contrib.auth import get_user_model, password_validation
from django.contrib.auth.forms import (AuthenticationForm, PasswordResetForm,
SetPasswordForm)
-from django.contrib.auth.models import Group, User, Permission
+from django.contrib.auth.models import Group, Permission, User
from django.core.exceptions import ValidationError
from django.db import models, transaction
from django.db.models import Q
@@ -17,146 +20,153 @@ from django.forms import Form, ModelForm
from django.utils import timezone
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
-import django_filters
from haystack.forms import ModelSearchForm
from sapl.audiencia.models import AudienciaPublica
-from sapl.base.models import Autor, AuditLog, TipoAutor, OperadorAutor
+from sapl.base.models import AuditLog, Autor, OperadorAutor, TipoAutor
from sapl.comissoes.models import Reuniao
-from sapl.crispy_layout_mixin import (form_actions, to_column, to_row,
- SaplFormHelper, SaplFormLayout)
+from sapl.crispy_layout_mixin import (SaplFormHelper, SaplFormLayout,
+ form_actions, to_column, to_row)
from sapl.materia.models import (DocumentoAcessorio, MateriaEmTramitacao,
- MateriaLegislativa, UnidadeTramitacao,
- StatusTramitacao)
-from sapl.norma.models import NormaJuridica, NormaEstatisticas
-from sapl.parlamentares.models import Partido, SessaoLegislativa, \
- Parlamentar, Votante
+ MateriaLegislativa, StatusTramitacao,
+ UnidadeTramitacao)
+from sapl.norma.models import NormaEstatisticas, NormaJuridica
+from sapl.parlamentares.models import (Parlamentar, Partido, SessaoLegislativa,
+ Votante)
from sapl.protocoloadm.models import DocumentoAdministrativo
from sapl.rules import SAPL_GROUP_AUTOR, SAPL_GROUP_VOTANTE
from sapl.sessao.models import SessaoPlenaria
from sapl.settings import MAX_IMAGE_UPLOAD_SIZE
-from sapl.utils import (autor_label, autor_modal, ChoiceWithoutValidationField,
- choice_anos_com_normas, choice_anos_com_materias,
- FilterOverridesMetaMixin, FileFieldCheckMixin,
- ImageThumbnailFileInput, qs_override_django_filter,
- RANGE_ANOS, YES_NO_CHOICES, choice_tipos_normas,
- GoogleRecapthaMixin, parlamentares_ativos, RANGE_MESES, is_weak_password, delete_cached_entry)
+from sapl.utils import (RANGE_ANOS, RANGE_MESES, YES_NO_CHOICES,
+ ChoiceWithoutValidationField, FileFieldCheckMixin,
+ FilterOverridesMetaMixin, GoogleRecapthaMixin,
+ ImageThumbnailFileInput, autor_label, autor_modal,
+ choice_anos_com_materias, choice_anos_com_normas,
+ choice_tipos_normas, delete_cached_entry,
+ is_weak_password, parlamentares_ativos,
+ qs_override_django_filter)
from .models import AppConfig, CasaLegislativa
ACTION_CREATE_USERS_AUTOR_CHOICE = [
- ('A', _('Associar um usuário existente')),
- ('N', _('Autor sem Usuário de Acesso ao Sapl')),
+ ("A", _("Associar um usuário existente")),
+ ("N", _("Autor sem Usuário de Acesso ao Sapl")),
]
STATUS_USER_CHOICE = [
- ('R', _('Apenas retirar Perfil de Autor do Usuário que está sendo'
- ' desvinculado')),
- ('D', _('Retirar Perfil de Autor e desativar Usuário que está sendo'
- ' desvinculado')),
- ('X', _('Excluir Usuário')),
+ (
+ "R",
+ _("Apenas retirar Perfil de Autor do Usuário que está sendo" " desvinculado"),
+ ),
+ (
+ "D",
+ _("Retirar Perfil de Autor e desativar Usuário que está sendo" " desvinculado"),
+ ),
+ ("X", _("Excluir Usuário")),
]
class UserAdminForm(ModelForm):
- is_active = forms.TypedChoiceField(label=_('Usuário Ativo'),
- choices=YES_NO_CHOICES,
- coerce=lambda x: x == 'True')
+ is_active = forms.TypedChoiceField(
+ label=_("Usuário Ativo"), choices=YES_NO_CHOICES, coerce=lambda x: x == "True"
+ )
new_password1 = forms.CharField(
- label='Nova senha',
+ label="Nova senha",
max_length=50,
strip=False,
required=False,
widget=forms.PasswordInput(),
- help_text='Deixe os campos em branco para não fazer alteração de senha')
+ help_text="Deixe os campos em branco para não fazer alteração de senha",
+ )
new_password2 = forms.CharField(
- label='Confirmar senha',
+ label="Confirmar senha",
max_length=50,
strip=False,
required=False,
widget=forms.PasswordInput(),
- help_text='Deixe os campos em branco para não fazer alteração de senha')
+ help_text="Deixe os campos em branco para não fazer alteração de senha",
+ )
token = forms.CharField(
required=False,
label="Token",
max_length=40,
- widget=forms.TextInput(attrs={'readonly': 'readonly'}))
+ widget=forms.TextInput(attrs={"readonly": "readonly"}),
+ )
parlamentar = forms.ModelChoiceField(
- label=_('Este usuário é um Parlamentar Votante?'),
+ label=_("Este usuário é um Parlamentar Votante?"),
queryset=Parlamentar.objects.all(),
required=False,
- help_text='Se o usuário que está sendo cadastrado (ou em edição) é um usuário para que um parlamentar possa votar, você pode selecionar o parlamentar nas opções acima.')
+ help_text="Se o usuário que está sendo cadastrado (ou em edição) é um usuário para que um parlamentar possa votar, você pode selecionar o parlamentar nas opções acima.",
+ )
autor = forms.ModelChoiceField(
- label=_('Este usuário registrará proposições para um Autor?'),
+ label=_("Este usuário registrará proposições para um Autor?"),
queryset=Autor.objects.all(),
required=False,
- help_text='Se o usuário que está sendo cadastrado (ou em edição) é um usuário para cadastro de proposições, você pode selecionar para que autor ele registrará proposições.')
+ help_text="Se o usuário que está sendo cadastrado (ou em edição) é um usuário para cadastro de proposições, você pode selecionar para que autor ele registrará proposições.",
+ )
class Meta:
model = get_user_model()
fields = [
get_user_model().USERNAME_FIELD,
- 'first_name',
- 'last_name',
- 'is_active',
-
- 'token',
-
- 'new_password1',
- 'new_password2',
-
- 'parlamentar',
- 'autor',
-
- 'groups',
- 'user_permissions',
+ "first_name",
+ "last_name",
+ "is_active",
+ "token",
+ "new_password1",
+ "new_password2",
+ "parlamentar",
+ "autor",
+ "groups",
+ "user_permissions",
]
- if get_user_model().USERNAME_FIELD != 'email':
- fields.extend(['email'])
+ if get_user_model().USERNAME_FIELD != "email":
+ fields.extend(["email"])
def __init__(self, *args, **kwargs):
-
- self.user_session = kwargs.pop('user_session', None)
- self.granular = kwargs.pop('granular', None)
- self.instance = kwargs.get('instance', None)
+ self.user_session = kwargs.pop("user_session", None)
+ self.granular = kwargs.pop("granular", None)
+ self.instance = kwargs.get("instance", None)
row_pwd = [
- ('username', 4),
- ('email', 6),
- ('is_active', 2),
- ('first_name', 6),
- ('last_name', 6),
- ('new_password1', 3 if self.instance and self.instance.pk else 6),
- ('new_password2', 3 if self.instance and self.instance.pk else 6),
+ ("username", 4),
+ ("email", 6),
+ ("is_active", 2),
+ ("first_name", 6),
+ ("last_name", 6),
+ ("new_password1", 3 if self.instance and self.instance.pk else 6),
+ ("new_password2", 3 if self.instance and self.instance.pk else 6),
]
if self.instance and self.instance.pk:
row_pwd += [
(
FieldWithButtons(
- 'token',
+ "token",
StrictButton(
- 'Renovar',
+ "Renovar",
id="renovar-token",
- css_class="btn-outline-primary"),
- css_class='' if self.instance and self.instance.pk else 'd-none'),
- 6
+ css_class="btn-outline-primary",
+ ),
+ css_class=""
+ if self.instance and self.instance.pk
+ else "d-none",
+ ),
+ 6,
)
]
row_pwd += [
-
- ('parlamentar', 6),
- ('autor', 6),
- ('groups', 12),
-
- ] + ([('user_permissions', 12)] if not self.granular is None else [])
+ ("parlamentar", 6),
+ ("autor", 6),
+ ("groups", 12),
+ ] + ([("user_permissions", 12)] if not self.granular is None else [])
row_pwd = to_row(row_pwd)
@@ -164,62 +174,71 @@ class UserAdminForm(ModelForm):
self.helper.layout = SaplFormLayout(row_pwd)
super(UserAdminForm, self).__init__(*args, **kwargs)
- self.fields['groups'].widget = forms.CheckboxSelectMultiple()
+ self.fields["groups"].widget = forms.CheckboxSelectMultiple()
- self.fields['parlamentar'].choices = [('', '---------')] + [
+ self.fields["parlamentar"].choices = [("", "---------")] + [
(p.id, p) for p in parlamentares_ativos(timezone.now())
]
if not self.instance.pk:
- self.fields['groups'].choices = [
- (g.id, g) for g in Group.objects.exclude(
- name__in=['Autor', 'Votante']
- ).order_by('name')
+ self.fields["groups"].choices = [
+ (g.id, g)
+ for g in Group.objects.exclude(name__in=["Autor", "Votante"]).order_by(
+ "name"
+ )
]
else:
operadorautor = self.instance.operadorautor_set.first()
votante = self.instance.votante_set.first()
- self.fields['token'].initial = self.instance.auth_token.key \
- if hasattr(self.instance, 'auth_token') else ''
- self.fields['autor'].initial = operadorautor.autor if operadorautor else None
- self.fields['parlamentar'].initial = votante.parlamentar if votante else None
-
- self.fields['groups'].choices = [
- (g.id, g) for g in self.instance.groups.exclude(
- name__in=['Autor', 'Votante']
- ).order_by('name')
+ self.fields["token"].initial = (
+ self.instance.auth_token.key
+ if hasattr(self.instance, "auth_token")
+ else ""
+ )
+ self.fields["autor"].initial = (
+ operadorautor.autor if operadorautor else None
+ )
+ self.fields["parlamentar"].initial = (
+ votante.parlamentar if votante else None
+ )
+
+ self.fields["groups"].choices = [
+ (g.id, g)
+ for g in self.instance.groups.exclude(
+ name__in=["Autor", "Votante"]
+ ).order_by("name")
] + [
- (g.id, g) for g in Group.objects.exclude(
- user=self.instance).exclude(
- name__in=[
- 'Autor', 'Votante']
- ).order_by('name')
+ (g.id, g)
+ for g in Group.objects.exclude(user=self.instance)
+ .exclude(name__in=["Autor", "Votante"])
+ .order_by("name")
]
- self.fields[
- 'user_permissions'].widget = forms.CheckboxSelectMultiple()
+ self.fields["user_permissions"].widget = forms.CheckboxSelectMultiple()
if not self.granular is None:
- self.fields['user_permissions'].choices = [
- (p.id, p) for p in self.instance.user_permissions.all(
- ).order_by('content_type__app_label',
- 'content_type__model',
- 'codename')
+ self.fields["user_permissions"].choices = [
+ (p.id, p)
+ for p in self.instance.user_permissions.all().order_by(
+ "content_type__app_label", "content_type__model", "codename"
+ )
] + [
- (p.id, p) for p in Permission.objects.filter(
+ (p.id, p)
+ for p in Permission.objects.filter(
content_type__app_label__in=list(
- map(lambda x: x.split('.')[-1], settings.SAPL_APPS))
- ).exclude(
- user=self.instance
- ).order_by('content_type__app_label',
- 'content_type__model',
- 'codename')
+ map(lambda x: x.split(".")[-1], settings.SAPL_APPS)
+ )
+ )
+ .exclude(user=self.instance)
+ .order_by(
+ "content_type__app_label", "content_type__model", "codename"
+ )
]
def save(self, commit=True):
- if self.cleaned_data['new_password1']:
- self.instance.set_password(self.cleaned_data['new_password1'])
+ if self.cleaned_data["new_password1"]:
+ self.instance.set_password(self.cleaned_data["new_password1"])
permissions = None
votante = None
operadorautor = None
@@ -239,36 +258,36 @@ class UserAdminForm(ModelForm):
g_autor = Group.objects.get(name=SAPL_GROUP_AUTOR)
g_votante = Group.objects.get(name=SAPL_GROUP_VOTANTE)
- if not self.cleaned_data['autor']:
+ if not self.cleaned_data["autor"]:
inst.groups.remove(g_autor)
if operadorautor:
operadorautor.delete()
else:
inst.groups.add(g_autor)
if operadorautor:
- if operadorautor.autor != self.cleaned_data['autor']:
- operadorautor.autor = self.cleaned_data['autor']
+ if operadorautor.autor != self.cleaned_data["autor"]:
+ operadorautor.autor = self.cleaned_data["autor"]
operadorautor.save()
else:
operadorautor = OperadorAutor()
operadorautor.user = inst
- operadorautor.autor = self.cleaned_data['autor']
+ operadorautor.autor = self.cleaned_data["autor"]
operadorautor.save()
- if not self.cleaned_data['parlamentar']:
+ if not self.cleaned_data["parlamentar"]:
inst.groups.remove(g_votante)
if votante:
votante.delete()
else:
inst.groups.add(g_votante)
if votante:
- if votante.parlamentar != self.cleaned_data['parlamentar']:
- votante.parlamentar = self.cleaned_data['parlamentar']
+ if votante.parlamentar != self.cleaned_data["parlamentar"]:
+ votante.parlamentar = self.cleaned_data["parlamentar"]
votante.save()
else:
votante = Votante()
votante.user = inst
- votante.parlamentar = self.cleaned_data['parlamentar']
+ votante.parlamentar = self.cleaned_data["parlamentar"]
votante.save()
return inst
@@ -279,8 +298,8 @@ class UserAdminForm(ModelForm):
if self.errors:
return data
- new_password1 = data.get('new_password1', '')
- new_password2 = data.get('new_password2', '')
+ new_password1 = data.get("new_password1", "")
+ new_password2 = data.get("new_password2", "")
if new_password1 != new_password2:
raise forms.ValidationError(
@@ -289,32 +308,36 @@ class UserAdminForm(ModelForm):
else:
if new_password1 and new_password2:
if is_weak_password(new_password1):
- raise forms.ValidationError(_(
- 'A senha deve ter pelo menos 8 caracteres e incluir uma combinação '
- 'de letras maiúsculas e minúsculas, números e caracteres especiais.'
- ))
- password_validation.validate_password(
- new_password1, self.instance)
-
- parlamentar = data.get('parlamentar', None)
- if parlamentar and parlamentar.votante_set.exists() and \
- parlamentar.votante_set.first().user != self.instance:
+ raise forms.ValidationError(
+ _(
+ "A senha deve ter pelo menos 8 caracteres e incluir uma combinação "
+ "de letras maiúsculas e minúsculas, números e caracteres especiais."
+ )
+ )
+ password_validation.validate_password(new_password1, self.instance)
+
+ parlamentar = data.get("parlamentar", None)
+ if (
+ parlamentar
+ and parlamentar.votante_set.exists()
+ and parlamentar.votante_set.first().user != self.instance
+ ):
raise forms.ValidationError(
mark_safe(
- 'O Parlamentar {} '
- 'já está associado a outro usuário: {}. '
- 'Para realizar nova associação, você precisa '
- 'primeiro cancelar esta já existente.'.format(
- parlamentar,
- parlamentar.votante_set.first().user
- ))
+ "O Parlamentar {} "
+ "já está associado a outro usuário: {}. "
+ "Para realizar nova associação, você precisa "
+ "primeiro cancelar esta já existente.".format(
+ parlamentar, parlamentar.votante_set.first().user
+ )
+ )
)
- autor = data.get('autor', None)
+ autor = data.get("autor", None)
if parlamentar and autor:
if autor.autor_related != parlamentar:
raise forms.ValidationError(
- 'Um usuário não deve ser Votante de um parlamentar, e operador de um Autor que possui um parlamentar diferente, ou mesmo outro tipo de Autor.'
+ "Um usuário não deve ser Votante de um parlamentar, e operador de um Autor que possui um parlamentar diferente, ou mesmo outro tipo de Autor."
)
"""
@@ -342,39 +365,43 @@ class SessaoLegislativaForm(FileFieldCheckMixin, ModelForm):
exclude = []
def clean(self):
-
cleaned_data = super(SessaoLegislativaForm, self).clean()
if not self.is_valid():
return cleaned_data
flag_edit = True
- data_inicio = cleaned_data['data_inicio']
- data_fim = cleaned_data['data_fim']
- legislatura = cleaned_data['legislatura']
- numero = cleaned_data['numero']
+ data_inicio = cleaned_data["data_inicio"]
+ data_fim = cleaned_data["data_fim"]
+ legislatura = cleaned_data["legislatura"]
+ numero = cleaned_data["numero"]
data_inicio_leg = legislatura.data_inicio
data_fim_leg = legislatura.data_fim
- pk = self.initial['id'] if self.initial else None
+ pk = self.initial["id"] if self.initial else None
# Queries para verificar se existem Sessões Legislativas no período selecionado no form
# Caso onde a data_inicio e data_fim são iguais a de alguma sessão já
# criada
primeiro_caso = Q(data_inicio=data_inicio, data_fim=data_fim)
# Caso onde a data_inicio está entre o início e o fim de uma Sessão já
# existente
- segundo_caso = Q(data_inicio__lt=data_inicio,
- data_fim__range=(data_inicio, data_fim))
+ segundo_caso = Q(
+ data_inicio__lt=data_inicio, data_fim__range=(data_inicio, data_fim)
+ )
# Caso onde a data_fim está entre o início e o fim de uma Sessão já
# existente
- terceiro_caso = Q(data_inicio__range=(
- data_inicio, data_fim), data_fim__gt=data_fim)
- sessoes_existentes = SessaoLegislativa.objects.filter(primeiro_caso | segundo_caso | terceiro_caso). \
- exclude(pk=pk)
+ terceiro_caso = Q(
+ data_inicio__range=(data_inicio, data_fim), data_fim__gt=data_fim
+ )
+ sessoes_existentes = SessaoLegislativa.objects.filter(
+ primeiro_caso | segundo_caso | terceiro_caso
+ ).exclude(pk=pk)
if sessoes_existentes:
- raise ValidationError('Já existe registrado uma Sessão Legislativa que coincide com a data '
- 'inserida, favor verificar as Sessões existentes antes de criar uma '
- 'nova Sessão Legislativa')
+ raise ValidationError(
+ "Já existe registrado uma Sessão Legislativa que coincide com a data "
+ "inserida, favor verificar as Sessões existentes antes de criar uma "
+ "nova Sessão Legislativa"
+ )
# sessoes_legislativas = SessaoLegislativa.objects.filter(legislatura=legislatura).exclude(pk=pk)
@@ -392,99 +419,123 @@ class SessaoLegislativaForm(FileFieldCheckMixin, ModelForm):
if numero <= ult and flag_edit:
self.logger.warning(
- 'O número da SessaoLegislativa ({}) é menor ou igual '
- 'que o de Sessões Legislativas passadas ({})'.format(
- numero, ult)
+ "O número da SessaoLegislativa ({}) é menor ou igual "
+ "que o de Sessões Legislativas passadas ({})".format(numero, ult)
+ )
+ raise ValidationError(
+ "O número da Sessão Legislativa não pode ser menor ou igual "
+ "que o de Sessões Legislativas passadas"
)
- raise ValidationError('O número da Sessão Legislativa não pode ser menor ou igual '
- 'que o de Sessões Legislativas passadas')
- if data_inicio < data_inicio_leg or \
- data_inicio > data_fim_leg:
+ if data_inicio < data_inicio_leg or data_inicio > data_fim_leg:
self.logger.warning(
- 'A data de início ({}) da SessaoLegislativa está compreendida '
- 'fora da data início ({}) e fim ({}) da Legislatura '
- 'selecionada'.format(
- data_inicio, data_inicio_leg, data_fim_leg)
+ "A data de início ({}) da SessaoLegislativa está compreendida "
+ "fora da data início ({}) e fim ({}) da Legislatura "
+ "selecionada".format(data_inicio, data_inicio_leg, data_fim_leg)
+ )
+ raise ValidationError(
+ "A data de início da Sessão Legislativa deve estar compreendida "
+ "entre a data início e fim da Legislatura selecionada"
)
- raise ValidationError('A data de início da Sessão Legislativa deve estar compreendida '
- 'entre a data início e fim da Legislatura selecionada')
- if data_fim > data_fim_leg or \
- data_fim < data_inicio_leg:
+ if data_fim > data_fim_leg or data_fim < data_inicio_leg:
self.logger.warning(
- 'A data de fim ({}) da SessaoLegislativa está compreendida '
- 'fora da data início ({}) e fim ({}) da Legislatura '
- 'selecionada.'.format(data_fim, data_inicio_leg, data_fim_leg)
+ "A data de fim ({}) da SessaoLegislativa está compreendida "
+ "fora da data início ({}) e fim ({}) da Legislatura "
+ "selecionada.".format(data_fim, data_inicio_leg, data_fim_leg)
+ )
+ raise ValidationError(
+ "A data de fim da Sessão Legislativa deve estar compreendida "
+ "entre a data início e fim da Legislatura selecionada"
)
- raise ValidationError('A data de fim da Sessão Legislativa deve estar compreendida '
- 'entre a data início e fim da Legislatura selecionada')
if data_inicio > data_fim:
self.logger.warning(
- 'Data início ({}) superior à data fim ({}).'.format(
- data_inicio, data_fim)
+ "Data início ({}) superior à data fim ({}).".format(
+ data_inicio, data_fim
+ )
)
- raise ValidationError(
- 'Data início não pode ser superior à data fim')
+ raise ValidationError("Data início não pode ser superior à data fim")
if data_fim.year > data_inicio.year + 1:
raise ValidationError(
- 'A Sessão Legislativa só pode ter, no máximo, dois anos de período.')
+ "A Sessão Legislativa só pode ter, no máximo, dois anos de período."
+ )
- data_inicio_intervalo = cleaned_data['data_inicio_intervalo']
- data_fim_intervalo = cleaned_data['data_fim_intervalo']
+ data_inicio_intervalo = cleaned_data["data_inicio_intervalo"]
+ data_fim_intervalo = cleaned_data["data_fim_intervalo"]
- if data_inicio_intervalo and data_fim_intervalo and \
- data_inicio_intervalo > data_fim_intervalo:
+ if (
+ data_inicio_intervalo
+ and data_fim_intervalo
+ and data_inicio_intervalo > data_fim_intervalo
+ ):
self.logger.warning(
- 'Data início de intervalo ({}) superior à '
- 'data fim de intervalo ({}).'.format(
- data_inicio_intervalo, data_fim_intervalo)
+ "Data início de intervalo ({}) superior à "
+ "data fim de intervalo ({}).".format(
+ data_inicio_intervalo, data_fim_intervalo
+ )
+ )
+ raise ValidationError(
+ "Data início de intervalo não pode ser "
+ "superior à data fim de intervalo"
)
- raise ValidationError('Data início de intervalo não pode ser '
- 'superior à data fim de intervalo')
if data_inicio_intervalo:
- if data_inicio_intervalo < data_inicio or \
- data_inicio_intervalo < data_inicio_leg or \
- data_inicio_intervalo > data_fim or \
- data_inicio_intervalo > data_fim_leg:
+ if (
+ data_inicio_intervalo < data_inicio
+ or data_inicio_intervalo < data_inicio_leg
+ or data_inicio_intervalo > data_fim
+ or data_inicio_intervalo > data_fim_leg
+ ):
self.logger.warning(
- 'A data de início do intervalo ({}) não está compreendida entre '
- 'as datas de início ({}) e fim ({}) tanto da Legislatura quanto da '
- 'própria Sessão Legislativa ({} e {}).'.format(
- data_inicio_intervalo, data_inicio_leg, data_fim_leg, data_inicio, data_fim
+ "A data de início do intervalo ({}) não está compreendida entre "
+ "as datas de início ({}) e fim ({}) tanto da Legislatura quanto da "
+ "própria Sessão Legislativa ({} e {}).".format(
+ data_inicio_intervalo,
+ data_inicio_leg,
+ data_fim_leg,
+ data_inicio,
+ data_fim,
)
)
- raise ValidationError('A data de início do intervalo deve estar compreendida entre '
- 'as datas de início e fim tanto da Legislatura quanto da '
- 'própria Sessão Legislativa')
+ raise ValidationError(
+ "A data de início do intervalo deve estar compreendida entre "
+ "as datas de início e fim tanto da Legislatura quanto da "
+ "própria Sessão Legislativa"
+ )
if data_fim_intervalo:
- if data_fim_intervalo > data_fim or \
- data_fim_intervalo > data_fim_leg or \
- data_fim_intervalo < data_inicio or \
- data_fim_intervalo < data_inicio_leg:
+ if (
+ data_fim_intervalo > data_fim
+ or data_fim_intervalo > data_fim_leg
+ or data_fim_intervalo < data_inicio
+ or data_fim_intervalo < data_inicio_leg
+ ):
self.logger.warning(
- 'A data de fim do intervalo ({}) não está compreendida entre '
- 'as datas de início ({}) e fim ({}) tanto da Legislatura quanto da '
- 'própria Sessão Legislativa ({} e {}).'.format(
- data_fim_intervalo, data_inicio_leg, data_fim_leg, data_inicio, data_fim
+ "A data de fim do intervalo ({}) não está compreendida entre "
+ "as datas de início ({}) e fim ({}) tanto da Legislatura quanto da "
+ "própria Sessão Legislativa ({} e {}).".format(
+ data_fim_intervalo,
+ data_inicio_leg,
+ data_fim_leg,
+ data_inicio,
+ data_fim,
)
)
- raise ValidationError('A data de fim do intervalo deve estar compreendida entre '
- 'as datas de início e fim tanto da Legislatura quanto da '
- 'própria Sessão Legislativa')
+ raise ValidationError(
+ "A data de fim do intervalo deve estar compreendida entre "
+ "as datas de início e fim tanto da Legislatura quanto da "
+ "própria Sessão Legislativa"
+ )
return cleaned_data
class TipoAutorForm(ModelForm):
class Meta:
model = TipoAutor
- fields = ['descricao']
+ fields = ["descricao"]
def __init__(self, *args, **kwargs):
-
super(TipoAutorForm, self).__init__(*args, **kwargs)
def clean(self):
@@ -494,146 +545,144 @@ class TipoAutorForm(ModelForm):
return self.cleaned_data
cd = self.cleaned_data
- lista = ['comissão',
- 'comis',
- 'parlamentar',
- 'bancada',
- 'bloco',
- 'comissao',
- 'vereador',
- 'órgão',
- 'orgao',
- 'deputado',
- 'senador',
- 'vereadora',
- 'frente']
+ lista = [
+ "comissão",
+ "comis",
+ "parlamentar",
+ "bancada",
+ "bloco",
+ "comissao",
+ "vereador",
+ "órgão",
+ "orgao",
+ "deputado",
+ "senador",
+ "vereadora",
+ "frente",
+ ]
for l in lista:
- if l in cd['descricao'].lower():
- raise ValidationError(_('A descrição colocada não pode ser usada '
- 'por ser equivalente a um tipo já existente'))
+ if l in cd["descricao"].lower():
+ raise ValidationError(
+ _(
+ "A descrição colocada não pode ser usada "
+ "por ser equivalente a um tipo já existente"
+ )
+ )
class AutorForm(ModelForm):
logger = logging.getLogger(__name__)
senha = forms.CharField(
- max_length=20,
- label=_('Senha'),
- required=False,
- widget=forms.PasswordInput())
+ max_length=20, label=_("Senha"), required=False, widget=forms.PasswordInput()
+ )
senha_confirma = forms.CharField(
max_length=20,
- label=_('Confirmar Senha'),
+ label=_("Confirmar Senha"),
required=False,
- widget=forms.PasswordInput())
+ widget=forms.PasswordInput(),
+ )
- email = forms.EmailField(
- required=False,
- label=_('Email'))
+ email = forms.EmailField(required=False, label=_("Email"))
- confirma_email = forms.EmailField(
- required=False,
- label=_('Confirmar Email'))
+ confirma_email = forms.EmailField(required=False, label=_("Confirmar Email"))
q = forms.CharField(
- max_length=120, required=False,
- label='Pesquise o nome do Autor com o '
- 'tipo Selecionado e marque o escolhido.')
+ max_length=120,
+ required=False,
+ label="Pesquise o nome do Autor com o "
+ "tipo Selecionado e marque o escolhido.",
+ )
- autor_related = ChoiceWithoutValidationField(label='',
- required=False,
- widget=forms.RadioSelect())
+ autor_related = ChoiceWithoutValidationField(
+ label="", required=False, widget=forms.RadioSelect()
+ )
operadores = forms.ModelMultipleChoiceField(
queryset=get_user_model().objects.all(),
widget=forms.CheckboxSelectMultiple(),
- label=_('Usuários do SAPL ligados ao autor acima selecionado'),
+ label=_("Usuários do SAPL ligados ao autor acima selecionado"),
required=False,
help_text=_(
- 'Para ser listado aqui, o usuário não pode estar em nenhum outro autor e deve estar marcado como ativo.')
+ "Para ser listado aqui, o usuário não pode estar em nenhum outro autor e deve estar marcado como ativo."
+ ),
)
class Meta:
model = Autor
- fields = ['tipo',
- 'nome',
- 'cargo',
- 'autor_related',
- 'q',
- 'operadores'
- ]
+ fields = ["tipo", "nome", "cargo", "autor_related", "q", "operadores"]
def __init__(self, *args, **kwargs):
-
autor_related = Div(
FieldWithButtons(
- Field('q',
- placeholder=_('Pesquisar por possíveis autores para '
- 'o Tipo de Autor selecionado.')),
+ Field(
+ "q",
+ placeholder=_(
+ "Pesquisar por possíveis autores para "
+ "o Tipo de Autor selecionado."
+ ),
+ ),
StrictButton(
- _('Filtrar'), css_class='btn-outline-primary btn-filtrar-autor',
- type='button')),
- css_class='hidden',
- data_action='create',
- data_application='AutorSearch',
- data_field='autor_related')
-
- autor_select = Row(to_column(('tipo', 3)),
- Div(to_column(('nome', 7)),
- to_column(('cargo', 5)),
- css_class="div_nome_cargo row col"),
- to_column((autor_related, 9)),
- to_column((Div(
- Field('autor_related'),
- css_class='radiogroup-autor-related hidden'),
- 12)))
- operadores_select = to_row(
- [
- ('operadores', 12)
- ]
+ _("Filtrar"),
+ css_class="btn-outline-primary btn-filtrar-autor",
+ type="button",
+ ),
+ ),
+ css_class="hidden",
+ data_action="create",
+ data_application="AutorSearch",
+ data_field="autor_related",
+ )
+
+ autor_select = Row(
+ to_column(("tipo", 3)),
+ Div(
+ to_column(("nome", 7)),
+ to_column(("cargo", 5)),
+ css_class="div_nome_cargo row col",
+ ),
+ to_column((autor_related, 9)),
+ to_column(
+ (
+ Div(
+ Field("autor_related"),
+ css_class="radiogroup-autor-related hidden",
+ ),
+ 12,
+ )
+ ),
)
+ operadores_select = to_row([("operadores", 12)])
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(autor_select, *operadores_select)
super(AutorForm, self).__init__(*args, **kwargs)
- self.fields['operadores'].choices = [
- (
- u.id,
- u.username,
- u
- )
- for u in get_user_model().objects.filter(
- operadorautor_set__autor=self.instance
- ).order_by('-is_active',
- get_user_model().USERNAME_FIELD
- ) if self.instance.id
+ self.fields["operadores"].choices = [
+ (u.id, u.username, u)
+ for u in get_user_model()
+ .objects.filter(operadorautor_set__autor=self.instance)
+ .order_by("-is_active", get_user_model().USERNAME_FIELD)
+ if self.instance.id
] + [
- (
- u.id,
- u.username,
- u
- )
- for u in get_user_model().objects.filter(
- operadorautor_set__isnull=True,
- is_active=True
- ).order_by('-is_active',
- get_user_model().USERNAME_FIELD
- )
+ (u.id, u.username, u)
+ for u in get_user_model()
+ .objects.filter(operadorautor_set__isnull=True, is_active=True)
+ .order_by("-is_active", get_user_model().USERNAME_FIELD)
]
if self.instance.pk:
if self.instance.autor_related:
- self.fields['autor_related'].choices = [
- (self.instance.autor_related.pk,
- self.instance.autor_related)]
+ self.fields["autor_related"].choices = [
+ (self.instance.autor_related.pk, self.instance.autor_related)
+ ]
- self.fields['q'].initial = ''
+ self.fields["q"].initial = ""
- self.fields['autor_related'].initial = self.instance.autor_related
+ self.fields["autor_related"].initial = self.instance.autor_related
def valida_igualdade(self, texto1, texto2, msg):
if texto1 != texto2:
@@ -656,51 +705,57 @@ class AutorForm(ModelForm):
if self.instance.pk:
qs_autor = qs_autor.exclude(pk=self.instance.pk)
- if 'tipo' not in cd or not cd['tipo']:
- self.logger.warning('Tipo do Autor não selecionado.')
- raise ValidationError(
- _('O Tipo do Autor deve ser selecionado.'))
+ if "tipo" not in cd or not cd["tipo"]:
+ self.logger.warning("Tipo do Autor não selecionado.")
+ raise ValidationError(_("O Tipo do Autor deve ser selecionado."))
- tipo = cd['tipo']
+ tipo = cd["tipo"]
if not tipo.content_type:
- if 'nome' not in cd or not cd['nome']:
- self.logger.warning('Nome do Autor não informado.')
- raise ValidationError(
- _('O Nome do Autor deve ser informado.'))
- elif qs_autor.filter(nome=cd['nome']).exists():
- raise ValidationError("Autor '%s' já existente!" % cd['nome'])
+ if "nome" not in cd or not cd["nome"]:
+ self.logger.warning("Nome do Autor não informado.")
+ raise ValidationError(_("O Nome do Autor deve ser informado."))
+ elif qs_autor.filter(nome=cd["nome"]).exists():
+ raise ValidationError("Autor '%s' já existente!" % cd["nome"])
else:
- if 'autor_related' not in cd or not cd['autor_related']:
+ if "autor_related" not in cd or not cd["autor_related"]:
self.logger.warning(
- 'Registro de %s não escolhido para ser '
- 'vinculado ao cadastro de Autor' % tipo.descricao
+ "Registro de %s não escolhido para ser "
+ "vinculado ao cadastro de Autor" % tipo.descricao
)
raise ValidationError(
- _('Um registro de %s deve ser escolhido para ser '
- 'vinculado ao cadastro de Autor') % tipo.descricao)
+ _(
+ "Um registro de %s deve ser escolhido para ser "
+ "vinculado ao cadastro de Autor"
+ )
+ % tipo.descricao
+ )
- if not tipo.content_type.model_class().objects.filter(
- pk=cd['autor_related']).exists():
+ if (
+ not tipo.content_type.model_class()
+ .objects.filter(pk=cd["autor_related"])
+ .exists()
+ ):
self.logger.warning(
- 'O Registro definido (%s-%s) não está na base '
- 'de %s.' % (cd['autor_related'], cd['q'], tipo.descricao)
+ "O Registro definido (%s-%s) não está na base "
+ "de %s." % (cd["autor_related"], cd["q"], tipo.descricao)
)
raise ValidationError(
- _('O Registro definido (%s-%s) não está na base de %s.'
- ) % (cd['autor_related'], cd['q'], tipo.descricao))
+ _("O Registro definido (%s-%s) não está na base de %s.")
+ % (cd["autor_related"], cd["q"], tipo.descricao)
+ )
qs_autor_selected = qs_autor.filter(
- object_id=cd['autor_related'],
- content_type_id=cd['tipo'].content_type_id)
+ object_id=cd["autor_related"],
+ content_type_id=cd["tipo"].content_type_id,
+ )
if qs_autor_selected.exists():
autor = qs_autor_selected.first()
self.logger.warning(
- 'Já existe um autor Cadastrado para '
- '%s' % autor.autor_related
+ "Já existe um autor Cadastrado para " "%s" % autor.autor_related
)
raise ValidationError(
- _('Já existe um autor Cadastrado para %s'
- ) % autor.autor_related)
+ _("Já existe um autor Cadastrado para %s") % autor.autor_related
+ )
return self.cleaned_data
@@ -713,8 +768,9 @@ class AutorForm(ModelForm):
autor.object_id = None
autor.autor_related = None
else:
- autor.autor_related = autor.tipo.content_type.model_class(
- ).objects.get(pk=self.cleaned_data['autor_related'])
+ autor.autor_related = autor.tipo.content_type.model_class().objects.get(
+ pk=self.cleaned_data["autor_related"]
+ )
autor.nome = str(autor.autor_related)
autor = super(AutorForm, self).save(commit)
@@ -723,161 +779,187 @@ class AutorForm(ModelForm):
class AutorFilterSet(django_filters.FilterSet):
- nome = django_filters.CharFilter(
- label=_('Nome do Autor'), lookup_expr='icontains')
+ nome = django_filters.CharFilter(label=_("Nome do Autor"), lookup_expr="icontains")
class Meta:
model = Autor
- fields = ['nome']
+ fields = ["nome"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- row0 = to_row([('nome', 12)])
+ row0 = to_row([("nome", 12)])
self.form.helper = SaplFormHelper()
- self.form.helper.form_method = 'GET'
+ self.form.helper.form_method = "GET"
self.form.helper.layout = Layout(
- Fieldset(_('Pesquisa de Autor'),
- row0,
- form_actions(label='Pesquisar')))
+ Fieldset(_("Pesquisa de Autor"), row0, form_actions(label="Pesquisar"))
+ )
def get_username():
try:
- return [(u, u) for u in
- get_user_model().objects.all().order_by('username').values_list('username', flat=True)]
+ return [
+ (u, u)
+ for u in get_user_model()
+ .objects.all()
+ .order_by("username")
+ .values_list("username", flat=True)
+ ]
except:
return []
def get_models():
- return [(m, m) for m in
- AuditLog.objects.distinct('model_name').order_by('model_name').values_list('model_name', flat=True)]
+ return [
+ (m, m)
+ for m in AuditLog.objects.distinct("model_name")
+ .order_by("model_name")
+ .values_list("model_name", flat=True)
+ ]
class AuditLogFilterSet(django_filters.FilterSet):
OPERATION_CHOICES = (
- ('U', 'Atualizado'),
- ('C', 'Criado'),
- ('D', 'Excluído'),
+ ("U", "Atualizado"),
+ ("C", "Criado"),
+ ("D", "Excluído"),
)
- username = django_filters.ChoiceFilter(
- choices=get_username(), label=_('Usuário'))
- object_id = django_filters.NumberFilter(label=_('Id'))
+ username = django_filters.ChoiceFilter(choices=get_username(), label=_("Usuário"))
+ object_id = django_filters.NumberFilter(label=_("Id"))
operation = django_filters.ChoiceFilter(
- choices=OPERATION_CHOICES, label=_('Operação'))
+ choices=OPERATION_CHOICES, label=_("Operação")
+ )
model_name = django_filters.ChoiceFilter(
- choices=get_models, label=_('Tipo de Registro'))
- timestamp = django_filters.DateRangeFilter(label=_('Período'))
+ choices=get_models, label=_("Tipo de Registro")
+ )
+ timestamp = django_filters.DateRangeFilter(label=_("Período"))
class Meta:
model = AuditLog
- fields = ['username', 'operation',
- 'model_name', 'timestamp', 'object_id']
+ fields = ["username", "operation", "model_name", "timestamp", "object_id"]
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
- row0 = to_row([('username', 2),
- ('operation', 2),
- ('model_name', 4),
- ('object_id', 2),
- ('timestamp', 2)])
+ row0 = to_row(
+ [
+ ("username", 2),
+ ("operation", 2),
+ ("model_name", 4),
+ ("object_id", 2),
+ ("timestamp", 2),
+ ]
+ )
self.form.helper = SaplFormHelper()
- self.form.helper.form_method = 'GET'
+ self.form.helper.form_method = "GET"
self.form.helper.layout = Layout(
- Fieldset(_('Filtros'),
- row0,
- form_actions(label='Aplicar Filtro')))
+ Fieldset(_("Filtros"), row0, form_actions(label="Aplicar Filtro"))
+ )
class OperadorAutorForm(ModelForm):
class Meta:
model = OperadorAutor
- fields = ['user', ]
+ fields = [
+ "user",
+ ]
def __init__(self, *args, **kwargs):
- row = to_row([('user', 12)])
+ row = to_row([("user", 12)])
self.helper = SaplFormHelper()
- self.helper.layout = SaplFormLayout(
- Fieldset(_('Operador'), row))
+ self.helper.layout = SaplFormLayout(Fieldset(_("Operador"), row))
super(OperadorAutorForm, self).__init__(*args, **kwargs)
- self.fields['user'].choices = [
+ self.fields["user"].choices = [
(
u.id,
- '{} - {} - {}'.format(
- u.get_full_name(),
- getattr(u, u.USERNAME_FIELD),
- u.email
- )
- )
- for u in get_user_model().objects.all().order_by(
- get_user_model().USERNAME_FIELD
+ "{} - {} - {}".format(
+ u.get_full_name(), getattr(u, u.USERNAME_FIELD), u.email
+ ),
)
+ for u in get_user_model()
+ .objects.all()
+ .order_by(get_user_model().USERNAME_FIELD)
]
- self.fields['user'].widget = forms.RadioSelect()
+ self.fields["user"].widget = forms.RadioSelect()
class EstatisticasAcessoNormasForm(Form):
- ano = forms.ChoiceField(required=True,
- label='Ano de acesso',
- choices=RANGE_ANOS,
- initial=timezone.now().year)
-
- mes = forms.ChoiceField(required=False,
- label='Mês de acesso',
- choices=[('', 'Todos os Meses')] + RANGE_MESES,
- initial='')
-
- mais_acessadas = forms.ChoiceField(required=False,
- label='Mais Acessadas',
- choices=[
- (5, '005 mais acessadas'),
- (10, '010 mais acessadas'),
- (50, '050 mais acessadas'),
- (100, '100 mais acessadas'),
- (500, '500 mais acessadas'),
- (1000, '1000 mais acessadas'),
- ],
- initial=5)
+ ano = forms.ChoiceField(
+ required=True,
+ label="Ano de acesso",
+ choices=RANGE_ANOS,
+ initial=timezone.now().year,
+ )
+
+ mes = forms.ChoiceField(
+ required=False,
+ label="Mês de acesso",
+ choices=[("", "Todos os Meses")] + RANGE_MESES,
+ initial="",
+ )
+
+ mais_acessadas = forms.ChoiceField(
+ required=False,
+ label="Mais Acessadas",
+ choices=[
+ (5, "005 mais acessadas"),
+ (10, "010 mais acessadas"),
+ (50, "050 mais acessadas"),
+ (100, "100 mais acessadas"),
+ (500, "500 mais acessadas"),
+ (1000, "1000 mais acessadas"),
+ ],
+ initial=5,
+ )
class Meta:
- fields = ['ano', 'mes', 'mais_acessadas']
+ fields = ["ano", "mes", "mais_acessadas"]
def __init__(self, *args, **kwargs):
- super(EstatisticasAcessoNormasForm, self).__init__(
- *args, **kwargs)
+ super(EstatisticasAcessoNormasForm, self).__init__(*args, **kwargs)
- row1 = to_row([('ano', 3), ('mes', 6), ('mais_acessadas', 3), ])
+ row1 = to_row(
+ [
+ ("ano", 3),
+ ("mes", 6),
+ ("mais_acessadas", 3),
+ ]
+ )
buttons = FormActions(
*[
- HTML('''
+ HTML(
+ """
- ''')
+ """
+ )
],
- Submit('pesquisar', _('Pesquisar'), css_class='float-right',
- onclick='return true;'),
- css_class='form-group row justify-content-between',
+ Submit(
+ "pesquisar",
+ _("Pesquisar"),
+ css_class="float-right",
+ onclick="return true;",
+ ),
+ css_class="form-group row justify-content-between",
)
self.helper = SaplFormHelper()
- self.helper.form_method = 'GET'
+ self.helper.form_method = "GET"
self.helper.layout = Layout(
- Fieldset(_('Normas por acessos nos meses do ano.'),
- row1, buttons)
+ Fieldset(_("Normas por acessos nos meses do ano."), row1, buttons)
)
- self.fields['ano'].choices = NormaEstatisticas.objects.order_by(
- '-ano').distinct().values_list('ano', 'ano') or [
+ self.fields["ano"].choices = NormaEstatisticas.objects.order_by(
+ "-ano"
+ ).distinct().values_list("ano", "ano") or [
(timezone.now().year, timezone.now().year)
]
@@ -889,39 +971,39 @@ class EstatisticasAcessoNormasForm(Form):
class CasaLegislativaForm(FileFieldCheckMixin, ModelForm):
class Meta:
-
model = CasaLegislativa
- fields = ['codigo',
- 'nome',
- 'sigla',
- 'endereco',
- 'cep',
- 'municipio',
- 'uf',
- 'telefone',
- 'fax',
- 'logotipo',
- 'endereco_web',
- 'email',
- 'informacao_geral']
+ fields = [
+ "codigo",
+ "nome",
+ "sigla",
+ "endereco",
+ "cep",
+ "municipio",
+ "uf",
+ "telefone",
+ "fax",
+ "logotipo",
+ "endereco_web",
+ "email",
+ "informacao_geral",
+ ]
widgets = {
- 'uf': forms.Select(attrs={'class': 'selector'}),
- 'cep': forms.TextInput(attrs={'class': 'cep'}),
- 'telefone': forms.TextInput(attrs={'class': 'telefone'}),
+ "uf": forms.Select(attrs={"class": "selector"}),
+ "cep": forms.TextInput(attrs={"class": "cep"}),
+ "telefone": forms.TextInput(attrs={"class": "telefone"}),
# O campo fax foi ocultado porque não é utilizado.
- 'fax': forms.HiddenInput(),
+ "fax": forms.HiddenInput(),
# 'fax': forms.TextInput(attrs={'class': 'telefone'}),
- 'logotipo': ImageThumbnailFileInput,
- 'informacao_geral': forms.Textarea(
- attrs={'id': 'texto-rico'})
+ "logotipo": ImageThumbnailFileInput,
+ "informacao_geral": forms.Textarea(attrs={"id": "texto-rico"}),
}
def clean_logotipo(self):
# chama __clean de FileFieldCheckMixin
# por estar em clean de campo
super(CasaLegislativaForm, self)._check()
- logotipo = self.cleaned_data.get('logotipo')
+ logotipo = self.cleaned_data.get("logotipo")
if logotipo and logotipo.size > MAX_IMAGE_UPLOAD_SIZE:
raise ValidationError("Imagem muito grande. ( > 2MB )")
return logotipo
@@ -932,101 +1014,107 @@ class CasaLegislativaForm(FileFieldCheckMixin, ModelForm):
return casa
-
class LoginForm(AuthenticationForm):
username = forms.CharField(
- label="Usuário", max_length=30,
- widget=forms.TextInput(
- attrs={
- 'class': 'form-control', 'name': 'username'}))
+ label="Usuário",
+ max_length=30,
+ widget=forms.TextInput(attrs={"class": "form-control", "name": "username"}),
+ )
password = forms.CharField(
- label="Senha", max_length=30,
- widget=forms.PasswordInput(
- attrs={
- 'class': 'form-control', 'name': 'password'}))
+ label="Senha",
+ max_length=30,
+ widget=forms.PasswordInput(attrs={"class": "form-control", "name": "password"}),
+ )
class ConfiguracoesAppForm(ModelForm):
logger = logging.getLogger(__name__)
mostrar_brasao_painel = forms.BooleanField(
- help_text=_('Sugerimos fortemente que faça o upload de imagens com '
- 'o fundo transparente.'),
- label=_('Mostrar brasão da Casa no painel?'),
- required=False)
+ help_text=_(
+ "Sugerimos fortemente que faça o upload de imagens com "
+ "o fundo transparente."
+ ),
+ label=_("Mostrar brasão da Casa no painel?"),
+ required=False,
+ )
mostrar_voto = forms.BooleanField(
- help_text=_('Se selecionado, exibe qual é o voto, e não apenas a indicação de que já votou, '
- 'com a votação ainda aberta.'),
- label=_('Mostrar voto do Parlamentar no painel durante a votação?'),
- required=False)
+ help_text=_(
+ "Se selecionado, exibe qual é o voto, e não apenas a indicação de que já votou, "
+ "com a votação ainda aberta."
+ ),
+ label=_("Mostrar voto do Parlamentar no painel durante a votação?"),
+ required=False,
+ )
google_recaptcha_site_key = forms.CharField(
- label=AppConfig._meta.get_field(
- 'google_recaptcha_site_key').verbose_name,
+ label=AppConfig._meta.get_field("google_recaptcha_site_key").verbose_name,
max_length=256,
required=False,
help_text=_(
'Acesse https://www.google.com/recaptcha '
- 'para configurar um Recaptcha para sua casa legislativa. '
- 'Com Recaptcha configurado seu sapl disponibilizará '
- 'Acompanhamentos de Matérias e Documentos Administrativos '
+ "para configurar um Recaptcha para sua casa legislativa. "
+ "Com Recaptcha configurado seu sapl disponibilizará "
+ "Acompanhamentos de Matérias e Documentos Administrativos "
'e Recuperação de Senha pela opção "Esqueceu sua Senha" '
- 'na tela de login. Esta melhoria na foi necessária com o '
- 'intuito de coibir recorrentes ataques ao serviço de email.'),
+ "na tela de login. Esta melhoria na foi necessária com o "
+ "intuito de coibir recorrentes ataques ao serviço de email."
+ ),
)
google_recaptcha_secret_key = forms.CharField(
- label=AppConfig._meta.get_field(
- 'google_recaptcha_secret_key').verbose_name,
+ label=AppConfig._meta.get_field("google_recaptcha_secret_key").verbose_name,
max_length=256,
- required=False)
+ required=False,
+ )
google_analytics_id_metrica = forms.CharField(
- label=AppConfig._meta.get_field(
- 'google_analytics_id_metrica').verbose_name,
+ label=AppConfig._meta.get_field("google_analytics_id_metrica").verbose_name,
max_length=256,
- required=False)
+ required=False,
+ )
class Meta:
model = AppConfig
- fields = ['documentos_administrativos',
- 'sequencia_numeracao_protocolo',
- 'inicio_numeracao_protocolo',
- 'sequencia_numeracao_proposicao',
- 'esfera_federacao',
- # 'painel_aberto', # TODO: a ser implementado na versão 3.2
- 'texto_articulado_proposicao',
- 'texto_articulado_materia',
- 'texto_articulado_norma',
- 'proposicao_incorporacao_obrigatoria',
- 'protocolo_manual',
- 'cronometro_discurso',
- 'cronometro_aparte',
- 'cronometro_ordem',
- 'cronometro_consideracoes',
- 'mostrar_brasao_painel',
- 'mostrar_voto',
- 'receber_recibo_proposicao',
- 'assinatura_ata',
- 'estatisticas_acesso_normas',
- 'escolher_numero_materia_proposicao',
- 'tramitacao_origem_fixa',
- 'tramitacao_materia',
- 'ordenacao_pesquisa_materia',
- 'tramitacao_documento',
- 'google_recaptcha_site_key',
- 'google_recaptcha_secret_key',
- 'google_analytics_id_metrica',
- 'identificacao_de_documentos',
- ]
+ fields = [
+ "documentos_administrativos",
+ "sequencia_numeracao_protocolo",
+ "inicio_numeracao_protocolo",
+ "sequencia_numeracao_proposicao",
+ "esfera_federacao",
+ # 'painel_aberto', # TODO: a ser implementado na versão 3.2
+ "texto_articulado_proposicao",
+ "texto_articulado_materia",
+ "texto_articulado_norma",
+ "proposicao_incorporacao_obrigatoria",
+ "protocolo_manual",
+ "cronometro_discurso",
+ "cronometro_aparte",
+ "cronometro_ordem",
+ "cronometro_consideracoes",
+ "mostrar_brasao_painel",
+ "mostrar_voto",
+ "receber_recibo_proposicao",
+ "assinatura_ata",
+ "estatisticas_acesso_normas",
+ "escolher_numero_materia_proposicao",
+ "tramitacao_origem_fixa",
+ "tramitacao_materia",
+ "ordenacao_pesquisa_materia",
+ "tramitacao_documento",
+ "google_recaptcha_site_key",
+ "google_recaptcha_secret_key",
+ "google_analytics_id_metrica",
+ "identificacao_de_documentos",
+ ]
def __init__(self, *args, **kwargs):
super(ConfiguracoesAppForm, self).__init__(*args, **kwargs)
- self.fields['cronometro_discurso'].widget.attrs['class'] = 'cronometro'
- self.fields['cronometro_aparte'].widget.attrs['class'] = 'cronometro'
- self.fields['cronometro_ordem'].widget.attrs['class'] = 'cronometro'
- self.fields['cronometro_consideracoes'].widget.attrs['class'] = 'cronometro'
+ self.fields["cronometro_discurso"].widget.attrs["class"] = "cronometro"
+ self.fields["cronometro_aparte"].widget.attrs["class"] = "cronometro"
+ self.fields["cronometro_ordem"].widget.attrs["class"] = "cronometro"
+ self.fields["cronometro_consideracoes"].widget.attrs["class"] = "cronometro"
def clean(self):
cleaned_data = super().clean()
@@ -1034,21 +1122,21 @@ class ConfiguracoesAppForm(ModelForm):
if not self.is_valid():
return cleaned_data
- mostrar_brasao_painel = self.cleaned_data.get(
- 'mostrar_brasao_painel', False)
+ mostrar_brasao_painel = self.cleaned_data.get("mostrar_brasao_painel", False)
casa = CasaLegislativa.objects.first()
if not casa:
- self.logger.warning('Não há casa legislativa relacionada.')
+ self.logger.warning("Não há casa legislativa relacionada.")
raise ValidationError("Não há casa legislativa relacionada.")
if not casa.logotipo and mostrar_brasao_painel:
self.logger.warning(
- 'Não há logitipo configurado para esta '
- 'CasaLegislativa ({}).'.format(casa)
+ "Não há logitipo configurado para esta "
+ "CasaLegislativa ({}).".format(casa)
+ )
+ raise ValidationError(
+ "Não há logitipo configurado para esta " "Casa legislativa."
)
- raise ValidationError("Não há logitipo configurado para esta "
- "Casa legislativa.")
return cleaned_data
@@ -1057,22 +1145,24 @@ class RecuperarSenhaForm(GoogleRecapthaMixin, PasswordResetForm):
logger = logging.getLogger(__name__)
def __init__(self, *args, **kwargs):
- kwargs['title_label'] = _('Insira o e-mail cadastrado com a sua conta')
- kwargs['action_label'] = _('Enviar')
+ kwargs["title_label"] = _("Insira o e-mail cadastrado com a sua conta")
+ kwargs["action_label"] = _("Enviar")
super().__init__(*args, **kwargs)
def clean(self):
super(RecuperarSenhaForm, self).clean()
- email_existente = get_user_model().objects.filter(
- email=self.data['email']).exists()
+ email_existente = (
+ get_user_model().objects.filter(email=self.data["email"]).exists()
+ )
if not email_existente:
- msg = 'Não existe nenhum usuário cadastrado com este e-mail.'
+ msg = "Não existe nenhum usuário cadastrado com este e-mail."
self.logger.warning(
- 'Não existe nenhum usuário cadastrado com este e-mail ({}).'.format(
- self.data['email'])
+ "Não existe nenhum usuário cadastrado com este e-mail ({}).".format(
+ self.data["email"]
+ )
)
raise ValidationError(msg)
@@ -1080,19 +1170,14 @@ class RecuperarSenhaForm(GoogleRecapthaMixin, PasswordResetForm):
class NovaSenhaForm(SetPasswordForm):
-
def __init__(self, user, *args, **kwargs):
self.user = user
super(NovaSenhaForm, self).__init__(user, *args, **kwargs)
- row1 = to_row(
- [('new_password1', 6),
- ('new_password2', 6)])
+ row1 = to_row([("new_password1", 6), ("new_password2", 6)])
self.helper = SaplFormHelper()
- self.helper.layout = Layout(
- row1,
- form_actions(label='Enviar'))
+ self.helper.layout = Layout(row1, form_actions(label="Enviar"))
class AlterarSenhaForm(Form):
@@ -1100,33 +1185,27 @@ class AlterarSenhaForm(Form):
username = forms.CharField(widget=forms.HiddenInput())
- old_password = forms.CharField(label='Senha atual',
- max_length=50,
- widget=forms.PasswordInput())
- new_password1 = forms.CharField(label='Nova senha',
- max_length=50,
- widget=forms.PasswordInput())
- new_password2 = forms.CharField(label='Confirmar senha',
- max_length=50,
- widget=forms.PasswordInput())
+ old_password = forms.CharField(
+ label="Senha atual", max_length=50, widget=forms.PasswordInput()
+ )
+ new_password1 = forms.CharField(
+ label="Nova senha", max_length=50, widget=forms.PasswordInput()
+ )
+ new_password2 = forms.CharField(
+ label="Confirmar senha", max_length=50, widget=forms.PasswordInput()
+ )
class Meta:
- fields = ['username', 'old_password', 'new_password1', 'new_password2']
+ fields = ["username", "old_password", "new_password1", "new_password2"]
def __init__(self, *args, **kwargs):
-
super(AlterarSenhaForm, self).__init__(*args, **kwargs)
- row1 = to_row([('old_password', 12)])
- row2 = to_row(
- [('new_password1', 6),
- ('new_password2', 6)])
+ row1 = to_row([("old_password", 12)])
+ row2 = to_row([("new_password1", 6), ("new_password2", 6)])
self.helper = SaplFormHelper()
- self.helper.layout = Layout(
- row1,
- row2,
- form_actions(label='Alterar Senha'))
+ self.helper.layout = Layout(row1, row2, form_actions(label="Alterar Senha"))
def clean(self):
super(AlterarSenhaForm, self).clean()
@@ -1136,13 +1215,12 @@ class AlterarSenhaForm(Form):
data = self.cleaned_data
- new_password1 = data['new_password1']
- new_password2 = data['new_password2']
+ new_password1 = data["new_password1"]
+ new_password2 = data["new_password2"]
if new_password1 != new_password2:
self.logger.warning("'Nova Senha' diferente de 'Confirmar Senha'")
- raise ValidationError(
- "'Nova Senha' diferente de 'Confirmar Senha'")
+ raise ValidationError("'Nova Senha' diferente de 'Confirmar Senha'")
# TODO: colocar mais regras como: tamanho mínimo,
# TODO: caracteres alfanuméricos, maiúsculas (?),
@@ -1150,40 +1228,35 @@ class AlterarSenhaForm(Form):
if is_weak_password(new_password1):
self.logger.warning(
- 'A senha deve ter pelo menos 8 caracteres e incluir uma combinação '
- 'de letras maiúsculas e minúsculas, números e caracteres especiais.'
+ "A senha deve ter pelo menos 8 caracteres e incluir uma combinação "
+ "de letras maiúsculas e minúsculas, números e caracteres especiais."
)
raise ValidationError(
- 'A senha deve ter pelo menos 8 caracteres e incluir uma combinação '
- 'de letras maiúsculas e minúsculas, números e caracteres especiais.'
+ "A senha deve ter pelo menos 8 caracteres e incluir uma combinação "
+ "de letras maiúsculas e minúsculas, números e caracteres especiais."
)
- username = data['username']
- old_password = data['old_password']
+ username = data["username"]
+ old_password = data["old_password"]
user = User.objects.get(username=username)
if user.is_anonymous:
self.logger.warning(
- 'Não é possível alterar senha de usuário anônimo ({}).'.format(
- username)
+ "Não é possível alterar senha de usuário anônimo ({}).".format(username)
)
- raise ValidationError(
- "Não é possível alterar senha de usuário anônimo")
+ raise ValidationError("Não é possível alterar senha de usuário anônimo")
if not user.check_password(old_password):
self.logger.warning(
- 'Senha atual informada não confere '
- 'com a senha armazenada.'
+ "Senha atual informada não confere " "com a senha armazenada."
+ )
+ raise ValidationError(
+ "Senha atual informada não confere " "com a senha armazenada"
)
- raise ValidationError("Senha atual informada não confere "
- "com a senha armazenada")
if user.check_password(new_password1):
- self.logger.warning(
- 'Nova senha igual à senha anterior.'
- )
- raise ValidationError(
- "Nova senha não pode ser igual à senha anterior")
+ self.logger.warning("Nova senha igual à senha anterior.")
+ raise ValidationError("Nova senha não pode ser igual à senha anterior")
return self.cleaned_data
@@ -1194,7 +1267,6 @@ class PartidoForm(FileFieldCheckMixin, ModelForm):
exclude = []
def __init__(self, *args, **kwargs):
-
super(PartidoForm, self).__init__(*args, **kwargs)
# TODO Utilizar esses campos na issue #2161 de alteração de nomes de partidos
@@ -1204,39 +1276,39 @@ class PartidoForm(FileFieldCheckMixin, ModelForm):
# self.fields['sigla'].widget.attrs['readonly'] = True
row1 = to_row(
- [('sigla', 2),
- ('nome', 6),
- ('data_criacao', 2),
- ('data_extincao', 2), ])
- row2 = to_row([('observacao', 12)])
- row3 = to_row([('logo_partido', 12)])
+ [
+ ("sigla", 2),
+ ("nome", 6),
+ ("data_criacao", 2),
+ ("data_extincao", 2),
+ ]
+ )
+ row2 = to_row([("observacao", 12)])
+ row3 = to_row([("logo_partido", 12)])
self.helper = SaplFormHelper()
- self.helper.layout = Layout(
- row1, row2, row3,
- form_actions(label='Salvar'))
+ self.helper.layout = Layout(row1, row2, row3, form_actions(label="Salvar"))
def clean(self):
-
cleaned_data = super(PartidoForm, self).clean()
if not self.is_valid():
return cleaned_data
- if cleaned_data['data_criacao'] and cleaned_data['data_extincao']:
- if cleaned_data['data_criacao'] > cleaned_data['data_extincao']:
+ if cleaned_data["data_criacao"] and cleaned_data["data_extincao"]:
+ if cleaned_data["data_criacao"] > cleaned_data["data_extincao"]:
raise ValidationError(
- "Certifique-se de que a data de criação seja anterior à data de extinção.")
+ "Certifique-se de que a data de criação seja anterior à data de extinção."
+ )
return cleaned_data
class SaplSearchForm(ModelSearchForm):
-
def search(self):
sqs = super().search()
- return sqs.order_by('-last_update')
+ return sqs.order_by("-last_update")
"""def get_models(self):
Return a list of the selected models.
diff --git a/sapl/base/management/commands/backfill_auditlog.py b/sapl/base/management/commands/backfill_auditlog.py
index ba8bb6037..7677f9c9d 100644
--- a/sapl/base/management/commands/backfill_auditlog.py
+++ b/sapl/base/management/commands/backfill_auditlog.py
@@ -2,6 +2,7 @@ import json
import logging
from django.core.management.base import BaseCommand
+
from sapl.base.models import AuditLog
logger = logging.getLogger(__name__)
@@ -16,8 +17,7 @@ class Command(BaseCommand):
update_list = []
for log in logs:
try:
- obj = log.object[1:-1] \
- if log.object.startswith('[') else log.object
+ obj = log.object[1:-1] if log.object.startswith("[") else log.object
data = json.loads(obj)
log.data = data
except Exception as e:
@@ -27,12 +27,10 @@ class Command(BaseCommand):
else:
update_list.append(log)
if len(update_list) == 1000:
- AuditLog.objects.bulk_update(update_list, ['data'])
+ AuditLog.objects.bulk_update(update_list, ["data"])
update_list = []
if update_list:
- AuditLog.objects.bulk_update(update_list, ['data'])
+ AuditLog.objects.bulk_update(update_list, ["data"])
print(f"Logs backfilled: {len(logs) - error_counter}")
print(f"Logs with errors: {error_counter}")
print("Finished backfilling")
-
-
diff --git a/sapl/base/models.py b/sapl/base/models.py
index c0f56cf23..80a7000eb 100644
--- a/sapl/base/models.py
+++ b/sapl/base/models.py
@@ -1,9 +1,9 @@
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
-from django.db.models import JSONField
from django.core.cache import cache
from django.core.serializers.json import DjangoJSONEncoder
from django.db import models
+from django.db.models import JSONField
from django.db.models.deletion import CASCADE
from django.db.models.signals import post_migrate
from django.db.utils import DEFAULT_DB_ALIAS
@@ -12,37 +12,42 @@ from django.utils.translation import gettext_lazy as _
from sapl.utils import (LISTA_DE_UFS, YES_NO_CHOICES,
get_settings_auth_user_model, models_with_gr_for_model)
+DOC_ADM_OSTENSIVO = "O"
+DOC_ADM_RESTRITIVO = "R"
-DOC_ADM_OSTENSIVO = 'O'
-DOC_ADM_RESTRITIVO = 'R'
-
-TIPO_DOCUMENTO_ADMINISTRATIVO = ((DOC_ADM_OSTENSIVO, _('Ostensiva')),
- (DOC_ADM_RESTRITIVO, _('Restritiva')))
+TIPO_DOCUMENTO_ADMINISTRATIVO = (
+ (DOC_ADM_OSTENSIVO, _("Ostensiva")),
+ (DOC_ADM_RESTRITIVO, _("Restritiva")),
+)
-RELATORIO_ATOS_ACESSADOS = (('S', _('Sim')),
- ('N', _('Não')))
+RELATORIO_ATOS_ACESSADOS = (("S", _("Sim")), ("N", _("Não")))
-SEQUENCIA_NUMERACAO_PROTOCOLO = (('A', _('Sequencial por ano')),
- ('L', _('Sequencial por legislatura')),
- ('U', _('Sequencial único')))
+SEQUENCIA_NUMERACAO_PROTOCOLO = (
+ ("A", _("Sequencial por ano")),
+ ("L", _("Sequencial por legislatura")),
+ ("U", _("Sequencial único")),
+)
-SEQUENCIA_NUMERACAO_PROPOSICAO = (('A', _('Sequencial por ano para cada autor')),
- ('B', _('Sequencial por ano indepententemente do autor')))
+SEQUENCIA_NUMERACAO_PROPOSICAO = (
+ ("A", _("Sequencial por ano para cada autor")),
+ ("B", _("Sequencial por ano indepententemente do autor")),
+)
-ESFERA_FEDERACAO_CHOICES = (('M', _('Municipal')),
- ('E', _('Estadual')),
- ('F', _('Federal')),
- )
+ESFERA_FEDERACAO_CHOICES = (
+ ("M", _("Municipal")),
+ ("E", _("Estadual")),
+ ("F", _("Federal")),
+)
ASSINATURA_ATA_CHOICES = (
- ('M', _('Mesa Diretora da Sessão')),
- ('P', _('Apenas o Presidente da Sessão')),
- ('T', _('Todos os Parlamentares Presentes na Sessão')),
+ ("M", _("Mesa Diretora da Sessão")),
+ ("P", _("Apenas o Presidente da Sessão")),
+ ("T", _("Todos os Parlamentares Presentes na Sessão")),
)
ORDENACAO_PESQUISA_MATERIA = (
- ('S', _('Alfabética por Sigla')),
- ('R', _('Sequência Regimental')),
+ ("S", _("Alfabética por Sigla")),
+ ("R", _("Sequência Regimental")),
)
@@ -50,50 +55,40 @@ class CasaLegislativa(models.Model):
# TODO ajustar todos os max_length !!!!
# cod_casa => id (pk)
- codigo = models.CharField(max_length=100,
- blank=True,
- verbose_name=_('Codigo'))
- nome = models.CharField(max_length=100, verbose_name=_('Nome'))
- sigla = models.CharField(max_length=100, verbose_name=_('Sigla'))
- endereco = models.CharField(max_length=100, verbose_name=_('Endereço'))
- cep = models.CharField(max_length=100, blank=True, verbose_name=_('CEP'))
- municipio = models.CharField(max_length=50, verbose_name=_('Município'))
- uf = models.CharField(max_length=2,
- choices=LISTA_DE_UFS,
- verbose_name=_('UF'))
- telefone = models.CharField(
- max_length=100, blank=True, verbose_name=_('Telefone'))
- fax = models.CharField(
- max_length=100, blank=True, verbose_name=_('Fax'))
+ codigo = models.CharField(max_length=100, blank=True, verbose_name=_("Codigo"))
+ nome = models.CharField(max_length=100, verbose_name=_("Nome"))
+ sigla = models.CharField(max_length=100, verbose_name=_("Sigla"))
+ endereco = models.CharField(max_length=100, verbose_name=_("Endereço"))
+ cep = models.CharField(max_length=100, blank=True, verbose_name=_("CEP"))
+ municipio = models.CharField(max_length=50, verbose_name=_("Município"))
+ uf = models.CharField(max_length=2, choices=LISTA_DE_UFS, verbose_name=_("UF"))
+ telefone = models.CharField(max_length=100, blank=True, verbose_name=_("Telefone"))
+ fax = models.CharField(max_length=100, blank=True, verbose_name=_("Fax"))
logotipo = models.ImageField(
- blank=True,
- upload_to='sapl/public/casa/logotipo/',
- verbose_name=_('Logotipo'))
+ blank=True, upload_to="sapl/public/casa/logotipo/", verbose_name=_("Logotipo")
+ )
endereco_web = models.URLField(
- max_length=100, blank=True, verbose_name=_('HomePage'))
- email = models.EmailField(
- max_length=100, blank=True, verbose_name=_('E-mail'))
+ max_length=100, blank=True, verbose_name=_("HomePage")
+ )
+ email = models.EmailField(max_length=100, blank=True, verbose_name=_("E-mail"))
informacao_geral = models.TextField(
- max_length=100,
- blank=True,
- verbose_name=_('Informação Geral'))
+ max_length=100, blank=True, verbose_name=_("Informação Geral")
+ )
class Meta:
- verbose_name = _('Casa Legislativa')
- verbose_name_plural = _('Casa Legislativa')
- ordering = ('id',)
+ verbose_name = _("Casa Legislativa")
+ verbose_name_plural = _("Casa Legislativa")
+ ordering = ("id",)
def __str__(self):
- return _('Casa Legislativa de %(municipio)s') % {
- 'municipio': self.municipio}
+ return _("Casa Legislativa de %(municipio)s") % {"municipio": self.municipio}
class AppConfig(models.Model):
-
POLITICA_PROTOCOLO_CHOICES = (
- ('O', _('Sempre Gerar Protocolo')),
- ('C', _('Perguntar se é pra gerar protocolo ao incorporar')),
- ('N', _('Nunca Protocolar ao incorporar uma proposição')),
+ ("O", _("Sempre Gerar Protocolo")),
+ ("C", _("Perguntar se é pra gerar protocolo ao incorporar")),
+ ("N", _("Nunca Protocolar ao incorporar uma proposição")),
)
# MANTENHA A SEQUÊNCIA EQUIVALENTE COM /sapl/templates/base/layout.yaml
@@ -105,8 +100,9 @@ class AppConfig(models.Model):
max_length=1,
blank=True,
default="",
- verbose_name=_('Esfera Federação'),
- choices=ESFERA_FEDERACAO_CHOICES)
+ verbose_name=_("Esfera Federação"),
+ choices=ESFERA_FEDERACAO_CHOICES,
+ )
# MÓDULO PARLAMENTARES
@@ -120,29 +116,37 @@ class AppConfig(models.Model):
# Linha 1 -------------------------
documentos_administrativos = models.CharField(
max_length=1,
- verbose_name=_('Visibilidade dos Documentos Administrativos'),
- choices=TIPO_DOCUMENTO_ADMINISTRATIVO, default='O')
+ verbose_name=_("Visibilidade dos Documentos Administrativos"),
+ choices=TIPO_DOCUMENTO_ADMINISTRATIVO,
+ default="O",
+ )
tramitacao_documento = models.BooleanField(
verbose_name=_(
- 'Tramitar documentos anexados junto com os documentos principais?'),
- choices=YES_NO_CHOICES, default=True)
+ "Tramitar documentos anexados junto com os documentos principais?"
+ ),
+ choices=YES_NO_CHOICES,
+ default=True,
+ )
# Linha 2 -------------------------
protocolo_manual = models.BooleanField(
- verbose_name=_('Permitir informe manual de data e hora de protocolo?'),
- choices=YES_NO_CHOICES, default=False)
+ verbose_name=_("Permitir informe manual de data e hora de protocolo?"),
+ choices=YES_NO_CHOICES,
+ default=False,
+ )
sequencia_numeracao_protocolo = models.CharField(
max_length=1,
- verbose_name=_('Sequência de numeração de protocolos'),
- choices=SEQUENCIA_NUMERACAO_PROTOCOLO, default='A')
+ verbose_name=_("Sequência de numeração de protocolos"),
+ choices=SEQUENCIA_NUMERACAO_PROTOCOLO,
+ default="A",
+ )
inicio_numeracao_protocolo = models.PositiveIntegerField(
- verbose_name=_('Início da numeração de protocolo'),
- default=1
+ verbose_name=_("Início da numeração de protocolo"), default=1
)
# Linha 3 -------------------------
identificacao_de_documentos = models.CharField(
max_length=254,
- verbose_name=_('Formato da identificação dos documentos'),
- default='{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}',
+ verbose_name=_("Formato da identificação dos documentos"),
+ default="{sigla} Nº {numero}/{ano}{-}{complemento} - {nome}",
help_text="""
Como mostrar a identificação dos documentos administrativos?
Você pode usar um conjunto de combinações que pretender.
@@ -153,102 +157,124 @@ class AppConfig(models.Model):
Ainda pode ser usado {/}, {-}, {.} se você quiser que uma barra, traço, ou ponto
seja adicionado apenas se o próximo campo que será usado tenha algum conteúdo
(não use dois destes destes condicionais em sequência, somente o último será considerado).
- """
+ """,
)
# MÓDULO PROPOSIÇÕES
# Linha 1 ----------
sequencia_numeracao_proposicao = models.CharField(
max_length=1,
- verbose_name=_('Sequência de numeração de proposições'),
- choices=SEQUENCIA_NUMERACAO_PROPOSICAO, default='A')
+ verbose_name=_("Sequência de numeração de proposições"),
+ choices=SEQUENCIA_NUMERACAO_PROPOSICAO,
+ default="A",
+ )
receber_recibo_proposicao = models.BooleanField(
- verbose_name=_('Protocolar proposição somente com recibo?'),
- choices=YES_NO_CHOICES, default=True)
+ verbose_name=_("Protocolar proposição somente com recibo?"),
+ choices=YES_NO_CHOICES,
+ default=True,
+ )
proposicao_incorporacao_obrigatoria = models.CharField(
- verbose_name=_('Regra de incorporação de proposições e protocolo'),
- max_length=1, choices=POLITICA_PROTOCOLO_CHOICES, default='O')
+ verbose_name=_("Regra de incorporação de proposições e protocolo"),
+ max_length=1,
+ choices=POLITICA_PROTOCOLO_CHOICES,
+ default="O",
+ )
escolher_numero_materia_proposicao = models.BooleanField(
- verbose_name=_(
- 'Indicar número da matéria a ser gerada na proposição?'),
- choices=YES_NO_CHOICES, default=False)
+ verbose_name=_("Indicar número da matéria a ser gerada na proposição?"),
+ choices=YES_NO_CHOICES,
+ default=False,
+ )
# MÓDULO MATÉRIA LEGISLATIVA
# Linha 1 ------------------
tramitacao_origem_fixa = models.BooleanField(
verbose_name=_(
- 'Fixar origem de novas tramitações como sendo a tramitação de destino da última tramitação?'),
+ "Fixar origem de novas tramitações como sendo a tramitação de destino da última tramitação?"
+ ),
choices=YES_NO_CHOICES,
default=True,
- help_text=_('Ao utilizar a opção NÂO, você compreende que os controles '
- 'de origem e destino das tramitações são anulados, '
- 'podendo seu operador registrar quaisquer origem e '
- 'destino para as tramitações. Se você colocar Não, '
- 'fizer tramitações aleatórias e voltar para SIM, '
- 'o destino da tramitação mais recente será utilizado '
- 'para a origem de uma nova inserção!'))
+ help_text=_(
+ "Ao utilizar a opção NÂO, você compreende que os controles "
+ "de origem e destino das tramitações são anulados, "
+ "podendo seu operador registrar quaisquer origem e "
+ "destino para as tramitações. Se você colocar Não, "
+ "fizer tramitações aleatórias e voltar para SIM, "
+ "o destino da tramitação mais recente será utilizado "
+ "para a origem de uma nova inserção!"
+ ),
+ )
tramitacao_materia = models.BooleanField(
- verbose_name=_(
- 'Tramitar matérias anexadas junto com as matérias principais?'),
- choices=YES_NO_CHOICES, default=True)
+ verbose_name=_("Tramitar matérias anexadas junto com as matérias principais?"),
+ choices=YES_NO_CHOICES,
+ default=True,
+ )
ordenacao_pesquisa_materia = models.CharField(
max_length=1,
- verbose_name=_(
- 'Ordenação de Pesquisa da Matéria?'),
- choices=ORDENACAO_PESQUISA_MATERIA, default='S')
+ verbose_name=_("Ordenação de Pesquisa da Matéria?"),
+ choices=ORDENACAO_PESQUISA_MATERIA,
+ default="S",
+ )
# MÓDULO NORMAS JURÍDICAS
# MÓDULO TEXTOS ARTICULADOS
# Linha 1 -----------------
texto_articulado_proposicao = models.BooleanField(
- verbose_name=_('Usar Textos Articulados para Proposições'),
- choices=YES_NO_CHOICES, default=False)
+ verbose_name=_("Usar Textos Articulados para Proposições"),
+ choices=YES_NO_CHOICES,
+ default=False,
+ )
texto_articulado_materia = models.BooleanField(
- verbose_name=_('Usar Textos Articulados para Matérias'),
- choices=YES_NO_CHOICES, default=False)
+ verbose_name=_("Usar Textos Articulados para Matérias"),
+ choices=YES_NO_CHOICES,
+ default=False,
+ )
texto_articulado_norma = models.BooleanField(
- verbose_name=_('Usar Textos Articulados para Normas'),
- choices=YES_NO_CHOICES, default=True)
+ verbose_name=_("Usar Textos Articulados para Normas"),
+ choices=YES_NO_CHOICES,
+ default=True,
+ )
# MÓDULO SESSÃO PLENÁRIA
assinatura_ata = models.CharField(
- verbose_name=_('Quem deve assinar a ata'),
- max_length=1, choices=ASSINATURA_ATA_CHOICES, default='T')
+ verbose_name=_("Quem deve assinar a ata"),
+ max_length=1,
+ choices=ASSINATURA_ATA_CHOICES,
+ default="T",
+ )
# MÓDULO PAINEL
cronometro_discurso = models.DurationField(
- verbose_name=_('Cronômetro do Discurso'),
- blank=True,
- null=True)
+ verbose_name=_("Cronômetro do Discurso"), blank=True, null=True
+ )
cronometro_aparte = models.DurationField(
- verbose_name=_('Cronômetro do Aparte'),
- blank=True,
- null=True)
+ verbose_name=_("Cronômetro do Aparte"), blank=True, null=True
+ )
cronometro_ordem = models.DurationField(
- verbose_name=_('Cronômetro da Ordem'),
- blank=True,
- null=True)
+ verbose_name=_("Cronômetro da Ordem"), blank=True, null=True
+ )
cronometro_consideracoes = models.DurationField(
- verbose_name=_('Cronômetro de Considerações Finais'),
- blank=True,
- null=True)
+ verbose_name=_("Cronômetro de Considerações Finais"), blank=True, null=True
+ )
mostrar_brasao_painel = models.BooleanField(
- default=False,
- verbose_name=_('Mostrar brasão da Casa no painel?'))
+ default=False, verbose_name=_("Mostrar brasão da Casa no painel?")
+ )
mostrar_voto = models.BooleanField(
- verbose_name=_(
- 'Exibir voto do Parlamentar antes de encerrar a votação?'),
- choices=YES_NO_CHOICES, default=False)
+ verbose_name=_("Exibir voto do Parlamentar antes de encerrar a votação?"),
+ choices=YES_NO_CHOICES,
+ default=False,
+ )
# MÓDULO ESTATÍSTICAS DE ACESSO
estatisticas_acesso_normas = models.CharField(
max_length=1,
- verbose_name=_('Estatísticas de acesso a normas'),
- choices=RELATORIO_ATOS_ACESSADOS, default='N')
+ verbose_name=_("Estatísticas de acesso a normas"),
+ choices=RELATORIO_ATOS_ACESSADOS,
+ default="N",
+ )
# MÓDULO SEGURANÇA
@@ -260,37 +286,48 @@ class AppConfig(models.Model):
# choices=YES_NO_CHOICES, default=False)
google_recaptcha_site_key = models.CharField(
- verbose_name=_('Chave pública gerada pelo Google Recaptcha'),
- max_length=256, default='')
+ verbose_name=_("Chave pública gerada pelo Google Recaptcha"),
+ max_length=256,
+ default="",
+ )
google_recaptcha_secret_key = models.CharField(
- verbose_name=_('Chave privada gerada pelo Google Recaptcha'),
- max_length=256, default='')
+ verbose_name=_("Chave privada gerada pelo Google Recaptcha"),
+ max_length=256,
+ default="",
+ )
google_analytics_id_metrica = models.CharField(
- verbose_name=_('ID da Métrica do Google Analytics'),
- max_length=256, default='')
+ verbose_name=_("ID da Métrica do Google Analytics"), max_length=256, default=""
+ )
class Meta:
- verbose_name = _('Configurações da Aplicação')
- verbose_name_plural = _('Configurações da Aplicação')
+ verbose_name = _("Configurações da Aplicação")
+ verbose_name_plural = _("Configurações da Aplicação")
permissions = (
- ('menu_sistemas', _('Renderizar Menu Sistemas')),
- ('view_tabelas_auxiliares', _('Visualizar Tabelas Auxiliares')),
+ ("menu_sistemas", _("Renderizar Menu Sistemas")),
+ ("view_tabelas_auxiliares", _("Visualizar Tabelas Auxiliares")),
)
- ordering = ('-id',)
+ ordering = ("-id",)
- def save(self, force_insert=False, force_update=False, using=None,
- update_fields=None):
+ def save(
+ self, force_insert=False, force_update=False, using=None, update_fields=None
+ ):
fields = self._meta.get_fields()
for f in fields:
- if f.name != 'id' and not cache.get(f'sapl_{f.name}') is None:
- cache.set(f'sapl_{f.name}', getattr(self, f.name), 600)
-
- return models.Model.save(self, force_insert=force_insert, force_update=force_update, using=using, update_fields=update_fields)
+ if f.name != "id" and not cache.get(f"sapl_{f.name}") is None:
+ cache.set(f"sapl_{f.name}", getattr(self, f.name), 600)
+
+ return models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
@classmethod
def attr(cls, attr):
- value = cache.get(f'sapl_{attr}')
+ value = cache.get(f"sapl_{attr}")
if not value is None:
return value
@@ -301,34 +338,33 @@ class AppConfig(models.Model):
config.save()
value = getattr(config, attr)
- cache.set(f'sapl_{attr}', value, 600)
+ cache.set(f"sapl_{attr}", value, 600)
return value
def __str__(self):
- return _('Configurações da Aplicação - %(id)s') % {
- 'id': self.id}
+ return _("Configurações da Aplicação - %(id)s") % {"id": self.id}
class TipoAutor(models.Model):
descricao = models.CharField(
max_length=50,
- verbose_name=_('Descrição'),
- help_text=_(
- 'Obs: Não crie tipos de autores semelhante aos tipos fixos. ')
+ verbose_name=_("Descrição"),
+ help_text=_("Obs: Não crie tipos de autores semelhante aos tipos fixos. "),
)
content_type = models.OneToOneField(
ContentType,
null=True,
default=None,
- verbose_name=_('Modelagem no SAPL'),
- on_delete=models.PROTECT)
+ verbose_name=_("Modelagem no SAPL"),
+ on_delete=models.PROTECT,
+ )
class Meta:
- ordering = ['descricao']
- verbose_name = _('Tipo de Autor')
- verbose_name_plural = _('Tipos de Autor')
+ ordering = ["descricao"]
+ verbose_name = _("Tipo de Autor")
+ verbose_name_plural = _("Tipos de Autor")
def __str__(self):
return self.descricao
@@ -337,40 +373,29 @@ class TipoAutor(models.Model):
class Autor(models.Model):
operadores = models.ManyToManyField(
get_settings_auth_user_model(),
- through='OperadorAutor',
- through_fields=('autor', 'user'),
+ through="OperadorAutor",
+ through_fields=("autor", "user"),
symmetrical=False,
- related_name='autor_set',
- verbose_name='Operadores')
+ related_name="autor_set",
+ verbose_name="Operadores",
+ )
tipo = models.ForeignKey(
- TipoAutor,
- verbose_name=_('Tipo do Autor'),
- on_delete=models.PROTECT)
+ TipoAutor, verbose_name=_("Tipo do Autor"), on_delete=models.PROTECT
+ )
content_type = models.ForeignKey(
- ContentType,
- blank=True,
- null=True,
- default=None,
- on_delete=models.PROTECT)
- object_id = models.PositiveIntegerField(
- blank=True,
- null=True,
- default=None)
- autor_related = GenericForeignKey('content_type', 'object_id')
- nome = models.CharField(
- max_length=120,
- blank=True,
- verbose_name=_('Nome do Autor'))
- cargo = models.CharField(
- max_length=50,
- blank=True)
+ ContentType, blank=True, null=True, default=None, on_delete=models.PROTECT
+ )
+ object_id = models.PositiveIntegerField(blank=True, null=True, default=None)
+ autor_related = GenericForeignKey("content_type", "object_id")
+ nome = models.CharField(max_length=120, blank=True, verbose_name=_("Nome do Autor"))
+ cargo = models.CharField(max_length=50, blank=True)
class Meta:
- verbose_name = _('Autor')
- verbose_name_plural = _('Autores')
- unique_together = (('content_type', 'object_id'), )
- ordering = ('nome',)
+ verbose_name = _("Autor")
+ verbose_name_plural = _("Autores")
+ unique_together = (("content_type", "object_id"),)
+ ordering = ("nome",)
def __str__(self):
if self.autor_related:
@@ -378,107 +403,103 @@ class Autor(models.Model):
else:
if self.nome:
if self.cargo:
- return '{} - {}'.format(self.nome, self.cargo)
+ return "{} - {}".format(self.nome, self.cargo)
else:
return str(self.nome)
- return '?'
+ return "?"
class OperadorAutor(models.Model):
-
user = models.ForeignKey(
get_settings_auth_user_model(),
- verbose_name=_('Operador do Autor'),
- related_name='operadorautor_set',
- on_delete=CASCADE)
+ verbose_name=_("Operador do Autor"),
+ related_name="operadorautor_set",
+ on_delete=CASCADE,
+ )
autor = models.ForeignKey(
Autor,
- related_name='operadorautor_set',
- verbose_name=_('Autor'),
- on_delete=CASCADE)
+ related_name="operadorautor_set",
+ verbose_name=_("Autor"),
+ on_delete=CASCADE,
+ )
@property
def user_name(self):
- return '%s - %s' % (
- self.autor,
- self.user)
+ return "%s - %s" % (self.autor, self.user)
class Meta:
- verbose_name = _('Operador do Autor')
- verbose_name_plural = _('Operadores do Autor')
+ verbose_name = _("Operador do Autor")
+ verbose_name_plural = _("Operadores do Autor")
unique_together = (
- ('user', 'autor', ),)
+ (
+ "user",
+ "autor",
+ ),
+ )
def __str__(self):
return self.user_name
class AuditLog(models.Model):
-
- operation = ('C', 'D', 'U')
+ operation = ("C", "D", "U")
MAX_DATA_LENGTH = 4096 # 4KB de texto
- username = models.CharField(max_length=100,
- verbose_name=_('username'),
- blank=True,
- db_index=True)
- operation = models.CharField(max_length=1,
- verbose_name=_('operation'),
- db_index=True)
- timestamp = models.DateTimeField(verbose_name=_('timestamp'),
- db_index=True)
+ username = models.CharField(
+ max_length=100, verbose_name=_("username"), blank=True, db_index=True
+ )
+ operation = models.CharField(
+ max_length=1, verbose_name=_("operation"), db_index=True
+ )
+ timestamp = models.DateTimeField(verbose_name=_("timestamp"), db_index=True)
# DEPRECATED FIELD! TO BE REMOVED (EVENTUALLY)
- object = models.CharField(max_length=MAX_DATA_LENGTH,
- blank=True,
- verbose_name=_('object'))
- data = JSONField(null=True, verbose_name=_('data'))
- object_id = models.PositiveIntegerField(verbose_name=_('object_id'),
- db_index=True)
- model_name = models.CharField(max_length=100,
- verbose_name=_('model'),
- db_index=True)
- app_name = models.CharField(max_length=100,
- verbose_name=_('app'),
- db_index=True)
+ object = models.CharField(
+ max_length=MAX_DATA_LENGTH, blank=True, verbose_name=_("object")
+ )
+ data = JSONField(null=True, verbose_name=_("data"))
+ object_id = models.PositiveIntegerField(verbose_name=_("object_id"), db_index=True)
+ model_name = models.CharField(
+ max_length=100, verbose_name=_("model"), db_index=True
+ )
+ app_name = models.CharField(max_length=100, verbose_name=_("app"), db_index=True)
class Meta:
- verbose_name = _('AuditLog')
- verbose_name_plural = _('AuditLogs')
- ordering = ('-id', '-timestamp')
+ verbose_name = _("AuditLog")
+ verbose_name_plural = _("AuditLogs")
+ ordering = ("-id", "-timestamp")
def __str__(self):
- return "[%s] %s %s.%s %s" % (self.timestamp,
- self.operation,
- self.app_name,
- self.model_name,
- self.username,
- )
+ return "[%s] %s %s.%s %s" % (
+ self.timestamp,
+ self.operation,
+ self.app_name,
+ self.model_name,
+ self.username,
+ )
class Metadata(models.Model):
content_type = models.ForeignKey(
- ContentType,
+ ContentType, blank=True, null=True, default=None, on_delete=models.PROTECT
+ )
+ object_id = models.PositiveIntegerField(blank=True, null=True, default=None)
+ content_object = GenericForeignKey("content_type", "object_id")
+
+ metadata = JSONField(
+ verbose_name=_("Metadados"),
blank=True,
null=True,
default=None,
- on_delete=models.PROTECT)
- object_id = models.PositiveIntegerField(
- blank=True,
- null=True,
- default=None)
- content_object = GenericForeignKey('content_type', 'object_id')
-
- metadata = JSONField(
- verbose_name=_('Metadados'),
- blank=True, null=True, default=None, encoder=DjangoJSONEncoder)
+ encoder=DjangoJSONEncoder,
+ )
class Meta:
- verbose_name = _('Metadado')
- verbose_name_plural = _('Metadados')
- unique_together = (('content_type', 'object_id'), )
+ verbose_name = _("Metadado")
+ verbose_name_plural = _("Metadados")
+ unique_together = (("content_type", "object_id"),)
def __str__(self):
- return f'Metadata de {self.content_object}'
+ return f"Metadata de {self.content_object}"
diff --git a/sapl/base/receivers.py b/sapl/base/receivers.py
index 281f4e818..bc2252489 100644
--- a/sapl/base/receivers.py
+++ b/sapl/base/receivers.py
@@ -1,37 +1,36 @@
-from datetime import datetime
import inspect
import logging
+from datetime import datetime
-from PyPDF4.pdf import PdfFileReader
from asn1crypto import cms
from django.conf import settings
from django.contrib.contenttypes.models import ContentType
from django.core import serializers
from django.core.files.uploadedfile import InMemoryUploadedFile, UploadedFile
from django.db.models.fields.files import FileField
-from django.db.models.signals import post_delete, post_save, \
- post_migrate, pre_save, pre_migrate
+from django.db.models.signals import (post_delete, post_migrate, post_save,
+ pre_migrate, pre_save)
from django.db.utils import DEFAULT_DB_ALIAS
from django.dispatch import receiver
from django.utils import timezone
from django.utils.translation import gettext_lazy as _
+from PyPDF4.pdf import PdfFileReader
from sapl.base.email_utils import do_envia_email_tramitacao
-from sapl.base.models import AuditLog, TipoAutor, Autor, Metadata
+from sapl.base.models import AuditLog, Autor, Metadata, TipoAutor
from sapl.decorators import receiver_multi_senders
from sapl.materia.models import Tramitacao
from sapl.parlamentares.models import Parlamentar
from sapl.protocoloadm.models import TramitacaoAdministrativo
from sapl.utils import get_base_url, models_with_gr_for_model
-
models_with_gr_for_autor = models_with_gr_for_model(Autor)
@receiver_multi_senders(post_save, senders=models_with_gr_for_autor)
def handle_update_autor_related(sender, **kwargs):
# for m in models_with_gr_for_autor:
- instance = kwargs.get('instance')
+ instance = kwargs.get("instance")
autor = instance.autor.first()
if autor:
autor.nome = str(instance)
@@ -43,7 +42,7 @@ def handle_update_autor_related(sender, **kwargs):
def handle_tramitacao_signal(sender, **kwargs):
logger = logging.getLogger(__name__)
- tramitacao = kwargs.get('instance')
+ tramitacao = kwargs.get("instance")
if isinstance(tramitacao, Tramitacao):
tipo = "materia"
@@ -54,9 +53,9 @@ def handle_tramitacao_signal(sender, **kwargs):
pilha_de_execucao = inspect.stack()
for i in pilha_de_execucao:
- if i.function == 'migrate':
+ if i.function == "migrate":
return
- request = i.frame.f_locals.get('request', None)
+ request = i.frame.f_locals.get("request", None)
if request:
break
@@ -69,22 +68,25 @@ def handle_tramitacao_signal(sender, **kwargs):
tipo,
doc_mat,
tramitacao.status,
- tramitacao.unidade_tramitacao_destino)
+ tramitacao.unidade_tramitacao_destino,
+ )
except Exception as e:
- logger.error(f'user={request.user.username}. Tramitação criada, mas e-mail de acompanhamento '
- 'de matéria não enviado. Há problemas na configuração '
- 'do e-mail. ' + str(e))
+ logger.error(
+ f"user={request.user.username}. Tramitação criada, mas e-mail de acompanhamento "
+ "de matéria não enviado. Há problemas na configuração "
+ "do e-mail. " + str(e)
+ )
@receiver(post_delete)
def status_tramitacao_materia(sender, instance, **kwargs):
if sender == Tramitacao:
- if instance.status.indicador == 'F':
+ if instance.status.indicador == "F":
materia = instance.materia
materia.em_tramitacao = True
materia.save()
elif sender == TramitacaoAdministrativo:
- if instance.status.indicador == 'F':
+ if instance.status.indicador == "F":
documento = instance.documento
documento.tramitacao = True
documento.save()
@@ -92,15 +94,17 @@ def status_tramitacao_materia(sender, instance, **kwargs):
def audit_log_function(sender, **kwargs):
try:
- if not (sender._meta.app_config.name.startswith('sapl') or
- sender._meta.label == settings.AUTH_USER_MODEL):
+ if not (
+ sender._meta.app_config.name.startswith("sapl")
+ or sender._meta.label == settings.AUTH_USER_MODEL
+ ):
return
except:
# não é necessário usar logger, aqui é usada apenas para
# eliminar um o if complexo
return
- instance = kwargs.get('instance')
+ instance = kwargs.get("instance")
if instance._meta.model == AuditLog:
return
@@ -109,9 +113,9 @@ def audit_log_function(sender, **kwargs):
u = None
pilha_de_execucao = inspect.stack()
for i in pilha_de_execucao:
- if i.function == 'migrate':
+ if i.function == "migrate":
return
- r = i.frame.f_locals.get('request', None)
+ r = i.frame.f_locals.get("request", None)
try:
if r.user._meta.label == settings.AUTH_USER_MODEL:
u = r.user
@@ -122,15 +126,16 @@ def audit_log_function(sender, **kwargs):
pass
try:
- operation = kwargs.get('operation')
+ operation = kwargs.get("operation")
user = u
model_name = instance.__class__.__name__
app_name = instance._meta.app_label
object_id = instance.id
try:
import json
+
# [1:-1] below removes the surrounding square brackets
- str_data = serializers.serialize('json', [instance])[1:-1]
+ str_data = serializers.serialize("json", [instance])[1:-1]
data = json.loads(str_data)
except:
# old version capped string at AuditLog.MAX_DATA_LENGTH
@@ -140,58 +145,61 @@ def audit_log_function(sender, **kwargs):
if user:
username = user.username
else:
- username = ''
-
- AuditLog.objects.create(username=username,
- operation=operation,
- model_name=model_name,
- app_name=app_name,
- timestamp=timezone.now(),
- object_id=object_id,
- object='',
- data=data)
+ username = ""
+
+ AuditLog.objects.create(
+ username=username,
+ operation=operation,
+ model_name=model_name,
+ app_name=app_name,
+ timestamp=timezone.now(),
+ object_id=object_id,
+ object="",
+ data=data,
+ )
except Exception as e:
- logger.error('Error saving auditing log object')
+ logger.error("Error saving auditing log object")
logger.error(e)
@receiver(post_delete)
def audit_log_post_delete(sender, **kwargs):
- audit_log_function(sender, operation='D', **kwargs)
+ audit_log_function(sender, operation="D", **kwargs)
@receiver(post_save)
def audit_log_post_save(sender, **kwargs):
- operation = 'C' if kwargs.get('created') else 'U'
+ operation = "C" if kwargs.get("created") else "U"
audit_log_function(sender, operation=operation, **kwargs)
-def cria_models_tipo_autor(app_config=None, verbosity=2, interactive=True,
- using=DEFAULT_DB_ALIAS, **kwargs):
-
- print("\n\033[93m\033[1m{}\033[0m".format(
- _('Atualizando registros TipoAutor do SAPL:')))
+def cria_models_tipo_autor(
+ app_config=None, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, **kwargs
+):
+ print(
+ "\n\033[93m\033[1m{}\033[0m".format(
+ _("Atualizando registros TipoAutor do SAPL:")
+ )
+ )
for model in models_with_gr_for_autor:
content_type = ContentType.objects.get_for_model(model)
- tipo_autor = TipoAutor.objects.filter(
- content_type=content_type.id).exists()
+ tipo_autor = TipoAutor.objects.filter(content_type=content_type.id).exists()
if tipo_autor:
- msg1 = "Carga de {} não efetuada.".format(
- TipoAutor._meta.verbose_name)
+ msg1 = "Carga de {} não efetuada.".format(TipoAutor._meta.verbose_name)
msg2 = " Já Existe um {} {} relacionado...".format(
- TipoAutor._meta.verbose_name,
- model._meta.verbose_name)
+ TipoAutor._meta.verbose_name, model._meta.verbose_name
+ )
msg = " {}{}".format(msg1, msg2)
else:
novo_autor = TipoAutor()
novo_autor.content_type_id = content_type.id
novo_autor.descricao = model._meta.verbose_name
novo_autor.save()
- msg1 = "Carga de {} efetuada.".format(
- TipoAutor._meta.verbose_name)
+ msg1 = "Carga de {} efetuada.".format(TipoAutor._meta.verbose_name)
msg2 = " {} {} criado...".format(
- TipoAutor._meta.verbose_name, content_type.model)
+ TipoAutor._meta.verbose_name, content_type.model
+ )
msg = " {}{}".format(msg1, msg2)
print(msg)
# Disconecta função para evitar a chamada repetidas vezes.
@@ -202,62 +210,60 @@ post_migrate.connect(receiver=cria_models_tipo_autor)
def signed_files_extraction_function(sender, instance, **kwargs):
-
def run_signed_name_and_date_via_fields(fields):
signs = []
for key, field in fields.items():
-
- if '/FT' not in field and field['/FT'] != '/Sig':
+ if "/FT" not in field and field["/FT"] != "/Sig":
continue
- if '/V' not in field:
+ if "/V" not in field:
continue
- content_sign = field['/V']['/Contents']
- nome = 'Nome do assinante não localizado.'
- oname = ''
+ content_sign = field["/V"]["/Contents"]
+ nome = "Nome do assinante não localizado."
+ oname = ""
try:
info = cms.ContentInfo.load(content_sign)
- signed_data = info['content']
+ signed_data = info["content"]
oun_old = []
- for cert in signed_data['certificates']:
- subject = cert.native['tbs_certificate']['subject']
- issuer = cert.native['tbs_certificate']['issuer']
- oname = issuer.get('organization_name', '')
+ for cert in signed_data["certificates"]:
+ subject = cert.native["tbs_certificate"]["subject"]
+ issuer = cert.native["tbs_certificate"]["issuer"]
+ oname = issuer.get("organization_name", "")
- if oname in ('Gov-Br', '1Doc'):
- nome = subject['common_name'].split(':')[0]
+ if oname in ("Gov-Br", "1Doc"):
+ nome = subject["common_name"].split(":")[0]
continue
- oun = subject['organizational_unit_name']
+ oun = subject["organizational_unit_name"]
if isinstance(oun, str):
continue
if len(oun) > len(oun_old):
oun_old = oun
- nome = subject['common_name'].split(':')[0]
+ nome = subject["common_name"].split(":")[0]
if oun and isinstance(oun, list) and len(oun) == 4:
- oname += ' - ' + oun[3]
+ oname += " - " + oun[3]
break
except:
- if '/Name' in field['/V']:
- nome = field['/V']['/Name']
+ if "/Name" in field["/V"]:
+ nome = field["/V"]["/Name"]
fd = None
try:
- data = str(field['/V']['/M'])
+ data = str(field["/V"]["/M"])
- if 'D:' not in data:
+ if "D:" not in data:
data = None
else:
- if not data.endswith('Z'):
- data = data.replace('Z', '+')
- data = data.replace("'", '')
+ if not data.endswith("Z"):
+ data = data.replace("Z", "+")
+ data = data.replace("'", "")
- fd = datetime.strptime(data[2:], '%Y%m%d%H%M%S%z')
+ fd = datetime.strptime(data[2:], "%Y%m%d%H%M%S%z")
except:
pass
@@ -288,13 +294,17 @@ def signed_files_extraction_function(sender, instance, **kwargs):
pdf = PdfFileReader(file)
fields = pdf.getFields()
fields_br = list(
- map(lambda x: x.get('/V', {}).get('/ByteRange', []), fields.values()))
+ map(lambda x: x.get("/V", {}).get("/ByteRange", []), fields.values())
+ )
except Exception as e:
try:
pdf = PdfFileReader(file, strict=False)
fields = pdf.getFields()
fields_br = list(
- map(lambda x: x.get('/V', {}).get('/ByteRange', []), fields.values()))
+ map(
+ lambda x: x.get("/V", {}).get("/ByteRange", []), fields.values()
+ )
+ )
except Exception as ee:
fields = ee
@@ -307,50 +317,49 @@ def signed_files_extraction_function(sender, instance, **kwargs):
return signs
for n in byterange:
-
start = pdfdata.find(b"[", n)
stop = pdfdata.find(b"]", start)
assert n != -1 and start != -1 and stop != -1
n += 1
- br = [int(i, 10) for i in pdfdata[start + 1: stop].split()]
+ br = [int(i, 10) for i in pdfdata[start + 1 : stop].split()]
if br in fields_br:
continue
- contents = pdfdata[br[0] + br[1] + 1: br[2] - 1]
+ contents = pdfdata[br[0] + br[1] + 1 : br[2] - 1]
bcontents = bytes.fromhex(contents.decode("utf8"))
- data1 = pdfdata[br[0]: br[0] + br[1]]
- data2 = pdfdata[br[2]: br[2] + br[3]]
- #signedData = data1 + data2
+ data1 = pdfdata[br[0] : br[0] + br[1]]
+ data2 = pdfdata[br[2] : br[2] + br[3]]
+ # signedData = data1 + data2
- not_nome = nome = 'Nome do assinante não localizado.'
- oname = ''
+ not_nome = nome = "Nome do assinante não localizado."
+ oname = ""
try:
info = cms.ContentInfo.load(bcontents)
- signed_data = info['content']
+ signed_data = info["content"]
oun_old = []
- for cert in signed_data['certificates']:
- subject = cert.native['tbs_certificate']['subject']
- issuer = cert.native['tbs_certificate']['issuer']
- oname = issuer.get('organization_name', '')
+ for cert in signed_data["certificates"]:
+ subject = cert.native["tbs_certificate"]["subject"]
+ issuer = cert.native["tbs_certificate"]["issuer"]
+ oname = issuer.get("organization_name", "")
- if oname in ('Gov-Br', '1Doc'):
- nome = subject['common_name'].split(':')[0]
+ if oname in ("Gov-Br", "1Doc"):
+ nome = subject["common_name"].split(":")[0]
continue
- oun = subject['organizational_unit_name']
+ oun = subject["organizational_unit_name"]
if isinstance(oun, str):
continue
if len(oun) > len(oun_old):
oun_old = oun
- nome = subject['common_name'].split(':')[0]
+ nome = subject["common_name"].split(":")[0]
if oun and isinstance(oun, list) and len(oun) == 4:
- oname += ' - ' + oun[3]
+ oname += " - " + oun[3]
break
except Exception as e:
@@ -366,50 +375,51 @@ def signed_files_extraction_function(sender, instance, **kwargs):
return signs
def signed_name_and_date_extract(file):
-
try:
signs = run_signed_name_and_date_extract(file)
except:
return {}
- signs = sorted(signs, key=lambda sign: (
- sign[0], sign[1][1], sign[1][0]))
+ signs = sorted(signs, key=lambda sign: (sign[0], sign[1][1], sign[1][0]))
signs_dict = {}
for s in signs:
- if s[0] not in signs_dict or 'ICP' in s[1][1] and 'ICP' not in signs_dict[s[0]][1]:
+ if (
+ s[0] not in signs_dict
+ or "ICP" in s[1][1]
+ and "ICP" not in signs_dict[s[0]][1]
+ ):
signs_dict[s[0]] = s[1]
- signs = sorted(signs_dict.items(), key=lambda sign: (
- sign[0], sign[1][1], sign[1][0]))
+ signs = sorted(
+ signs_dict.items(), key=lambda sign: (sign[0], sign[1][1], sign[1][0])
+ )
sr = []
for s in signs:
- tt = s[0].title().split(' ')
+ tt = s[0].title().split(" ")
for idx, t in enumerate(tt):
- if t in ('Dos', 'De', 'Da', 'Do', 'Das', 'E'):
+ if t in ("Dos", "De", "Da", "Do", "Das", "E"):
tt[idx] = t.lower()
- sr.append((' '.join(tt), s[1]))
+ sr.append((" ".join(tt), s[1]))
signs = sr
- meta_signs = {
- 'autores': [],
- 'admin': []
- }
+ meta_signs = {"autores": [], "admin": []}
for s in signs:
# cn = # settings.CERT_PRIVATE_KEY_NAME
- #meta_signs['admin' if s[0] == cn else 'autores'].append(s)
- meta_signs['autores'].append(s)
+ # meta_signs['admin' if s[0] == cn else 'autores'].append(s)
+ meta_signs["autores"].append(s)
return meta_signs
def filefield_from_model(m):
fields = m._meta.get_fields()
- fields = tuple(map(lambda f: f.name, filter(
- lambda x: isinstance(x, FileField), fields)))
+ fields = tuple(
+ map(lambda f: f.name, filter(lambda x: isinstance(x, FileField), fields))
+ )
return fields
FIELDFILE_NAME = filefield_from_model(instance)
@@ -419,19 +429,17 @@ def signed_files_extraction_function(sender, instance, **kwargs):
try:
md = Metadata.objects.get(
- content_type=ContentType.objects.get_for_model(
- instance._meta.model),
- object_id=instance.id,).metadata
+ content_type=ContentType.objects.get_for_model(instance._meta.model),
+ object_id=instance.id,
+ ).metadata
except:
md = {}
for fn in FIELDFILE_NAME: # fn -> field_name
ff = getattr(instance, fn) # ff -> file_field
- if md and 'signs' in md and \
- fn in md['signs'] and\
- md['signs'][fn]:
- md['signs'][fn] = {}
+ if md and "signs" in md and fn in md["signs"] and md["signs"][fn]:
+ md["signs"][fn] = {}
if not ff:
continue
@@ -448,35 +456,34 @@ def signed_files_extraction_function(sender, instance, **kwargs):
file.seek(0)
meta_signs = signed_name_and_date_extract(file)
- if not meta_signs or not meta_signs['autores'] and not meta_signs['admin']:
+ if not meta_signs or not meta_signs["autores"] and not meta_signs["admin"]:
continue
if not md:
- md = {'signs': {}}
+ md = {"signs": {}}
- if 'signs' not in md:
- md['signs'] = {}
+ if "signs" not in md:
+ md["signs"] = {}
- md['signs'][fn] = meta_signs
+ md["signs"][fn] = meta_signs
except Exception as e:
# print(e)
pass
if md:
metadata = Metadata.objects.get_or_create(
- content_type=ContentType.objects.get_for_model(
- instance._meta.model),
- object_id=instance.id,)
+ content_type=ContentType.objects.get_for_model(instance._meta.model),
+ object_id=instance.id,
+ )
metadata[0].metadata = md
metadata[0].save()
-@receiver(pre_save, dispatch_uid='signed_files_extraction_pre_save_signal')
+@receiver(pre_save, dispatch_uid="signed_files_extraction_pre_save_signal")
def signed_files_extraction_pre_save_signal(sender, instance, **kwargs):
-
signed_files_extraction_function(sender, instance, **kwargs)
-@receiver(pre_migrate, dispatch_uid='disconnect_signals_pre_migrate')
+@receiver(pre_migrate, dispatch_uid="disconnect_signals_pre_migrate")
def disconnect_signals_pre_migrate(*args, **kwargs):
- pre_save.disconnect(dispatch_uid='signed_files_extraction_pre_save_signal')
+ pre_save.disconnect(dispatch_uid="signed_files_extraction_pre_save_signal")
diff --git a/sapl/base/search_indexes.py b/sapl/base/search_indexes.py
index d0432aded..41f3cb5b3 100644
--- a/sapl/base/search_indexes.py
+++ b/sapl/base/search_indexes.py
@@ -21,7 +21,6 @@ from sapl.utils import RemoveTag
class TextExtractField(CharField):
-
backend = None
logger = logging.getLogger(__name__)
@@ -30,39 +29,40 @@ class TextExtractField(CharField):
assert self.model_attr
if not isinstance(self.model_attr, (list, tuple)):
- self.model_attr = (self.model_attr, )
+ self.model_attr = (self.model_attr,)
def solr_extraction(self, arquivo):
if not self.backend:
- self.backend = connections['default'].get_backend()
+ self.backend = connections["default"].get_backend()
try:
- with open(arquivo.path, 'rb') as f:
+ with open(arquivo.path, "rb") as f:
content = self.backend.extract_file_contents(f)
- data = ''
+ data = ""
if content:
# update from Solr 7.5 to 8.9
- if content['contents']:
- data += content['contents']
- if content['file']:
- data += content['file']
+ if content["contents"]:
+ data += content["contents"]
+ if content["file"]:
+ data += content["file"]
return data
except Exception as e:
- print('erro processando arquivo: ' % arquivo.path)
+ print("erro processando arquivo: " % arquivo.path)
self.logger.error(arquivo.path)
- self.logger.error('erro processando arquivo: ' % arquivo.path)
- data = ''
+ self.logger.error("erro processando arquivo: " % arquivo.path)
+ data = ""
return data
def print_error(self, arquivo, error):
- msg = 'Erro inesperado processando arquivo %s erro: %s' % (
- arquivo.path, error)
+ msg = "Erro inesperado processando arquivo %s erro: %s" % (arquivo.path, error)
print(msg, error)
self.logger.error(msg, error)
def file_extractor(self, arquivo):
- if not os.path.exists(arquivo.path) or \
- not os.path.splitext(arquivo.path)[1][:1]:
- return ''
+ if (
+ not os.path.exists(arquivo.path)
+ or not os.path.splitext(arquivo.path)[1][:1]
+ ):
+ return ""
# Em ambiente de produção utiliza-se o SOLR
if SOLR_URL:
@@ -71,33 +71,34 @@ class TextExtractField(CharField):
except Exception as err:
print(str(err))
self.print_error(arquivo, err)
- return ''
+ return ""
def ta_extractor(self, value):
r = []
- for ta in value.filter(privacidade__in=[
- STATUS_TA_PUBLIC,
- STATUS_TA_IMMUTABLE_PUBLIC]):
- dispositivos = Dispositivo.objects.filter(
- Q(ta=ta) | Q(ta_publicado=ta)
- ).order_by(
- 'ordem'
- ).annotate(
- rotulo_texto=Concat(
- F('rotulo'), Value(' '), F('texto'),
- output_field=TextField(),
+ for ta in value.filter(
+ privacidade__in=[STATUS_TA_PUBLIC, STATUS_TA_IMMUTABLE_PUBLIC]
+ ):
+ dispositivos = (
+ Dispositivo.objects.filter(Q(ta=ta) | Q(ta_publicado=ta))
+ .order_by("ordem")
+ .annotate(
+ rotulo_texto=Concat(
+ F("rotulo"),
+ Value(" "),
+ F("texto"),
+ output_field=TextField(),
+ )
)
- ).values_list(
- 'rotulo_texto', flat=True)
+ .values_list("rotulo_texto", flat=True)
+ )
r += list(filter(lambda x: x.strip(), dispositivos))
- return ' '.join(r)
+ return " ".join(r)
def string_extractor(self, value):
return value
def extract_data(self, obj):
-
- data = ''
+ data = ""
for attr, func in self.model_attr:
if not hasattr(obj, attr) or not hasattr(self, func):
@@ -106,32 +107,33 @@ class TextExtractField(CharField):
value = getattr(obj, attr)
if not value:
continue
- data += getattr(self, func)(value) + ' '
+ data += getattr(self, func)(value) + " "
- data = data.replace('\\n', ' ')
+ data = data.replace("\\n", " ")
return data
def prepare_template(self, obj):
app_label, model_name = get_model_ct_tuple(obj)
- template_names = ['search/indexes/%s/%s_%s.txt' %
- (app_label, model_name, self.instance_name)]
+ template_names = [
+ "search/indexes/%s/%s_%s.txt" % (app_label, model_name, self.instance_name)
+ ]
t = loader.select_template(template_names)
- return t.render({'object': obj,
- 'extracted': self.extract_data(obj)})
+ return t.render({"object": obj, "extracted": self.extract_data(obj)})
class DocumentoAcessorioIndex(SearchIndex, Indexable):
model = DocumentoAcessorio
text = TextExtractField(
- document=True, use_template=True,
+ document=True,
+ use_template=True,
model_attr=(
- ('arquivo', 'file_extractor'),
- ('ementa', 'string_extractor'),
- ('indexacao', 'string_extractor'),
- )
+ ("arquivo", "file_extractor"),
+ ("ementa", "string_extractor"),
+ ("indexacao", "string_extractor"),
+ ),
)
def __init__(self, **kwargs):
@@ -145,44 +147,47 @@ class DocumentoAcessorioIndex(SearchIndex, Indexable):
return self.get_model().objects.all()
def get_updated_field(self):
- return 'data_ultima_atualizacao'
+ return "data_ultima_atualizacao"
class NormaJuridicaIndex(DocumentoAcessorioIndex):
model = NormaJuridica
text = TextExtractField(
- document=True, use_template=True,
+ document=True,
+ use_template=True,
model_attr=(
- ('texto_integral', 'file_extractor'),
- ('texto_articulado', 'ta_extractor'),
- ('ementa', 'string_extractor'),
- ('indexacao', 'string_extractor'),
- ('observacao', 'string_extractor'),
- )
+ ("texto_integral", "file_extractor"),
+ ("texto_articulado", "ta_extractor"),
+ ("ementa", "string_extractor"),
+ ("indexacao", "string_extractor"),
+ ("observacao", "string_extractor"),
+ ),
)
class MateriaLegislativaIndex(DocumentoAcessorioIndex):
model = MateriaLegislativa
text = TextExtractField(
- document=True, use_template=True,
+ document=True,
+ use_template=True,
model_attr=(
- ('texto_original', 'file_extractor'),
- ('texto_articulado', 'ta_extractor'),
- ('ementa', 'string_extractor'),
- ('indexacao', 'string_extractor'),
- ('observacao', 'string_extractor'),
- )
+ ("texto_original", "file_extractor"),
+ ("texto_articulado", "ta_extractor"),
+ ("ementa", "string_extractor"),
+ ("indexacao", "string_extractor"),
+ ("observacao", "string_extractor"),
+ ),
)
class SessaoPlenariaIndex(DocumentoAcessorioIndex):
model = SessaoPlenaria
text = TextExtractField(
- document=True, use_template=True,
+ document=True,
+ use_template=True,
model_attr=(
- ('upload_ata', 'file_extractor'),
- ('upload_anexo', 'file_extractor'),
- ('upload_pauta', 'file_extractor'),
- )
+ ("upload_ata", "file_extractor"),
+ ("upload_anexo", "file_extractor"),
+ ("upload_pauta", "file_extractor"),
+ ),
)
diff --git a/sapl/base/templatetags/base_tags.py b/sapl/base/templatetags/base_tags.py
index 1583cd75f..9e5bde5c5 100644
--- a/sapl/base/templatetags/base_tags.py
+++ b/sapl/base/templatetags/base_tags.py
@@ -1,4 +1,3 @@
-
from django import template
register = template.Library()
@@ -6,4 +5,6 @@ register = template.Library()
@register.filter
def tipoautor_contenttype_list(tipo):
- return 'sapl.' + tipo.content_type.app_label + ':' + tipo.content_type.model + '_list'
+ return (
+ "sapl." + tipo.content_type.app_label + ":" + tipo.content_type.model + "_list"
+ )
diff --git a/sapl/base/templatetags/common_tags.py b/sapl/base/templatetags/common_tags.py
index 84f61b64f..cfcc38145 100644
--- a/sapl/base/templatetags/common_tags.py
+++ b/sapl/base/templatetags/common_tags.py
@@ -7,22 +7,24 @@ from django.utils.safestring import mark_safe
from webpack_loader import utils
from sapl.base.models import AppConfig
-from sapl.materia.models import DocumentoAcessorio, MateriaLegislativa, Proposicao
+from sapl.materia.models import (DocumentoAcessorio, MateriaLegislativa,
+ Proposicao)
from sapl.norma.models import NormaJuridica
from sapl.parlamentares.models import Filiacao
from sapl.sessao.models import SessaoPlenaria
-from sapl.utils import filiacao_data, SEPARADOR_HASH_PROPOSICAO, is_report_allowed
+from sapl.utils import (SEPARADOR_HASH_PROPOSICAO, filiacao_data,
+ is_report_allowed)
register = template.Library()
def get_class(class_string):
- if not hasattr(class_string, '__bases__'):
+ if not hasattr(class_string, "__bases__"):
class_string = str(class_string)
- dot = class_string.rindex('.')
- mod_name, class_name = class_string[:dot], class_string[dot + 1:]
+ dot = class_string.rindex(".")
+ mod_name, class_name = class_string[:dot], class_string[dot + 1 :]
if class_name:
- return getattr(__import__(mod_name, {}, {}, [str('')]), class_name)
+ return getattr(__import__(mod_name, {}, {}, [str("")]), class_name)
@register.simple_tag
@@ -66,7 +68,13 @@ def model_verbose_name_plural(class_name):
@register.filter
def obfuscate_value(value, key):
- if key in ["hash", "google_recaptcha_secret_key", "password", "google_recaptcha_site_key", "hash_code"]:
+ if key in [
+ "hash",
+ "google_recaptcha_secret_key",
+ "password",
+ "google_recaptcha_site_key",
+ "hash_code",
+ ]:
return "***************"
return value
@@ -98,7 +106,7 @@ def meta_model_value(instance, attr):
try:
return getattr(instance._meta, attr)
except:
- return ''
+ return ""
@register.filter
@@ -121,15 +129,16 @@ def sort_by_keys(value, key):
transformed = []
id_props = [x.id for x in value]
qs = Proposicao.objects.filter(pk__in=id_props)
- key_descricao = {'1': 'data_envio',
- '-1': '-data_envio',
- '2': 'tipo',
- '-2': '-tipo',
- '3': 'descricao',
- '-3': '-descricao',
- '4': 'autor',
- '-4': '-autor'
- }
+ key_descricao = {
+ "1": "data_envio",
+ "-1": "-data_envio",
+ "2": "tipo",
+ "-2": "-tipo",
+ "3": "descricao",
+ "-3": "-descricao",
+ "4": "autor",
+ "-4": "-autor",
+ }
transformed = qs.order_by(key_descricao[key])
return transformed
@@ -176,7 +185,7 @@ def isinst(value, class_str):
@register.filter
@stringfilter
def strip_hash(value):
- vet = value.split('/')
+ vet = value.split("/")
if len(vet) == 2:
return vet[0][1:]
else:
@@ -193,7 +202,7 @@ def get_add_perm(value, arg):
except AttributeError:
return None
nome_model = view.__class__.model.__name__.lower()
- can_add = '.add_' + nome_model
+ can_add = ".add_" + nome_model
return perm.__contains__(nome_app + can_add)
@@ -208,7 +217,7 @@ def get_change_perm(value, arg):
except AttributeError:
return None
nome_model = view.__class__.model.__name__.lower()
- can_change = '.change_' + nome_model
+ can_change = ".change_" + nome_model
return perm.__contains__(nome_app + can_change)
@@ -223,7 +232,7 @@ def get_delete_perm(value, arg):
except AttributeError:
return None
nome_model = view.__class__.model.__name__.lower()
- can_delete = '.delete_' + nome_model
+ can_delete = ".delete_" + nome_model
return perm.__contains__(nome_app + can_delete)
@@ -232,8 +241,9 @@ def get_delete_perm(value, arg):
def ultima_filiacao(value):
parlamentar = value
- ultima_filiacao = Filiacao.objects.filter(
- parlamentar=parlamentar).order_by('-data').first()
+ ultima_filiacao = (
+ Filiacao.objects.filter(parlamentar=parlamentar).order_by("-data").first()
+ )
if ultima_filiacao:
return ultima_filiacao.partido
@@ -249,28 +259,27 @@ def get_config_attr(attribute):
@register.filter
def str2intabs(value):
if not isinstance(value, str):
- return ''
+ return ""
try:
v = int(value)
v = abs(v)
return v
except:
- return ''
+ return ""
@register.filter
def has_iframe(request):
-
- iframe = request.session.get('iframe', False)
- if not iframe and 'iframe' in request.GET:
- ival = request.GET['iframe']
+ iframe = request.session.get("iframe", False)
+ if not iframe and "iframe" in request.GET:
+ ival = request.GET["iframe"]
if ival and int(ival) == 1:
- request.session['iframe'] = True
+ request.session["iframe"] = True
return True
- elif 'iframe' in request.GET:
- ival = request.GET['iframe']
+ elif "iframe" in request.GET:
+ ival = request.GET["iframe"]
if ival and int(ival) == 0:
- del request.session['iframe']
+ del request.session["iframe"]
return False
return iframe
@@ -278,7 +287,7 @@ def has_iframe(request):
@register.filter
def url(value):
- if value.startswith('http://') or value.startswith('https://'):
+ if value.startswith("http://") or value.startswith("https://"):
return True
return False
@@ -308,33 +317,37 @@ def youtube_url(value):
@register.filter
def facebook_url(value):
value = value.lower()
- facebook_pattern = r"^((https?://)?((www|pt-br)\.)?facebook\.com(\/.+)?\/videos(\/.*)?)"
+ facebook_pattern = (
+ r"^((https?://)?((www|pt-br)\.)?facebook\.com(\/.+)?\/videos(\/.*)?)"
+ )
r = re.findall(facebook_pattern, value)
return True if r else False
@register.filter
def youtube_id(value):
- from urllib.parse import urlparse, parse_qs
+ from urllib.parse import parse_qs, urlparse
+
u_pars = urlparse(value)
- quer_v = parse_qs(u_pars.query).get('v')
+ quer_v = parse_qs(u_pars.query).get("v")
if quer_v:
return quer_v[0]
- return ''
+ return ""
@register.filter
def file_extension(value):
import pathlib
- return pathlib.Path(value).suffix.replace('.', '')
+
+ return pathlib.Path(value).suffix.replace(".", "")
@register.filter
def cronometro_to_seconds(value):
- if not AppConfig.attr('cronometro_' + value):
+ if not AppConfig.attr("cronometro_" + value):
return 0
- return AppConfig.attr('cronometro_' + value).seconds
+ return AppConfig.attr("cronometro_" + value).seconds
@register.filter
@@ -345,27 +358,25 @@ def to_list_pk(object_list):
@register.filter
def search_get_model(object):
if type(object) == MateriaLegislativa:
- return 'm'
+ return "m"
elif type(object) == DocumentoAcessorio:
- return 'd'
+ return "d"
elif type(object) == NormaJuridica:
- return 'n'
+ return "n"
elif type(object) == SessaoPlenaria:
- return 's'
+ return "s"
return None
@register.filter
def urldetail_content_type(obj, value):
- return '%s:%s_detail' % (
- value._meta.app_config.name, obj.content_type.model)
+ return "%s:%s_detail" % (value._meta.app_config.name, obj.content_type.model)
@register.filter
def urldetail(obj):
- return '%s:%s_detail' % (
- obj._meta.app_config.name, obj._meta.model_name)
+ return "%s:%s_detail" % (obj._meta.app_config.name, obj._meta.model_name)
@register.filter
@@ -373,7 +384,7 @@ def filiacao_data_filter(parlamentar, data_inicio):
try:
filiacao = filiacao_data(parlamentar, data_inicio)
except Exception:
- filiacao = ''
+ filiacao = ""
return filiacao
@@ -382,7 +393,7 @@ def filiacao_intervalo_filter(parlamentar, date_range):
try:
filiacao = filiacao_data(parlamentar, date_range[0], date_range[1])
except Exception:
- filiacao = ''
+ filiacao = ""
return filiacao
@@ -390,10 +401,11 @@ def filiacao_intervalo_filter(parlamentar, date_range):
def render_chunk_vendors(extension=None):
try:
tags = utils.get_as_tags(
- 'chunk-vendors', extension=extension, config='DEFAULT', attrs='')
- return mark_safe('\n'.join(tags))
+ "chunk-vendors", extension=extension, config="DEFAULT", attrs=""
+ )
+ return mark_safe("\n".join(tags))
except:
- return ''
+ return ""
@register.filter(is_safe=True)
@@ -416,4 +428,4 @@ def is_report_visible(request, url_path=None):
@register.filter
def sort_by_index(queryset, index):
- return sorted(queryset, key=lambda x: x[index])
\ No newline at end of file
+ return sorted(queryset, key=lambda x: x[index])
diff --git a/sapl/base/templatetags/menus.py b/sapl/base/templatetags/menus.py
index 93158bf05..b7030e2a9 100644
--- a/sapl/base/templatetags/menus.py
+++ b/sapl/base/templatetags/menus.py
@@ -1,27 +1,26 @@
import logging
+import yaml
from django import template
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
-import yaml
-
register = template.Library()
logger = logging.getLogger(__name__)
-@register.inclusion_tag('menus/menu.html', takes_context=True)
+@register.inclusion_tag("menus/menu.html", takes_context=True)
def menu(context, path=None):
return nav_run(context, path)
-@register.inclusion_tag('menus/subnav.html', takes_context=True)
+@register.inclusion_tag("menus/subnav.html", takes_context=True)
def subnav(context, path=None):
return nav_run(context, path)
-@register.inclusion_tag('menus/nav.html', takes_context=True)
+@register.inclusion_tag("menus/nav.html", takes_context=True)
def navbar(context, path=None):
return nav_run(context, path)
@@ -42,14 +41,14 @@ def nav_run(context, path=None):
será realizado o teste de permissão para renderizá-lo.
"""
menu = None
- root_pk = context.get('root_pk', None)
+ root_pk = context.get("root_pk", None)
if not root_pk:
- obj = context.get('object', None)
+ obj = context.get("object", None)
if obj:
root_pk = obj.pk
- if root_pk or 'subnav_template_name' in context or path:
- request = context['request']
+ if root_pk or "subnav_template_name" in context or path:
+ request = context["request"]
"""
As implementações das Views de Modelos que são dados auxiliares e
@@ -60,14 +59,14 @@ def nav_run(context, path=None):
"""
rm = request.resolver_match
- app_template = rm.app_name.rsplit('.', 1)[-1]
+ app_template = rm.app_name.rsplit(".", 1)[-1]
if path:
yaml_path = path
- elif 'subnav_template_name' in context:
- yaml_path = context['subnav_template_name']
+ elif "subnav_template_name" in context:
+ yaml_path = context["subnav_template_name"]
else:
- yaml_path = '%s/%s' % (app_template, 'subnav.yaml')
+ yaml_path = "%s/%s" % (app_template, "subnav.yaml")
if not yaml_path:
return
@@ -88,44 +87,47 @@ def nav_run(context, path=None):
menu = yaml.load(rendered, yaml.Loader)
resolve_urls_inplace(menu, root_pk, rm, context)
except Exception as e:
- raise Exception(_("""Erro na conversão do yaml %s. App: %s.
+ raise Exception(
+ _(
+ """Erro na conversão do yaml %s. App: %s.
Erro:
%s
- """) % (
- yaml_path, rm.app_name, str(e)))
+ """
+ )
+ % (yaml_path, rm.app_name, str(e))
+ )
- return {'menu': menu}
+ return {"menu": menu}
def resolve_urls_inplace(menu, pk, rm, context):
if isinstance(menu, list):
- list_active = ''
+ list_active = ""
for item in menu:
menuactive = resolve_urls_inplace(item, pk, rm, context)
list_active = menuactive if menuactive else list_active
if not isinstance(item, list):
- item['active'] = menuactive
+ item["active"] = menuactive
return list_active
else:
- if 'url' in menu:
-
- url_name = menu['url']
-
- if 'check_permission' in menu and not context[
- 'request'].user.has_perm(menu['check_permission']):
- menu['url'] = ''
- menu['active'] = ''
+ if "url" in menu:
+ url_name = menu["url"]
+
+ if "check_permission" in menu and not context["request"].user.has_perm(
+ menu["check_permission"]
+ ):
+ menu["url"] = ""
+ menu["active"] = ""
else:
- if '/' in url_name:
+ if "/" in url_name:
pass
- elif ':' in url_name:
+ elif ":" in url_name:
try:
- menu['url'] = reverse('%s' % menu['url'])
+ menu["url"] = reverse("%s" % menu["url"])
except:
try:
- menu['url'] = reverse('%s' % menu['url'],
- kwargs={'pk': pk})
+ menu["url"] = reverse("%s" % menu["url"], kwargs={"pk": pk})
except:
# tem que ser root_pk pois quando está sendo
# renderizado um detail, update, delete
@@ -149,18 +151,20 @@ def resolve_urls_inplace(menu, pk, rm, context):
2) Se existe no contexto um desses itens:
- context['root_pk'] pk do master
- context['object'] objeto do master
- """.format(menu['title'], menu['url'])
+ """.format(
+ menu["title"], menu["url"]
+ )
logger.error(log)
raise Exception(log)
else:
try:
- menu['url'] = reverse('%s:%s' % (
- rm.app_name, menu['url']))
+ menu["url"] = reverse("%s:%s" % (rm.app_name, menu["url"]))
except:
try:
- menu['url'] = reverse('%s:%s' % (
- rm.app_name, menu['url']), kwargs={'pk': pk})
+ menu["url"] = reverse(
+ "%s:%s" % (rm.app_name, menu["url"]), kwargs={"pk": pk}
+ )
except:
log = """Erro na construção do Menu:
menu: {}
@@ -169,13 +173,16 @@ def resolve_urls_inplace(menu, pk, rm, context):
2) Se existe no contexto um desses itens:
- context['root_pk'] pk do master
- context['object'] objeto do master
- """.format(menu['title'], menu['url'])
+ """.format(
+ menu["title"], menu["url"]
+ )
logger.error(log)
raise Exception(log)
- menu['active'] = 'active'\
- if context['request'].path == menu['url'] else ''
- if not menu['active']:
+ menu["active"] = (
+ "active" if context["request"].path == menu["url"] else ""
+ )
+ if not menu["active"]:
"""
Se não encontrada diretamente,
procura a url acionada dentro do crud, caso seja um.
@@ -184,26 +191,29 @@ def resolve_urls_inplace(menu, pk, rm, context):
- visualização de detalhes, adição, edição, remoção.
"""
try:
- if 'view' in context:
- view = context['view']
- if hasattr(view, 'crud'):
+ if "view" in context:
+ view = context["view"]
+ if hasattr(view, "crud"):
urls = view.crud.get_urls()
for u in urls:
- if (u.name == url_name or
- 'urls_extras' in menu and
- u.name in menu['urls_extras']):
- menu['active'] = 'active'
+ if (
+ u.name == url_name
+ or "urls_extras" in menu
+ and u.name in menu["urls_extras"]
+ ):
+ menu["active"] = "active"
break
except:
- url_active = menu.get('url', '')
+ url_active = menu.get("url", "")
logger.warning(
- f'Não foi possível definir se url {url_active} é a url ativa.')
- elif 'check_permission' in menu and not context[
- 'request'].user.has_perm(menu['check_permission']):
- menu['active'] = ''
- del menu['children']
-
- if 'children' in menu:
- menu['active'] = resolve_urls_inplace(
- menu['children'], pk, rm, context)
- return menu['active']
+ f"Não foi possível definir se url {url_active} é a url ativa."
+ )
+ elif "check_permission" in menu and not context["request"].user.has_perm(
+ menu["check_permission"]
+ ):
+ menu["active"] = ""
+ del menu["children"]
+
+ if "children" in menu:
+ menu["active"] = resolve_urls_inplace(menu["children"], pk, rm, context)
+ return menu["active"]
diff --git a/sapl/base/tests/test_base.py b/sapl/base/tests/test_base.py
index 952de6f97..c24af2dba 100644
--- a/sapl/base/tests/test_base.py
+++ b/sapl/base/tests/test_base.py
@@ -6,19 +6,21 @@ from sapl.base.models import CasaLegislativa
@pytest.mark.django_db(transaction=False)
def test_casa_legislativa_model():
- baker.make(CasaLegislativa,
- nome='Teste_Nome_Casa_Legislativa',
- sigla='TSCL',
- endereco='Teste_Endereço_Casa_Legislativa',
- cep='12345678',
- municipio='Teste_Municipio_Casa_Legislativa',
- uf='DF')
+ baker.make(
+ CasaLegislativa,
+ nome="Teste_Nome_Casa_Legislativa",
+ sigla="TSCL",
+ endereco="Teste_Endereço_Casa_Legislativa",
+ cep="12345678",
+ municipio="Teste_Municipio_Casa_Legislativa",
+ uf="DF",
+ )
casa_legislativa = CasaLegislativa.objects.first()
- assert casa_legislativa.nome == 'Teste_Nome_Casa_Legislativa'
- assert casa_legislativa.sigla == 'TSCL'
- assert casa_legislativa.endereco == 'Teste_Endereço_Casa_Legislativa'
- assert casa_legislativa.cep == '12345678'
- assert casa_legislativa.municipio == 'Teste_Municipio_Casa_Legislativa'
- assert casa_legislativa.uf == 'DF'
+ assert casa_legislativa.nome == "Teste_Nome_Casa_Legislativa"
+ assert casa_legislativa.sigla == "TSCL"
+ assert casa_legislativa.endereco == "Teste_Endereço_Casa_Legislativa"
+ assert casa_legislativa.cep == "12345678"
+ assert casa_legislativa.municipio == "Teste_Municipio_Casa_Legislativa"
+ assert casa_legislativa.uf == "DF"
diff --git a/sapl/base/tests/test_form.py b/sapl/base/tests/test_form.py
index d6a8c4b25..a70475891 100644
--- a/sapl/base/tests/test_form.py
+++ b/sapl/base/tests/test_form.py
@@ -11,31 +11,34 @@ def test_valida_campos_obrigatorios_casa_legislativa_form():
errors = form.errors
- assert errors['nome'] == [_('Este campo é obrigatório.')]
- assert errors['sigla'] == [_('Este campo é obrigatório.')]
- assert errors['endereco'] == [_('Este campo é obrigatório.')]
- assert errors['cep'] == [_('Este campo é obrigatório.')]
- assert errors['municipio'] == [_('Este campo é obrigatório.')]
- assert errors['uf'] == [_('Este campo é obrigatório.')]
+ assert errors["nome"] == [_("Este campo é obrigatório.")]
+ assert errors["sigla"] == [_("Este campo é obrigatório.")]
+ assert errors["endereco"] == [_("Este campo é obrigatório.")]
+ assert errors["cep"] == [_("Este campo é obrigatório.")]
+ assert errors["municipio"] == [_("Este campo é obrigatório.")]
+ assert errors["uf"] == [_("Este campo é obrigatório.")]
assert len(errors) == 6
@pytest.mark.django_db(transaction=False)
def test_casa_legislativa_form_invalido():
- form = CasaLegislativaForm(data={'codigo': 'codigo',
- 'nome': 'nome',
- 'sigla': 'sg',
- 'endereco': 'endereco',
- 'cep': '7000000',
- 'municipio': 'municipio',
- 'uf': 'uf',
- 'telefone': '33333333',
- 'fax': '33333333',
- 'logotipo': 'image',
- 'endereco_web': 'web',
- 'email': 'email',
- 'informacao_geral': 'informacao_geral'
- })
+ form = CasaLegislativaForm(
+ data={
+ "codigo": "codigo",
+ "nome": "nome",
+ "sigla": "sg",
+ "endereco": "endereco",
+ "cep": "7000000",
+ "municipio": "municipio",
+ "uf": "uf",
+ "telefone": "33333333",
+ "fax": "33333333",
+ "logotipo": "image",
+ "endereco_web": "web",
+ "email": "email",
+ "informacao_geral": "informacao_geral",
+ }
+ )
assert not form.is_valid()
diff --git a/sapl/base/tests/test_login.py b/sapl/base/tests/test_login.py
index 6c6a75cb8..2813d78fd 100755
--- a/sapl/base/tests/test_login.py
+++ b/sapl/base/tests/test_login.py
@@ -1,28 +1,28 @@
# -*- coding: utf-8 -*-
-from django.contrib.auth import get_user_model
import pytest
-
+from django.contrib.auth import get_user_model
pytestmark = pytest.mark.django_db
@pytest.fixture
def user():
- return get_user_model().objects.create_user('jfirmino', password='123')
+ return get_user_model().objects.create_user("jfirmino", password="123")
def test_login_aparece_na_barra_para_usuario_nao_logado(client):
- response = client.get('/')
- assert '' in str(
- response.content)
+ response = client.get("/")
+ assert (
+ ''
+ in str(response.content)
+ )
def test_username_do_usuario_logado_aparece_na_barra(client, user):
- assert client.login(username='jfirmino', password='123')
- response = client.get('/')
- assert 'Login' not in str(
- response.content)
- assert 'jfirmino' in str(response.content)
+ assert client.login(username="jfirmino", password="123")
+ response = client.get("/")
+ assert 'Login' not in str(response.content)
+ assert "jfirmino" in str(response.content)
assert 'Sair' in str(response.content)
@@ -38,35 +38,41 @@ def test_username_do_usuario_logado_aparece_na_barra(client, user):
# assert 'Sair' in str(response.content)
-@pytest.mark.urls('sapl.base.tests.teststub_urls')
-@pytest.mark.parametrize("link_login,destino", [
- # login redireciona para home
- ('/login/', '/'),
-])
+@pytest.mark.urls("sapl.base.tests.teststub_urls")
+@pytest.mark.parametrize(
+ "link_login,destino",
+ [
+ # login redireciona para home
+ ("/login/", "/"),
+ ],
+)
def test_login(app, user, link_login, destino):
pagina_login = app.get(link_login)
- form = pagina_login.forms['login-form']
- form['username'] = 'jfirmino'
- form['password'] = '123'
+ form = pagina_login.forms["login-form"]
+ form["username"] = "jfirmino"
+ form["password"] = "123"
res = form.submit() # login
- assert str(user.pk) == app.session['_auth_user_id']
+ assert str(user.pk) == app.session["_auth_user_id"]
assert res.url == destino
-@pytest.mark.parametrize("link_logout,destino", [
- # logout redireciona para a pagina de login
- ('/logout/', '/login/'),
-])
+@pytest.mark.parametrize(
+ "link_logout,destino",
+ [
+ # logout redireciona para a pagina de login
+ ("/logout/", "/login/"),
+ ],
+)
def test_logout(client, user, link_logout, destino):
# com um usuário logado ...
- assert client.login(username='jfirmino', password='123')
- assert str(user.pk) == client.session['_auth_user_id']
+ assert client.login(username="jfirmino", password="123")
+ assert str(user.pk) == client.session["_auth_user_id"]
# ... acionamos o link de logout
res = client.get(link_logout, follow=True)
destino_real = res.redirect_chain[-1][0]
- assert '_auth_user_id' not in client.session
+ assert "_auth_user_id" not in client.session
assert destino_real == destino
diff --git a/sapl/base/tests/test_view_base.py b/sapl/base/tests/test_view_base.py
index 507fb7ba8..74bd6dd20 100644
--- a/sapl/base/tests/test_view_base.py
+++ b/sapl/base/tests/test_view_base.py
@@ -1,638 +1,584 @@
-import pytest
-from model_bakery import baker
import datetime
+
+import pytest
from django.urls import reverse
from django.utils.translation import gettext_lazy as _
from model_bakery import baker
from sapl.base.models import Autor, TipoAutor
-from sapl.comissoes.models import Comissao, TipoComissao
-from sapl.sessao.models import Bancada
-from sapl.protocoloadm.models import (Protocolo, DocumentoAdministrativo,
- TipoDocumentoAdministrativo, Anexado)
-from sapl.materia.models import (TipoMateriaLegislativa, RegimeTramitacao,
- MateriaLegislativa, Anexada)
-from sapl.parlamentares.models import (Parlamentar, Partido, Filiacao,
- Legislatura, Mandato)
-
-from sapl.base.views import (protocolos_duplicados, protocolos_com_materias,
+from sapl.base.views import (anexados_ciclicos, autores_duplicados,
+ bancada_comissao_autor_externo,
+ mandato_sem_data_inicio,
materias_protocolo_inexistente,
- mandato_sem_data_inicio, parlamentares_duplicados,
- parlamentares_mandatos_intersecao,
+ parlamentares_duplicados,
parlamentares_filiacoes_intersecao,
- autores_duplicados,
- bancada_comissao_autor_externo, anexados_ciclicos)
+ parlamentares_mandatos_intersecao,
+ protocolos_com_materias, protocolos_duplicados)
+from sapl.comissoes.models import Comissao, TipoComissao
+from sapl.materia.models import (Anexada, MateriaLegislativa, RegimeTramitacao,
+ TipoMateriaLegislativa)
+from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
+ Parlamentar, Partido)
+from sapl.protocoloadm.models import (Anexado, DocumentoAdministrativo,
+ Protocolo, TipoDocumentoAdministrativo)
+from sapl.sessao.models import Bancada
@pytest.mark.django_db(transaction=False)
def test_lista_protocolos_com_materias():
- baker.make(
- Protocolo,
- numero=15,
- ano=2035
- )
- baker.make(
- Protocolo,
- numero=33,
- ano=2035
- )
-
- tipo_materia = baker.make(
- TipoMateriaLegislativa,
- descricao="Tipo_Materia_Teste"
- )
- regime_tramitacao = baker.make(
- RegimeTramitacao,
- descricao="Regime_Tramitacao_Teste"
- )
- baker.make(
- MateriaLegislativa,
- numero=16,
- ano=2035,
- data_apresentacao='2035-06-02',
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia,
- numero_protocolo=15
- )
- baker.make(
- MateriaLegislativa,
- numero=17,
- ano=2035,
- data_apresentacao='2035-06-05',
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia,
- numero_protocolo=15
- )
-
- lista_protocolos_com_materias = protocolos_com_materias()
-
- assert len(lista_protocolos_com_materias) == 1
- assert lista_protocolos_com_materias[0][1] == 2
- assert lista_protocolos_com_materias[0][0].numero_protocolo == 15
- assert lista_protocolos_com_materias[0][0].ano == 2035
+ baker.make(Protocolo, numero=15, ano=2035)
+ baker.make(Protocolo, numero=33, ano=2035)
+
+ tipo_materia = baker.make(TipoMateriaLegislativa, descricao="Tipo_Materia_Teste")
+ regime_tramitacao = baker.make(
+ RegimeTramitacao, descricao="Regime_Tramitacao_Teste"
+ )
+ baker.make(
+ MateriaLegislativa,
+ numero=16,
+ ano=2035,
+ data_apresentacao="2035-06-02",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ numero_protocolo=15,
+ )
+ baker.make(
+ MateriaLegislativa,
+ numero=17,
+ ano=2035,
+ data_apresentacao="2035-06-05",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ numero_protocolo=15,
+ )
+
+ lista_protocolos_com_materias = protocolos_com_materias()
+
+ assert len(lista_protocolos_com_materias) == 1
+ assert lista_protocolos_com_materias[0][1] == 2
+ assert lista_protocolos_com_materias[0][0].numero_protocolo == 15
+ assert lista_protocolos_com_materias[0][0].ano == 2035
@pytest.mark.django_db(transaction=False)
def test_lista_materias_protocolo_inexistente():
- protocolo_a = baker.make(
- Protocolo,
- numero=15,
- ano=2031
- )
-
- tipo_materia = baker.make(
- TipoMateriaLegislativa,
- descricao="Tipo_Materia_Teste"
- )
- regime_tramitacao = baker.make(
- RegimeTramitacao,
- descricao="Regime_Tramitacao_Teste"
- )
- baker.make(
- MateriaLegislativa,
- numero=16,
- ano=2031,
- data_apresentacao='2031-06-02',
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia,
- numero_protocolo=15
- )
- materia = baker.make(
- MateriaLegislativa,
- numero=17,
- ano=2031,
- data_apresentacao='2031-06-02',
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia,
- numero_protocolo=16
- )
-
- lista_materias_protocolo_inexistente = materias_protocolo_inexistente()
-
- assert len(lista_materias_protocolo_inexistente) == 1
- assert lista_materias_protocolo_inexistente == [(materia, 2031, 16)]
+ protocolo_a = baker.make(Protocolo, numero=15, ano=2031)
+
+ tipo_materia = baker.make(TipoMateriaLegislativa, descricao="Tipo_Materia_Teste")
+ regime_tramitacao = baker.make(
+ RegimeTramitacao, descricao="Regime_Tramitacao_Teste"
+ )
+ baker.make(
+ MateriaLegislativa,
+ numero=16,
+ ano=2031,
+ data_apresentacao="2031-06-02",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ numero_protocolo=15,
+ )
+ materia = baker.make(
+ MateriaLegislativa,
+ numero=17,
+ ano=2031,
+ data_apresentacao="2031-06-02",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ numero_protocolo=16,
+ )
+
+ lista_materias_protocolo_inexistente = materias_protocolo_inexistente()
+
+ assert len(lista_materias_protocolo_inexistente) == 1
+ assert lista_materias_protocolo_inexistente == [(materia, 2031, 16)]
@pytest.mark.django_db(transaction=False)
def test_lista_mandatos_sem_data_inicio():
- parlamentar = baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste",
- nome_parlamentar="Nome_Parlamentar_Teste",
- sexo='M'
- )
- legislatura = baker.make(
- Legislatura,
- numero=1,
- data_inicio='2015-05-02',
- data_fim='2024-02-04',
- data_eleicao='2015-02-05'
- )
-
- mandato_a = baker.make(
- Mandato,
- parlamentar=parlamentar,
- legislatura=legislatura
- )
- baker.make(
- Mandato,
- parlamentar=parlamentar,
- legislatura=legislatura,
- data_inicio_mandato='2015-05-27'
- )
-
- lista_mandatos_sem_data_inicio = mandato_sem_data_inicio()
-
- assert len(lista_mandatos_sem_data_inicio) == 1
- assert lista_mandatos_sem_data_inicio[0] == mandato_a
+ parlamentar = baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste",
+ nome_parlamentar="Nome_Parlamentar_Teste",
+ sexo="M",
+ )
+ legislatura = baker.make(
+ Legislatura,
+ numero=1,
+ data_inicio="2015-05-02",
+ data_fim="2024-02-04",
+ data_eleicao="2015-02-05",
+ )
+
+ mandato_a = baker.make(Mandato, parlamentar=parlamentar, legislatura=legislatura)
+ baker.make(
+ Mandato,
+ parlamentar=parlamentar,
+ legislatura=legislatura,
+ data_inicio_mandato="2015-05-27",
+ )
+
+ lista_mandatos_sem_data_inicio = mandato_sem_data_inicio()
+
+ assert len(lista_mandatos_sem_data_inicio) == 1
+ assert lista_mandatos_sem_data_inicio[0] == mandato_a
@pytest.mark.django_db(transaction=False)
def test_lista_parlamentares_duplicados():
- baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste",
- nome_parlamentar="Nome_Parlamentar_Teste",
- sexo='M'
- )
- baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste",
- nome_parlamentar="Nome_Parlamentar_Teste",
- sexo='M'
- )
- baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste-1",
- nome_parlamentar="Nome_Parlamentar_Teste-1",
- sexo='M'
- )
-
- lista_dict_parlamentares_duplicados = parlamentares_duplicados()
- parlamentar_duplicado = list(
- lista_dict_parlamentares_duplicados[0].values()
- )
- parlamentar_duplicado.sort(key=str)
-
- assert len(lista_dict_parlamentares_duplicados) == 1
- assert parlamentar_duplicado == [2, "Nome_Parlamentar_Teste"]
+ baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste",
+ nome_parlamentar="Nome_Parlamentar_Teste",
+ sexo="M",
+ )
+ baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste",
+ nome_parlamentar="Nome_Parlamentar_Teste",
+ sexo="M",
+ )
+ baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste-1",
+ nome_parlamentar="Nome_Parlamentar_Teste-1",
+ sexo="M",
+ )
+
+ lista_dict_parlamentares_duplicados = parlamentares_duplicados()
+ parlamentar_duplicado = list(lista_dict_parlamentares_duplicados[0].values())
+ parlamentar_duplicado.sort(key=str)
+
+ assert len(lista_dict_parlamentares_duplicados) == 1
+ assert parlamentar_duplicado == [2, "Nome_Parlamentar_Teste"]
@pytest.mark.django_db(transaction=False)
def test_lista_parlamentares_mandatos_intersecao():
- legislatura = baker.make(
- Legislatura,
- numero=1,
- data_inicio='2017-07-04',
- data_fim='2170-05-01',
- data_eleicao='2017-04-07'
- )
- parlamentar_a = baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste",
- nome_parlamentar="Nome_Parlamentar_Teste",
- sexo='M'
- )
- parlamentar_b = baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste-1",
- nome_parlamentar="Nome_Parlamentar_Teste-1",
- sexo='M'
- )
-
- mandato_a = baker.make(
- Mandato,
- parlamentar=parlamentar_a,
- legislatura=legislatura,
- data_inicio_mandato='2017-07-08',
- data_fim_mandato='2018-01-07'
- )
- mandato_b = baker.make(
- Mandato,
- parlamentar=parlamentar_a,
- legislatura=legislatura,
- data_inicio_mandato='2017-07-09'
- )
- baker.make(
- Mandato,
- parlamentar=parlamentar_b,
- legislatura=legislatura,
- data_inicio_mandato='2017-11-17',
- data_fim_mandato='2018-08-02'
- )
- baker.make(
- Mandato,
- parlamentar=parlamentar_b,
- legislatura=legislatura,
- data_inicio_mandato='2018-08-03'
- )
-
- lista_parlamentares = parlamentares_mandatos_intersecao()
-
- assert len(lista_parlamentares) == 1
- assert lista_parlamentares == [(parlamentar_a, mandato_a, mandato_b)]
+ legislatura = baker.make(
+ Legislatura,
+ numero=1,
+ data_inicio="2017-07-04",
+ data_fim="2170-05-01",
+ data_eleicao="2017-04-07",
+ )
+ parlamentar_a = baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste",
+ nome_parlamentar="Nome_Parlamentar_Teste",
+ sexo="M",
+ )
+ parlamentar_b = baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste-1",
+ nome_parlamentar="Nome_Parlamentar_Teste-1",
+ sexo="M",
+ )
+
+ mandato_a = baker.make(
+ Mandato,
+ parlamentar=parlamentar_a,
+ legislatura=legislatura,
+ data_inicio_mandato="2017-07-08",
+ data_fim_mandato="2018-01-07",
+ )
+ mandato_b = baker.make(
+ Mandato,
+ parlamentar=parlamentar_a,
+ legislatura=legislatura,
+ data_inicio_mandato="2017-07-09",
+ )
+ baker.make(
+ Mandato,
+ parlamentar=parlamentar_b,
+ legislatura=legislatura,
+ data_inicio_mandato="2017-11-17",
+ data_fim_mandato="2018-08-02",
+ )
+ baker.make(
+ Mandato,
+ parlamentar=parlamentar_b,
+ legislatura=legislatura,
+ data_inicio_mandato="2018-08-03",
+ )
+
+ lista_parlamentares = parlamentares_mandatos_intersecao()
+
+ assert len(lista_parlamentares) == 1
+ assert lista_parlamentares == [(parlamentar_a, mandato_a, mandato_b)]
@pytest.mark.django_db(transaction=False)
def test_lista_parlamentares_filiacoes_intersecao():
- partido = baker.make(
- Partido,
- sigla="ST",
- nome="Nome_Partido_Teste"
- )
- parlamentar_a = baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste",
- nome_parlamentar="Nome_Parlamentar_Teste",
- sexo='M'
- )
- parlamentar_b = baker.make(
- Parlamentar,
- nome_completo="Nome_Completo_Parlamentar_Teste-1",
- nome_parlamentar="Nome_Parlamentar_Teste-1",
- sexo='M'
- )
-
- filiacao_a = baker.make(
- Filiacao,
- parlamentar=parlamentar_a,
- partido=partido,
- data='2018-02-02',
- data_desfiliacao='2019-08-01'
- )
- filiacao_b = baker.make(
- Filiacao,
- parlamentar=parlamentar_a,
- partido=partido,
- data='2018-02-23',
- data_desfiliacao='2020-02-04'
- )
- baker.make(
- Filiacao,
- parlamentar=parlamentar_b,
- partido=partido,
- data='2018-02-07',
- data_desfiliacao='2018-02-27'
- )
- baker.make(
- Filiacao,
- parlamentar=parlamentar_b,
- partido=partido,
- data='2018-02-28'
- )
-
- lista_parlamentares = parlamentares_filiacoes_intersecao()
-
- assert len(lista_parlamentares) == 1
- assert lista_parlamentares == [(parlamentar_a, filiacao_b, filiacao_a)]
+ partido = baker.make(Partido, sigla="ST", nome="Nome_Partido_Teste")
+ parlamentar_a = baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste",
+ nome_parlamentar="Nome_Parlamentar_Teste",
+ sexo="M",
+ )
+ parlamentar_b = baker.make(
+ Parlamentar,
+ nome_completo="Nome_Completo_Parlamentar_Teste-1",
+ nome_parlamentar="Nome_Parlamentar_Teste-1",
+ sexo="M",
+ )
+
+ filiacao_a = baker.make(
+ Filiacao,
+ parlamentar=parlamentar_a,
+ partido=partido,
+ data="2018-02-02",
+ data_desfiliacao="2019-08-01",
+ )
+ filiacao_b = baker.make(
+ Filiacao,
+ parlamentar=parlamentar_a,
+ partido=partido,
+ data="2018-02-23",
+ data_desfiliacao="2020-02-04",
+ )
+ baker.make(
+ Filiacao,
+ parlamentar=parlamentar_b,
+ partido=partido,
+ data="2018-02-07",
+ data_desfiliacao="2018-02-27",
+ )
+ baker.make(Filiacao, parlamentar=parlamentar_b, partido=partido, data="2018-02-28")
+
+ lista_parlamentares = parlamentares_filiacoes_intersecao()
+
+ assert len(lista_parlamentares) == 1
+ assert lista_parlamentares == [(parlamentar_a, filiacao_b, filiacao_a)]
@pytest.mark.django_db(transaction=False)
def test_lista_autores_duplicados():
- tipo_autor = baker.make(
- TipoAutor,
- descricao="Tipo_Autor_Teste"
- )
-
- baker.make(
- Autor,
- tipo=tipo_autor,
- nome="Nome_Autor_Teste"
- )
- baker.make(
- Autor,
- tipo=tipo_autor,
- nome="Nome_Autor_Teste"
- )
- baker.make(
- Autor,
- tipo=tipo_autor,
- nome="Nome_Autor_Teste-1"
- )
-
- lista_autores_duplicados = autores_duplicados()
-
- assert len(lista_autores_duplicados) == 1
- assert lista_autores_duplicados[0]['count'] == 2
- assert lista_autores_duplicados[0]['nome'] == "Nome_Autor_Teste"
+ tipo_autor = baker.make(TipoAutor, descricao="Tipo_Autor_Teste")
+
+ baker.make(Autor, tipo=tipo_autor, nome="Nome_Autor_Teste")
+ baker.make(Autor, tipo=tipo_autor, nome="Nome_Autor_Teste")
+ baker.make(Autor, tipo=tipo_autor, nome="Nome_Autor_Teste-1")
+
+ lista_autores_duplicados = autores_duplicados()
+
+ assert len(lista_autores_duplicados) == 1
+ assert lista_autores_duplicados[0]["count"] == 2
+ assert lista_autores_duplicados[0]["nome"] == "Nome_Autor_Teste"
@pytest.mark.django_db(transaction=False)
def test_lista_bancada_comissao_autor_externo():
- tipo_autor = baker.make(
- TipoAutor,
- descricao="Tipo_Autor_Teste"
- )
- tipo_autor_externo = baker.make(
- TipoAutor,
- descricao="Externo"
- )
-
- legislatura = baker.make(
- Legislatura,
- numero=1,
- data_inicio='2012-01-03',
- data_fim='2013-01-02',
- data_eleicao='2011-10-04'
- )
-
- bancada_a = baker.make(
- Bancada,
- legislatura=legislatura,
- nome="Bancada_Teste",
- data_criacao='2012-01-08',
- )
- bancada_a.autor.create(
- nome="Nome_Autor_Teste",
- tipo=tipo_autor
- )
-
- bancada_b = baker.make(
- Bancada,
- legislatura=legislatura,
- nome="Bancada_Teste-1",
- data_criacao='2012-02-02'
- )
- autor_bancada_b = bancada_b.autor.create(
- nome="Nome_Autor_Externo_Teste",
- tipo=tipo_autor_externo
- )
-
- tipo_comissao = baker.make(
- TipoComissao,
- nome="Tipo_Comissao_Teste",
- natureza='T',
- sigla="TCT"
- )
-
- comissao_a = baker.make(
- Comissao,
- nome="Comissao_Teste",
- sigla="CT",
- data_criacao='2012-03-08',
- )
- comissao_a.autor.create(
- nome="Nome_Autor_Teste",
- tipo=tipo_autor
- )
-
- comissao_b = baker.make(
- Comissao,
- nome="Comissao_Teste-1",
- sigla="CT1",
- data_criacao='2012-04-01',
- )
- autor_comissao_b = comissao_b.autor.create(
- nome="Nome_Autor_Externo_Teste",
- tipo=tipo_autor_externo
- )
-
- lista_bancada_comissao = bancada_comissao_autor_externo()
-
- assert len(lista_bancada_comissao) == 2
- assert lista_bancada_comissao[0][0:2] == (autor_bancada_b, bancada_b)
- assert lista_bancada_comissao[0][2:4] == ('Bancada', 'sistema/bancada')
- assert lista_bancada_comissao[1][0:2] == (autor_comissao_b, comissao_b)
- assert lista_bancada_comissao[1][2:4] == ('Comissão', 'comissao')
+ tipo_autor = baker.make(TipoAutor, descricao="Tipo_Autor_Teste")
+ tipo_autor_externo = baker.make(TipoAutor, descricao="Externo")
+
+ legislatura = baker.make(
+ Legislatura,
+ numero=1,
+ data_inicio="2012-01-03",
+ data_fim="2013-01-02",
+ data_eleicao="2011-10-04",
+ )
+
+ bancada_a = baker.make(
+ Bancada,
+ legislatura=legislatura,
+ nome="Bancada_Teste",
+ data_criacao="2012-01-08",
+ )
+ bancada_a.autor.create(nome="Nome_Autor_Teste", tipo=tipo_autor)
+
+ bancada_b = baker.make(
+ Bancada,
+ legislatura=legislatura,
+ nome="Bancada_Teste-1",
+ data_criacao="2012-02-02",
+ )
+ autor_bancada_b = bancada_b.autor.create(
+ nome="Nome_Autor_Externo_Teste", tipo=tipo_autor_externo
+ )
+
+ tipo_comissao = baker.make(
+ TipoComissao, nome="Tipo_Comissao_Teste", natureza="T", sigla="TCT"
+ )
+
+ comissao_a = baker.make(
+ Comissao,
+ nome="Comissao_Teste",
+ sigla="CT",
+ data_criacao="2012-03-08",
+ )
+ comissao_a.autor.create(nome="Nome_Autor_Teste", tipo=tipo_autor)
+
+ comissao_b = baker.make(
+ Comissao,
+ nome="Comissao_Teste-1",
+ sigla="CT1",
+ data_criacao="2012-04-01",
+ )
+ autor_comissao_b = comissao_b.autor.create(
+ nome="Nome_Autor_Externo_Teste", tipo=tipo_autor_externo
+ )
+
+ lista_bancada_comissao = bancada_comissao_autor_externo()
+
+ assert len(lista_bancada_comissao) == 2
+ assert lista_bancada_comissao[0][0:2] == (autor_bancada_b, bancada_b)
+ assert lista_bancada_comissao[0][2:4] == ("Bancada", "sistema/bancada")
+ assert lista_bancada_comissao[1][0:2] == (autor_comissao_b, comissao_b)
+ assert lista_bancada_comissao[1][2:4] == ("Comissão", "comissao")
@pytest.mark.django_db(transaction=False)
def test_lista_anexados_ciclicas():
- ## DocumentoAdministrativo
- tipo_documento = baker.make(
- TipoDocumentoAdministrativo,
- sigla="TT",
- descricao="Tipo_Teste"
- )
-
- documento_a = baker.make(
- DocumentoAdministrativo,
- tipo=tipo_documento,
- numero=26,
- ano=2019,
- data='2019-05-15',
- )
- documento_b = baker.make(
- DocumentoAdministrativo,
- tipo=tipo_documento,
- numero=27,
- ano=2019,
- data='2019-05-16',
- )
- documento_c = baker.make(
- DocumentoAdministrativo,
- tipo=tipo_documento,
- numero=28,
- ano=2019,
- data='2019-05-17',
- )
- documento_a1 = baker.make(
- DocumentoAdministrativo,
- tipo=tipo_documento,
- numero=29,
- ano=2019,
- data='2019-05-18',
- )
- documento_b1 = baker.make(
- DocumentoAdministrativo,
- tipo=tipo_documento,
- numero=30,
- ano=2019,
- data='2019-05-19',
- )
- documento_c1 = baker.make(
- DocumentoAdministrativo,
- tipo=tipo_documento,
- numero=31,
- ano=2019,
- data='2019-05-20',
- )
-
- baker.make(
- Anexado,
- documento_principal=documento_a,
- documento_anexado=documento_b,
- data_anexacao='2019-05-21'
- )
- baker.make(
- Anexado,
- documento_principal=documento_a,
- documento_anexado=documento_c,
- data_anexacao='2019-05-22'
- )
- baker.make(
- Anexado,
- documento_principal=documento_b,
- documento_anexado=documento_c,
- data_anexacao='2019-05-23'
- )
- baker.make(
- Anexado,
- documento_principal=documento_a1,
- documento_anexado=documento_b1,
- data_anexacao='2019-05-24'
- )
- baker.make(
- Anexado,
- documento_principal=documento_a1,
- documento_anexado=documento_c1,
- data_anexacao='2019-05-25'
- )
- baker.make(
- Anexado,
- documento_principal=documento_b1,
- documento_anexado=documento_c1,
- data_anexacao='2019-05-26'
- )
- baker.make(
- Anexado,
- documento_principal=documento_c1,
- documento_anexado=documento_b1,
- data_anexacao='2019-05-27'
- )
-
- lista_documento_ciclicos = anexados_ciclicos(False)
-
- ## Matéria
- tipo_materia = baker.make(
- TipoMateriaLegislativa,
- descricao="Tipo_Teste"
- )
- regime_tramitacao = baker.make(
- RegimeTramitacao,
- descricao="Regime_Teste"
- )
-
- materia_a = baker.make(
- MateriaLegislativa,
- numero=20,
- ano=2018,
- data_apresentacao="2018-01-04",
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia
- )
- materia_b = baker.make(
- MateriaLegislativa,
- numero=21,
- ano=2019,
- data_apresentacao="2019-05-04",
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia
- )
- materia_c = baker.make(
- MateriaLegislativa,
- numero=22,
- ano=2019,
- data_apresentacao="2019-05-05",
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia
- )
- materia_a1 = baker.make(
- MateriaLegislativa,
- numero=23,
- ano=2018,
- data_apresentacao="2019-05-06",
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia
- )
- materia_b1 = baker.make(
- MateriaLegislativa,
- numero=24,
- ano=2019,
- data_apresentacao="2019-05-07",
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia
- )
- materia_c1 = baker.make(
- MateriaLegislativa,
- numero=25,
- ano=2019,
- data_apresentacao="2019-05-08",
- regime_tramitacao=regime_tramitacao,
- tipo=tipo_materia
- )
-
- baker.make(
- Anexada,
- materia_principal=materia_a,
- materia_anexada=materia_b,
- data_anexacao='2019-05-11'
- )
- baker.make(
- Anexada,
- materia_principal=materia_a,
- materia_anexada=materia_c,
- data_anexacao='2019-05-12'
- )
- baker.make(
- Anexada,
- materia_principal=materia_b,
- materia_anexada=materia_c,
- data_anexacao='2019-05-13'
- )
- baker.make(
- Anexada,
- materia_principal=materia_a1,
- materia_anexada=materia_b1,
- data_anexacao='2019-05-11'
- )
- baker.make(
- Anexada,
- materia_principal=materia_a1,
- materia_anexada=materia_c1,
- data_anexacao='2019-05-12'
- )
- baker.make(
- Anexada,
- materia_principal=materia_b1,
- materia_anexada=materia_c1,
- data_anexacao='2019-05-13'
- )
- baker.make(
- Anexada,
- materia_principal=materia_c1,
- materia_anexada=materia_b1,
- data_anexacao='2019-05-14'
- )
-
- lista_materias_ciclicas = anexados_ciclicos(True)
-
- assert len(lista_materias_ciclicas) == 2
- assert lista_materias_ciclicas[0] == (datetime.date(2019,5,13), materia_b1, materia_c1)
- assert lista_materias_ciclicas[1] == (datetime.date(2019,5,14), materia_c1, materia_b1)
-
- assert len(lista_documento_ciclicos) == 2
- assert lista_documento_ciclicos[0] == (datetime.date(2019,5,26), documento_b1, documento_c1)
- assert lista_documento_ciclicos[1] == (datetime.date(2019,5,27), documento_c1, documento_b1)
+ ## DocumentoAdministrativo
+ tipo_documento = baker.make(
+ TipoDocumentoAdministrativo, sigla="TT", descricao="Tipo_Teste"
+ )
+
+ documento_a = baker.make(
+ DocumentoAdministrativo,
+ tipo=tipo_documento,
+ numero=26,
+ ano=2019,
+ data="2019-05-15",
+ )
+ documento_b = baker.make(
+ DocumentoAdministrativo,
+ tipo=tipo_documento,
+ numero=27,
+ ano=2019,
+ data="2019-05-16",
+ )
+ documento_c = baker.make(
+ DocumentoAdministrativo,
+ tipo=tipo_documento,
+ numero=28,
+ ano=2019,
+ data="2019-05-17",
+ )
+ documento_a1 = baker.make(
+ DocumentoAdministrativo,
+ tipo=tipo_documento,
+ numero=29,
+ ano=2019,
+ data="2019-05-18",
+ )
+ documento_b1 = baker.make(
+ DocumentoAdministrativo,
+ tipo=tipo_documento,
+ numero=30,
+ ano=2019,
+ data="2019-05-19",
+ )
+ documento_c1 = baker.make(
+ DocumentoAdministrativo,
+ tipo=tipo_documento,
+ numero=31,
+ ano=2019,
+ data="2019-05-20",
+ )
+
+ baker.make(
+ Anexado,
+ documento_principal=documento_a,
+ documento_anexado=documento_b,
+ data_anexacao="2019-05-21",
+ )
+ baker.make(
+ Anexado,
+ documento_principal=documento_a,
+ documento_anexado=documento_c,
+ data_anexacao="2019-05-22",
+ )
+ baker.make(
+ Anexado,
+ documento_principal=documento_b,
+ documento_anexado=documento_c,
+ data_anexacao="2019-05-23",
+ )
+ baker.make(
+ Anexado,
+ documento_principal=documento_a1,
+ documento_anexado=documento_b1,
+ data_anexacao="2019-05-24",
+ )
+ baker.make(
+ Anexado,
+ documento_principal=documento_a1,
+ documento_anexado=documento_c1,
+ data_anexacao="2019-05-25",
+ )
+ baker.make(
+ Anexado,
+ documento_principal=documento_b1,
+ documento_anexado=documento_c1,
+ data_anexacao="2019-05-26",
+ )
+ baker.make(
+ Anexado,
+ documento_principal=documento_c1,
+ documento_anexado=documento_b1,
+ data_anexacao="2019-05-27",
+ )
+
+ lista_documento_ciclicos = anexados_ciclicos(False)
+
+ ## Matéria
+ tipo_materia = baker.make(TipoMateriaLegislativa, descricao="Tipo_Teste")
+ regime_tramitacao = baker.make(RegimeTramitacao, descricao="Regime_Teste")
+
+ materia_a = baker.make(
+ MateriaLegislativa,
+ numero=20,
+ ano=2018,
+ data_apresentacao="2018-01-04",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ )
+ materia_b = baker.make(
+ MateriaLegislativa,
+ numero=21,
+ ano=2019,
+ data_apresentacao="2019-05-04",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ )
+ materia_c = baker.make(
+ MateriaLegislativa,
+ numero=22,
+ ano=2019,
+ data_apresentacao="2019-05-05",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ )
+ materia_a1 = baker.make(
+ MateriaLegislativa,
+ numero=23,
+ ano=2018,
+ data_apresentacao="2019-05-06",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ )
+ materia_b1 = baker.make(
+ MateriaLegislativa,
+ numero=24,
+ ano=2019,
+ data_apresentacao="2019-05-07",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ )
+ materia_c1 = baker.make(
+ MateriaLegislativa,
+ numero=25,
+ ano=2019,
+ data_apresentacao="2019-05-08",
+ regime_tramitacao=regime_tramitacao,
+ tipo=tipo_materia,
+ )
+
+ baker.make(
+ Anexada,
+ materia_principal=materia_a,
+ materia_anexada=materia_b,
+ data_anexacao="2019-05-11",
+ )
+ baker.make(
+ Anexada,
+ materia_principal=materia_a,
+ materia_anexada=materia_c,
+ data_anexacao="2019-05-12",
+ )
+ baker.make(
+ Anexada,
+ materia_principal=materia_b,
+ materia_anexada=materia_c,
+ data_anexacao="2019-05-13",
+ )
+ baker.make(
+ Anexada,
+ materia_principal=materia_a1,
+ materia_anexada=materia_b1,
+ data_anexacao="2019-05-11",
+ )
+ baker.make(
+ Anexada,
+ materia_principal=materia_a1,
+ materia_anexada=materia_c1,
+ data_anexacao="2019-05-12",
+ )
+ baker.make(
+ Anexada,
+ materia_principal=materia_b1,
+ materia_anexada=materia_c1,
+ data_anexacao="2019-05-13",
+ )
+ baker.make(
+ Anexada,
+ materia_principal=materia_c1,
+ materia_anexada=materia_b1,
+ data_anexacao="2019-05-14",
+ )
+
+ lista_materias_ciclicas = anexados_ciclicos(True)
+
+ assert len(lista_materias_ciclicas) == 2
+ assert lista_materias_ciclicas[0] == (
+ datetime.date(2019, 5, 13),
+ materia_b1,
+ materia_c1,
+ )
+ assert lista_materias_ciclicas[1] == (
+ datetime.date(2019, 5, 14),
+ materia_c1,
+ materia_b1,
+ )
+
+ assert len(lista_documento_ciclicos) == 2
+ assert lista_documento_ciclicos[0] == (
+ datetime.date(2019, 5, 26),
+ documento_b1,
+ documento_c1,
+ )
+ assert lista_documento_ciclicos[1] == (
+ datetime.date(2019, 5, 27),
+ documento_c1,
+ documento_b1,
+ )
@pytest.mark.django_db(transaction=False)
def test_incluir_casa_legislativa_errors(admin_client):
-
- response = admin_client.post(reverse('sapl.base:casalegislativa_create'),
- {'salvar': 'salvar'},
- follow=True)
-
- assert (response.context_data['form'].errors['nome'] ==
- [_('Este campo é obrigatório.')])
- assert (response.context_data['form'].errors['sigla'] ==
- [_('Este campo é obrigatório.')])
- assert (response.context_data['form'].errors['endereco'] ==
- [_('Este campo é obrigatório.')])
- assert (response.context_data['form'].errors['cep'] ==
- [_('Este campo é obrigatório.')])
- assert (response.context_data['form'].errors['municipio'] ==
- [_('Este campo é obrigatório.')])
- assert (response.context_data['form'].errors['uf'] ==
- [_('Este campo é obrigatório.')])
+ response = admin_client.post(
+ reverse("sapl.base:casalegislativa_create"), {"salvar": "salvar"}, follow=True
+ )
+
+ assert response.context_data["form"].errors["nome"] == [
+ _("Este campo é obrigatório.")
+ ]
+ assert response.context_data["form"].errors["sigla"] == [
+ _("Este campo é obrigatório.")
+ ]
+ assert response.context_data["form"].errors["endereco"] == [
+ _("Este campo é obrigatório.")
+ ]
+ assert response.context_data["form"].errors["cep"] == [
+ _("Este campo é obrigatório.")
+ ]
+ assert response.context_data["form"].errors["municipio"] == [
+ _("Este campo é obrigatório.")
+ ]
+ assert response.context_data["form"].errors["uf"] == [
+ _("Este campo é obrigatório.")
+ ]
@pytest.mark.django_db(transaction=False)
def test_incluir_tipo_autor_errors(admin_client):
+ response = admin_client.post(
+ reverse("sapl.base:tipoautor_create"), {"salvar": "salvar"}, follow=True
+ )
- response = admin_client.post(reverse('sapl.base:tipoautor_create'),
- {'salvar': 'salvar'},
- follow=True)
-
- assert (response.context_data['form'].errors['descricao'] ==
- [_('Este campo é obrigatório.')])
+ assert response.context_data["form"].errors["descricao"] == [
+ _("Este campo é obrigatório.")
+ ]
diff --git a/sapl/base/tests/teststub_urls.py b/sapl/base/tests/teststub_urls.py
index 8bf2ae2bd..61a434f82 100644
--- a/sapl/base/tests/teststub_urls.py
+++ b/sapl/base/tests/teststub_urls.py
@@ -3,7 +3,5 @@ from django.views.generic.base import TemplateView
from sapl.urls import urlpatterns as original_patterns
-ptrn = [path('zzzz',
- TemplateView.as_view(
- template_name='index.html'), name='zzzz')]
+ptrn = [path("zzzz", TemplateView.as_view(template_name="index.html"), name="zzzz")]
urlpatterns = original_patterns + ptrn
diff --git a/sapl/base/urls.py b/sapl/base/urls.py
index 36cef7210..363730c91 100644
--- a/sapl/base/urls.py
+++ b/sapl/base/urls.py
@@ -1,137 +1,205 @@
import os
-from django.urls import include, path, re_path
from django.contrib.auth import views
from django.contrib.auth.decorators import permission_required
+from django.urls import include, path, re_path
from django.views.generic.base import RedirectView, TemplateView
-from sapl.base.views import (AutorCrud, ConfirmarEmailView, TipoAutorCrud, get_estatistica,
- RecuperarSenhaEmailView, RecuperarSenhaFinalizadoView,
- RecuperarSenhaConfirmaView, RecuperarSenhaCompletoView, IndexView, UserCrud)
-from sapl.settings import MEDIA_URL, LOGOUT_REDIRECT_URL
+from sapl.base.views import (AutorCrud, ConfirmarEmailView, IndexView,
+ RecuperarSenhaCompletoView,
+ RecuperarSenhaConfirmaView,
+ RecuperarSenhaEmailView,
+ RecuperarSenhaFinalizadoView, TipoAutorCrud,
+ UserCrud, get_estatistica)
+from sapl.settings import LOGOUT_REDIRECT_URL, MEDIA_URL
+
from .apps import AppConfig
-from .views import (LoginSapl, AlterarSenha, AppConfigCrud, CasaLegislativaCrud,
- HelpTopicView, LogotipoView, PesquisarAuditLogView,
- SaplSearchView,
- ListarInconsistenciasView,
- ListarProtocolosDuplicadosView, ListarProtocolosComMateriasView, ListarMatProtocoloInexistenteView,
- ListarParlamentaresDuplicadosView, ListarFiliacoesSemDataFiliacaoView,
- ListarMandatoSemDataInicioView, ListarParlMandatosIntersecaoView, ListarParlFiliacoesIntersecaoView,
- ListarAutoresDuplicadosView, ListarBancadaComissaoAutorExternoView, ListarLegislaturaInfindavelView,
- ListarAnexadasCiclicasView, ListarAnexadosCiclicosView, pesquisa_textual)
+from .views import (AlterarSenha, AppConfigCrud, CasaLegislativaCrud,
+ HelpTopicView, ListarAnexadasCiclicasView,
+ ListarAnexadosCiclicosView, ListarAutoresDuplicadosView,
+ ListarBancadaComissaoAutorExternoView,
+ ListarFiliacoesSemDataFiliacaoView,
+ ListarInconsistenciasView, ListarLegislaturaInfindavelView,
+ ListarMandatoSemDataInicioView,
+ ListarMatProtocoloInexistenteView,
+ ListarParlamentaresDuplicadosView,
+ ListarParlFiliacoesIntersecaoView,
+ ListarParlMandatosIntersecaoView,
+ ListarProtocolosComMateriasView,
+ ListarProtocolosDuplicadosView, LoginSapl, LogotipoView,
+ PesquisarAuditLogView, SaplSearchView, pesquisa_textual)
app_name = AppConfig.name
admin_user = [
- path('sistema/usuario/', include(UserCrud.get_urls())),
-
+ path("sistema/usuario/", include(UserCrud.get_urls())),
]
alterar_senha = [
- path('sistema/alterar-senha/',
- AlterarSenha.as_view(),
- name='alterar_senha'),
-
+ path("sistema/alterar-senha/", AlterarSenha.as_view(), name="alterar_senha"),
]
recuperar_senha = [
- path('recuperar-senha/email/', RecuperarSenhaEmailView.as_view(),
- name='recuperar_senha_email'),
- path('recuperar-senha/finalizado/',
- RecuperarSenhaFinalizadoView.as_view(), name='recuperar_senha_finalizado'),
- re_path(r'^recuperar-senha/(?P[0-9A-Za-z_\-]+)/(?P.+)/$', RecuperarSenhaConfirmaView.as_view(),
- name='recuperar_senha_confirma'),
- path('recuperar-senha/completo/',
- RecuperarSenhaCompletoView.as_view(), name='recuperar_senha_completo'),
+ path(
+ "recuperar-senha/email/",
+ RecuperarSenhaEmailView.as_view(),
+ name="recuperar_senha_email",
+ ),
+ path(
+ "recuperar-senha/finalizado/",
+ RecuperarSenhaFinalizadoView.as_view(),
+ name="recuperar_senha_finalizado",
+ ),
+ re_path(
+ r"^recuperar-senha/(?P[0-9A-Za-z_\-]+)/(?P.+)/$",
+ RecuperarSenhaConfirmaView.as_view(),
+ name="recuperar_senha_confirma",
+ ),
+ path(
+ "recuperar-senha/completo/",
+ RecuperarSenhaCompletoView.as_view(),
+ name="recuperar_senha_completo",
+ ),
]
-urlpatterns = [
- path('', IndexView.as_view(template_name='index.html'), name='sapl_index'),
-
- path('sistema/autor/tipo/', include(TipoAutorCrud.get_urls())),
- path('sistema/autor/', include(AutorCrud.get_urls())),
-
- re_path(r'^sistema/ajuda/(?P\w+)$',
- HelpTopicView.as_view(), name='help_topic'),
- path('sistema/ajuda/', TemplateView.as_view(template_name='ajuda.html'),
- name='help'),
- path('sistema/casa-legislativa/', include(CasaLegislativaCrud.get_urls()),
- name="casa_legislativa"),
- path('sistema/app-config/', include(AppConfigCrud.get_urls())),
-
- re_path(r'^email/validate/(?P[0-9A-Za-z_\-]+)/'
- '(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$',
- ConfirmarEmailView.as_view(), name='confirmar_email'),
-
- path('sistema/inconsistencias/',
- ListarInconsistenciasView.as_view(),
- name='lista_inconsistencias'),
- path('sistema/inconsistencias/protocolos_duplicados',
- ListarProtocolosDuplicadosView.as_view(),
- name='lista_protocolos_duplicados'),
- path('sistema/inconsistencias/protocolos_com_materias',
- ListarProtocolosComMateriasView.as_view(),
- name='lista_protocolos_com_materias'),
- path('sistema/inconsistencias/materias_protocolo_inexistente',
- ListarMatProtocoloInexistenteView.as_view(),
- name='lista_materias_protocolo_inexistente'),
- path('sistema/inconsistencias/filiacoes_sem_data_filiacao',
- ListarFiliacoesSemDataFiliacaoView.as_view(),
- name='lista_filiacoes_sem_data_filiacao'),
- re_path(r'^sistema/inconsistencias/mandato_sem_data_inicio',
- ListarMandatoSemDataInicioView.as_view(),
- name='lista_mandato_sem_data_inicio'),
- path('sistema/inconsistencias/parlamentares_duplicados',
- ListarParlamentaresDuplicadosView.as_view(),
- name='lista_parlamentares_duplicados'),
- path('sistema/inconsistencias/parlamentares_mandatos_intersecao',
- ListarParlMandatosIntersecaoView.as_view(),
- name='lista_parlamentares_mandatos_intersecao'),
- path('sistema/inconsistencias/parlamentares_filiacoes_intersecao',
- ListarParlFiliacoesIntersecaoView.as_view(),
- name='lista_parlamentares_filiacoes_intersecao'),
- path('sistema/inconsistencias/autores_duplicados',
- ListarAutoresDuplicadosView.as_view(),
- name='lista_autores_duplicados'),
- path('sistema/inconsistencias/bancada_comissao_autor_externo',
- ListarBancadaComissaoAutorExternoView.as_view(),
- name='lista_bancada_comissao_autor_externo'),
- path('sistema/inconsistencias/legislatura_infindavel',
- ListarLegislaturaInfindavelView.as_view(),
- name='lista_legislatura_infindavel'),
- path('sistema/inconsistencias/anexadas_ciclicas',
- ListarAnexadasCiclicasView.as_view(),
- name='lista_anexadas_ciclicas'),
- path('sistema/inconsistencias/anexados_ciclicos',
- ListarAnexadosCiclicosView.as_view(),
- name='lista_anexados_ciclicos'),
-
- re_path(r'^sistema/pesquisa-textual',
- pesquisa_textual,
- name='pesquisa_textual'),
-
- re_path(r'^sistema/estatisticas', get_estatistica),
-
- # todos os sublinks de sistema devem vir acima deste
- path('sistema/', permission_required('base.view_tabelas_auxiliares')
- (TemplateView.as_view(template_name='sistema.html')),
- name='sistema'),
-
- path('login/', LoginSapl.as_view(), name='login'),
- path('logout/', views.LogoutView.as_view(),
- {'next_page': LOGOUT_REDIRECT_URL}, name='logout'),
-
- re_path(r'^sistema/search/', SaplSearchView(), name='haystack_search'),
-
- path('sistema/auditlog/', PesquisarAuditLogView.as_view(), name='pesquisar_auditlog'),
-
- # Folhas XSLT e extras referenciadas por documentos migrados do sapl 2.5
- re_path(r'^(sapl/)?XSLT/HTML/(?P.*)$', RedirectView.as_view(
- url=os.path.join(MEDIA_URL, 'sapl/public/XSLT/HTML/%(path)s'),
- permanent=False)),
- # url do logotipo usada em documentos migrados do sapl 2.5
- re_path(r'^(sapl/)?sapl_documentos/props_sapl/logo_casa',
- LogotipoView.as_view(), name='logotipo'),
-
-
-] + recuperar_senha + alterar_senha + admin_user
+urlpatterns = (
+ [
+ path("", IndexView.as_view(template_name="index.html"), name="sapl_index"),
+ path("sistema/autor/tipo/", include(TipoAutorCrud.get_urls())),
+ path("sistema/autor/", include(AutorCrud.get_urls())),
+ re_path(
+ r"^sistema/ajuda/(?P\w+)$",
+ HelpTopicView.as_view(),
+ name="help_topic",
+ ),
+ path(
+ "sistema/ajuda/",
+ TemplateView.as_view(template_name="ajuda.html"),
+ name="help",
+ ),
+ path(
+ "sistema/casa-legislativa/",
+ include(CasaLegislativaCrud.get_urls()),
+ name="casa_legislativa",
+ ),
+ path("sistema/app-config/", include(AppConfigCrud.get_urls())),
+ re_path(
+ r"^email/validate/(?P[0-9A-Za-z_\-]+)/"
+ "(?P[0-9A-Za-z]{1,13}-[0-9A-Za-z]{1,20})$",
+ ConfirmarEmailView.as_view(),
+ name="confirmar_email",
+ ),
+ path(
+ "sistema/inconsistencias/",
+ ListarInconsistenciasView.as_view(),
+ name="lista_inconsistencias",
+ ),
+ path(
+ "sistema/inconsistencias/protocolos_duplicados",
+ ListarProtocolosDuplicadosView.as_view(),
+ name="lista_protocolos_duplicados",
+ ),
+ path(
+ "sistema/inconsistencias/protocolos_com_materias",
+ ListarProtocolosComMateriasView.as_view(),
+ name="lista_protocolos_com_materias",
+ ),
+ path(
+ "sistema/inconsistencias/materias_protocolo_inexistente",
+ ListarMatProtocoloInexistenteView.as_view(),
+ name="lista_materias_protocolo_inexistente",
+ ),
+ path(
+ "sistema/inconsistencias/filiacoes_sem_data_filiacao",
+ ListarFiliacoesSemDataFiliacaoView.as_view(),
+ name="lista_filiacoes_sem_data_filiacao",
+ ),
+ re_path(
+ r"^sistema/inconsistencias/mandato_sem_data_inicio",
+ ListarMandatoSemDataInicioView.as_view(),
+ name="lista_mandato_sem_data_inicio",
+ ),
+ path(
+ "sistema/inconsistencias/parlamentares_duplicados",
+ ListarParlamentaresDuplicadosView.as_view(),
+ name="lista_parlamentares_duplicados",
+ ),
+ path(
+ "sistema/inconsistencias/parlamentares_mandatos_intersecao",
+ ListarParlMandatosIntersecaoView.as_view(),
+ name="lista_parlamentares_mandatos_intersecao",
+ ),
+ path(
+ "sistema/inconsistencias/parlamentares_filiacoes_intersecao",
+ ListarParlFiliacoesIntersecaoView.as_view(),
+ name="lista_parlamentares_filiacoes_intersecao",
+ ),
+ path(
+ "sistema/inconsistencias/autores_duplicados",
+ ListarAutoresDuplicadosView.as_view(),
+ name="lista_autores_duplicados",
+ ),
+ path(
+ "sistema/inconsistencias/bancada_comissao_autor_externo",
+ ListarBancadaComissaoAutorExternoView.as_view(),
+ name="lista_bancada_comissao_autor_externo",
+ ),
+ path(
+ "sistema/inconsistencias/legislatura_infindavel",
+ ListarLegislaturaInfindavelView.as_view(),
+ name="lista_legislatura_infindavel",
+ ),
+ path(
+ "sistema/inconsistencias/anexadas_ciclicas",
+ ListarAnexadasCiclicasView.as_view(),
+ name="lista_anexadas_ciclicas",
+ ),
+ path(
+ "sistema/inconsistencias/anexados_ciclicos",
+ ListarAnexadosCiclicosView.as_view(),
+ name="lista_anexados_ciclicos",
+ ),
+ re_path(
+ r"^sistema/pesquisa-textual", pesquisa_textual, name="pesquisa_textual"
+ ),
+ re_path(r"^sistema/estatisticas", get_estatistica),
+ # todos os sublinks de sistema devem vir acima deste
+ path(
+ "sistema/",
+ permission_required("base.view_tabelas_auxiliares")(
+ TemplateView.as_view(template_name="sistema.html")
+ ),
+ name="sistema",
+ ),
+ path("login/", LoginSapl.as_view(), name="login"),
+ path(
+ "logout/",
+ views.LogoutView.as_view(),
+ {"next_page": LOGOUT_REDIRECT_URL},
+ name="logout",
+ ),
+ re_path(r"^sistema/search/", SaplSearchView(), name="haystack_search"),
+ path(
+ "sistema/auditlog/",
+ PesquisarAuditLogView.as_view(),
+ name="pesquisar_auditlog",
+ ),
+ # Folhas XSLT e extras referenciadas por documentos migrados do sapl 2.5
+ re_path(
+ r"^(sapl/)?XSLT/HTML/(?P.*)$",
+ RedirectView.as_view(
+ url=os.path.join(MEDIA_URL, "sapl/public/XSLT/HTML/%(path)s"),
+ permanent=False,
+ ),
+ ),
+ # url do logotipo usada em documentos migrados do sapl 2.5
+ re_path(
+ r"^(sapl/)?sapl_documentos/props_sapl/logo_casa",
+ LogotipoView.as_view(),
+ name="logotipo",
+ ),
+ ]
+ + recuperar_senha
+ + alterar_senha
+ + admin_user
+)
diff --git a/sapl/base/views.py b/sapl/base/views.py
index 32b25deb7..8b60b3c19 100644
--- a/sapl/base/views.py
+++ b/sapl/base/views.py
@@ -1,20 +1,21 @@
import collections
-import collections
import itertools
import logging
import os
from django.apps.registry import apps
from django.contrib import messages
-from django.contrib.auth import authenticate, login, get_user_model, views
+from django.contrib.auth import authenticate, get_user_model, login, views
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.auth.models import Group
from django.contrib.auth.tokens import default_token_generator
-from django.contrib.auth.views import (PasswordResetView, PasswordResetConfirmView, PasswordResetCompleteView,
- PasswordResetDoneView)
+from django.contrib.auth.views import (PasswordResetCompleteView,
+ PasswordResetConfirmView,
+ PasswordResetDoneView,
+ PasswordResetView)
from django.core.exceptions import PermissionDenied, ValidationError
from django.core.mail import send_mail
-from django.db.models import Count, Q, Max
+from django.db.models import Count, Max, Q
from django.http import Http404, HttpResponseRedirect, JsonResponse
from django.shortcuts import redirect
from django.template import TemplateDoesNotExist
@@ -25,7 +26,7 @@ from django.utils.decorators import method_decorator
from django.utils.encoding import force_bytes
from django.utils.http import urlsafe_base64_decode, urlsafe_base64_encode
from django.utils.translation import gettext_lazy as _
-from django.views.generic import (FormView, ListView)
+from django.views.generic import FormView, ListView
from django.views.generic.base import RedirectView, TemplateView
from django_filters.views import FilterView
from haystack.query import SearchQuerySet
@@ -33,26 +34,28 @@ from haystack.views import SearchView
from ratelimit.decorators import ratelimit
from sapl import settings
-from sapl.base.forms import (AutorForm, TipoAutorForm, RecuperarSenhaForm,
- NovaSenhaForm, UserAdminForm, AuditLogFilterSet,
- LoginForm, SaplSearchForm)
+from sapl.base.forms import (AuditLogFilterSet, AutorForm, LoginForm,
+ NovaSenhaForm, RecuperarSenhaForm, SaplSearchForm,
+ TipoAutorForm, UserAdminForm)
from sapl.base.models import AuditLog, Autor, TipoAutor
from sapl.comissoes.models import Comissao
-from sapl.crud.base import CrudAux, make_pagination, Crud, \
- ListWithSearchForm
-from sapl.materia.models import (Anexada, MateriaLegislativa,
- Proposicao)
+from sapl.crud.base import Crud, CrudAux, ListWithSearchForm, make_pagination
+from sapl.materia.models import Anexada, MateriaLegislativa, Proposicao
from sapl.norma.models import NormaJuridica, ViewNormasEstatisticas
-from sapl.parlamentares.models import (
- Filiacao, Legislatura, Mandato, Parlamentar)
-from sapl.protocoloadm.models import (Anexado, Protocolo)
-from sapl.relatorios.views import (relatorio_estatisticas_acesso_normas)
-from sapl.sessao.models import (Bancada, SessaoPlenaria)
+from sapl.parlamentares.models import (Filiacao, Legislatura, Mandato,
+ Parlamentar)
+from sapl.protocoloadm.models import Anexado, Protocolo
+from sapl.relatorios.views import relatorio_estatisticas_acesso_normas
+from sapl.sessao.models import Bancada, SessaoPlenaria
from sapl.settings import EMAIL_SEND_USER
-from sapl.utils import (gerar_hash_arquivo, intervalos_tem_intersecao, mail_service_configured,
- SEPARADOR_HASH_PROPOSICAO, show_results_filter_set, google_recaptcha_configured,
- get_client_ip, sapn_is_enabled, is_weak_password)
-from .forms import (AlterarSenhaForm, CasaLegislativaForm, ConfiguracoesAppForm, EstatisticasAcessoNormasForm)
+from sapl.utils import (SEPARADOR_HASH_PROPOSICAO, gerar_hash_arquivo,
+ get_client_ip, google_recaptcha_configured,
+ intervalos_tem_intersecao, is_weak_password,
+ mail_service_configured, sapn_is_enabled,
+ show_results_filter_set)
+
+from .forms import (AlterarSenhaForm, CasaLegislativaForm,
+ ConfiguracoesAppForm, EstatisticasAcessoNormasForm)
from .models import AppConfig, CasaLegislativa
@@ -63,28 +66,33 @@ def get_casalegislativa():
class IndexView(TemplateView):
def get(self, request, *args, **kwargs):
if sapn_is_enabled():
- return redirect('/norma/pesquisar')
+ return redirect("/norma/pesquisar")
return TemplateView.get(self, request, *args, **kwargs)
-@method_decorator(ratelimit(key=lambda group, request: get_client_ip(request),
- rate='20/m',
- method=ratelimit.UNSAFE,
- block=True), name='dispatch')
+@method_decorator(
+ ratelimit(
+ key=lambda group, request: get_client_ip(request),
+ rate="20/m",
+ method=ratelimit.UNSAFE,
+ block=True,
+ ),
+ name="dispatch",
+)
class LoginSapl(views.LoginView):
- template_name = 'base/login.html'
+ template_name = "base/login.html"
authentication_form = LoginForm
def form_valid(self, form):
"""Override do comportamento padrão para verificar senha fraca"""
- username = form.cleaned_data.get('username')
- password = form.cleaned_data.get('password')
+ username = form.cleaned_data.get("username")
+ password = form.cleaned_data.get("password")
user = authenticate(self.request, username=username, password=password)
if user is not None:
login(self.request, user)
if is_weak_password(password):
- self.request.session['weak_password'] = True
+ self.request.session["weak_password"] = True
return redirect(self.get_success_url())
# Fallback se falhar a autenticação (tecnicamente não devia chegar aqui)
@@ -95,7 +103,7 @@ class ConfirmarEmailView(TemplateView):
template_name = "email/confirma.html"
def get(self, request, *args, **kwargs):
- uid = urlsafe_base64_decode(self.kwargs['uidb64'])
+ uid = urlsafe_base64_decode(self.kwargs["uidb64"])
user = get_user_model().objects.get(id=uid)
user.is_active = True
user.save()
@@ -106,58 +114,56 @@ class ConfirmarEmailView(TemplateView):
class RecuperarSenhaEmailView(PasswordResetView):
logger = logging.getLogger(__name__)
- success_url = reverse_lazy('sapl.base:recuperar_senha_finalizado')
- email_template_name = 'base/recuperar_senha_email.html'
- html_email_template_name = 'base/recuperar_senha_email.html'
- template_name = 'base/recuperar_senha_email_form.html'
+ success_url = reverse_lazy("sapl.base:recuperar_senha_finalizado")
+ email_template_name = "base/recuperar_senha_email.html"
+ html_email_template_name = "base/recuperar_senha_email.html"
+ template_name = "base/recuperar_senha_email_form.html"
from_email = EMAIL_SEND_USER
form_class = RecuperarSenhaForm
def get(self, request, *args, **kwargs):
-
if not google_recaptcha_configured():
- self.logger.warning(_('Google Recaptcha não configurado!'))
- messages.error(request, _('Google Recaptcha não configurado!'))
- return redirect(request.headers.get('referer', '/'))
+ self.logger.warning(_("Google Recaptcha não configurado!"))
+ messages.error(request, _("Google Recaptcha não configurado!"))
+ return redirect(request.headers.get("referer", "/"))
return PasswordResetView.get(self, request, *args, **kwargs)
def post(self, request, *args, **kwargs):
-
if not google_recaptcha_configured():
- self.logger.warning(_('Google Recaptcha não configurado!'))
- messages.error(request, _('Google Recaptcha não configurado!'))
- return redirect(request.headers.get('referer', '/'))
+ self.logger.warning(_("Google Recaptcha não configurado!"))
+ messages.error(request, _("Google Recaptcha não configurado!"))
+ return redirect(request.headers.get("referer", "/"))
return PasswordResetView.post(self, request, *args, **kwargs)
class RecuperarSenhaFinalizadoView(PasswordResetDoneView):
- template_name = 'base/recupera_senha_email_enviado.html'
+ template_name = "base/recupera_senha_email_enviado.html"
class RecuperarSenhaConfirmaView(PasswordResetConfirmView):
- success_url = reverse_lazy('sapl.base:recuperar_senha_completo')
- template_name = 'base/nova_senha_form.html'
+ success_url = reverse_lazy("sapl.base:recuperar_senha_completo")
+ template_name = "base/nova_senha_form.html"
form_class = NovaSenhaForm
class RecuperarSenhaCompletoView(PasswordResetCompleteView):
- template_name = 'base/recuperar_senha_completo.html'
+ template_name = "base/recuperar_senha_completo.html"
class TipoAutorCrud(CrudAux):
model = TipoAutor
- help_topic = 'tipo-autor'
+ help_topic = "tipo-autor"
class BaseMixin(CrudAux.BaseMixin):
- list_field_names = ['descricao']
+ list_field_names = ["descricao"]
form_class = TipoAutorForm
@property
def verbose_name(self):
vn = super().verbose_name
- vn = "{} {}".format(vn, _('Externo ao SAPL'))
+ vn = "{} {}".format(vn, _("Externo ao SAPL"))
return vn
class ListView(CrudAux.ListView):
@@ -171,13 +177,11 @@ class TipoAutorCrud(CrudAux):
def get_context_data(self, **kwargs):
context = CrudAux.ListView.get_context_data(self, **kwargs)
- context['tipos_sapl'] = TipoAutor.objects.filter(
- content_type__isnull=False)
+ context["tipos_sapl"] = TipoAutor.objects.filter(content_type__isnull=False)
return context
class TipoAutorMixin:
-
def dispatch(self, request, *args, **kwargs):
object = self.get_object()
if object.content_type:
@@ -196,91 +200,101 @@ class TipoAutorCrud(CrudAux):
class AutorCrud(CrudAux):
model = Autor
- help_topic = 'autor'
+ help_topic = "autor"
class BaseMixin(CrudAux.BaseMixin):
- list_field_names = ['nome', 'tipo', 'operadores']
+ list_field_names = ["nome", "tipo", "operadores"]
def send_mail_operadores(self):
username = self.request.user.username
if not mail_service_configured():
- self.logger.warning(_('Registro de Autor sem envio de email. '
- 'Servidor de email não configurado.'))
+ self.logger.warning(
+ _(
+ "Registro de Autor sem envio de email. "
+ "Servidor de email não configurado."
+ )
+ )
return
try:
- self.logger.debug('user=' + username +
- '. Enviando email na criação de Autores.')
+ self.logger.debug(
+ "user=" + username + ". Enviando email na criação de Autores."
+ )
kwargs = {}
for user in self.object.operadores.all():
-
if not user.email:
self.logger.warning(
- _('Registro de Autor sem envio de email. '
- 'Usuário sem um email cadastrado.'))
+ _(
+ "Registro de Autor sem envio de email. "
+ "Usuário sem um email cadastrado."
+ )
+ )
continue
- kwargs['token'] = default_token_generator.make_token(user)
- kwargs['uidb64'] = urlsafe_base64_encode(
- force_bytes(user.pk))
+ kwargs["token"] = default_token_generator.make_token(user)
+ kwargs["uidb64"] = urlsafe_base64_encode(force_bytes(user.pk))
assunto = "SAPL - Confirmação de Conta"
full_url = self.request.get_raw_uri()
- url_base = full_url[:full_url.find('sistema') - 1]
+ url_base = full_url[: full_url.find("sistema") - 1]
mensagem = (
- "Este e-mail foi utilizado para fazer cadastro no " +
- "SAPL com o perfil de Autor. Agora você pode " +
- "criar/editar/enviar Proposições.\n" +
- "Seu nome de usuário é: " +
- self.request.POST['username'] + "\n"
- "Caso você não tenha feito este cadastro, por favor " +
- "ignore esta mensagem. Caso tenha, clique " +
- "no link abaixo\n" + url_base +
- reverse('sapl.base:confirmar_email', kwargs=kwargs))
+ "Este e-mail foi utilizado para fazer cadastro no "
+ + "SAPL com o perfil de Autor. Agora você pode "
+ + "criar/editar/enviar Proposições.\n"
+ + "Seu nome de usuário é: "
+ + self.request.POST["username"]
+ + "\n"
+ "Caso você não tenha feito este cadastro, por favor "
+ + "ignore esta mensagem. Caso tenha, clique "
+ + "no link abaixo\n"
+ + url_base
+ + reverse("sapl.base:confirmar_email", kwargs=kwargs)
+ )
remetente = settings.EMAIL_SEND_USER
destinatario = [user.email]
- send_mail(assunto, mensagem, remetente, destinatario,
- fail_silently=False)
+ send_mail(
+ assunto, mensagem, remetente, destinatario, fail_silently=False
+ )
except Exception as e:
- print(
- _('Erro no envio de email na criação de Autores.'))
+ print(_("Erro no envio de email na criação de Autores."))
self.logger.error(
- 'user=' + username + '. Erro no envio de email na criação de Autores. ' + str(e))
+ "user="
+ + username
+ + ". Erro no envio de email na criação de Autores. "
+ + str(e)
+ )
class DeleteView(CrudAux.DeleteView):
-
def delete(self, *args, **kwargs):
self.object = self.get_object()
- grupo = Group.objects.filter(name='Autor')[0]
+ grupo = Group.objects.filter(name="Autor")[0]
lista_operadores = list(self.object.operadores.all())
response = CrudAux.DeleteView.delete(self, *args, **kwargs)
- if not Autor.objects.filter(pk=kwargs['pk']).exists():
+ if not Autor.objects.filter(pk=kwargs["pk"]).exists():
for u in lista_operadores:
u.groups.remove(grupo)
return response
class DetailView(CrudAux.DetailView):
-
def hook_operadores(self, obj):
- r = '
{}
'.format(
- ''.join(
+ r = "
{}
".format(
+ "".join(
[
- '
{} - ({}) - '
- '{}'
- '
'.format(u.first_name, u, u.email)
+ "
{} - ({}) - "
+ "{}"
+ "
".format(u.first_name, u, u.email)
for u in obj.operadores.all()
]
)
-
)
- return 'Operadores', r
+ return "Operadores", r
class UpdateView(CrudAux.UpdateView):
logger = logging.getLogger(__name__)
@@ -304,20 +318,19 @@ class AutorCrud(CrudAux):
form_search_class = ListWithSearchForm
def hook_operadores(self, *args, **kwargs):
- r = '
{}
'.format(
- ''.join(
+ r = "
{}
".format(
+ "".join(
[
- '
{} - ({})
'.format(u.first_name, u)
+ "
{} - ({})
".format(u.first_name, u)
for u in args[0].operadores.all()
]
)
-
)
- return r, ''
+ return r, ""
def get_queryset(self):
qs = self.model.objects.all()
- q_param = self.request.GET.get('q', '')
+ q_param = self.request.GET.get("q", "")
if q_param:
q = Q(nome__icontains=q_param)
q |= Q(cargo__icontains=q_param)
@@ -325,46 +338,54 @@ class AutorCrud(CrudAux):
q |= Q(operadores__username__icontains=q_param)
q |= Q(operadores__email__icontains=q_param)
qs = qs.filter(q)
- return qs.distinct('nome', 'id').order_by('nome', 'id')
+ return qs.distinct("nome", "id").order_by("nome", "id")
class EstatisticasAcessoNormas(TemplateView):
- template_name = 'base/EstatisticasAcessoNormas_filter.html'
+ template_name = "base/EstatisticasAcessoNormas_filter.html"
def get(self, request, *args, **kwargs):
- context = super(EstatisticasAcessoNormas,
- self).get_context_data(**kwargs)
- context['title'] = _('Estatísticas de Acesso às Normas Jurídicas')
+ context = super(EstatisticasAcessoNormas, self).get_context_data(**kwargs)
+ context["title"] = _("Estatísticas de Acesso às Normas Jurídicas")
form = EstatisticasAcessoNormasForm(request.GET or None)
- context['form'] = form
+ context["form"] = form
if not form.is_valid():
return self.render_to_response(context)
- context['ano'] = self.request.GET['ano']
- context['mes'] = self.request.GET.get('mes', '')
- context['mais_acessadas'] = int(
- self.request.GET.get('mais_acessadas', 5))
+ context["ano"] = self.request.GET["ano"]
+ context["mes"] = self.request.GET.get("mes", "")
+ context["mais_acessadas"] = int(self.request.GET.get("mais_acessadas", 5))
- if not context['mes'] and context['mais_acessadas'] > 10:
- context['mais_acessadas'] = 10
+ if not context["mes"] and context["mais_acessadas"] > 10:
+ context["mais_acessadas"] = 10
params = {
- 'ano_est': context['ano'],
- 'mais_acessadas__lte': context['mais_acessadas']
+ "ano_est": context["ano"],
+ "mais_acessadas__lte": context["mais_acessadas"],
}
- if context['mes']:
- params['mes_est'] = context['mes']
+ if context["mes"]:
+ params["mes_est"] = context["mes"]
- estatisticas = ViewNormasEstatisticas.objects.filter(
- **params
- )
+ estatisticas = ViewNormasEstatisticas.objects.filter(**params)
normas_count_mes = collections.OrderedDict()
normas_mes = collections.OrderedDict()
- meses = {1: 'Janeiro', 2: 'Fevereiro', 3: 'Março', 4: 'Abril', 5: 'Maio', 6: 'Junho',
- 7: 'Julho', 8: 'Agosto', 9: 'Setembro', 10: 'Outubro', 11: 'Novembro', 12: 'Dezembro'}
+ meses = {
+ 1: "Janeiro",
+ 2: "Fevereiro",
+ 3: "Março",
+ 4: "Abril",
+ 5: "Maio",
+ 6: "Junho",
+ 7: "Julho",
+ 8: "Agosto",
+ 9: "Setembro",
+ 10: "Outubro",
+ 11: "Novembro",
+ 12: "Dezembro",
+ }
for norma in estatisticas:
if not meses[norma.mes_est] in normas_mes:
@@ -374,14 +395,13 @@ class EstatisticasAcessoNormas(TemplateView):
normas_count_mes[meses[norma.mes_est]] += norma.norma_count
normas_mes[meses[norma.mes_est]].append(norma)
- context['normas_mes'] = normas_mes
+ context["normas_mes"] = normas_mes
- context['normas_count_mes'] = normas_count_mes
+ context["normas_count_mes"] = normas_count_mes
- is_relatorio = request.GET.get('relatorio')
+ is_relatorio = request.GET.get("relatorio")
- context['show_results'] = show_results_filter_set(
- self.request.GET.copy())
+ context["show_results"] = show_results_filter_set(self.request.GET.copy())
if is_relatorio:
return relatorio_estatisticas_acesso_normas(self, request, context)
@@ -391,89 +411,98 @@ class EstatisticasAcessoNormas(TemplateView):
class ListarInconsistenciasView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/lista_inconsistencias.html'
- context_object_name = 'tabela_inconsistencias'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/lista_inconsistencias.html"
+ context_object_name = "tabela_inconsistencias"
+ permission_required = ("base.list_appconfig",)
def get_queryset(self):
tabela = []
tabela.append(
- ('protocolos_duplicados',
- 'Protocolos duplicados',
- len(protocolos_duplicados())
- )
+ (
+ "protocolos_duplicados",
+ "Protocolos duplicados",
+ len(protocolos_duplicados()),
+ )
)
tabela.append(
- ('protocolos_com_materias',
- 'Protocolos que excedem o limite de matérias vinculadas',
- len(protocolos_com_materias())
- )
+ (
+ "protocolos_com_materias",
+ "Protocolos que excedem o limite de matérias vinculadas",
+ len(protocolos_com_materias()),
+ )
)
tabela.append(
- ('materias_protocolo_inexistente',
- 'Matérias Legislativas com protocolo inexistente',
- len(materias_protocolo_inexistente())
- )
+ (
+ "materias_protocolo_inexistente",
+ "Matérias Legislativas com protocolo inexistente",
+ len(materias_protocolo_inexistente()),
+ )
)
tabela.append(
- ('filiacoes_sem_data_filiacao',
- 'Filiações sem data filiação',
- len(filiacoes_sem_data_filiacao())
- )
+ (
+ "filiacoes_sem_data_filiacao",
+ "Filiações sem data filiação",
+ len(filiacoes_sem_data_filiacao()),
+ )
)
tabela.append(
- ('mandato_sem_data_inicio',
- 'Mandatos sem data inicial',
- len(mandato_sem_data_inicio())
- )
+ (
+ "mandato_sem_data_inicio",
+ "Mandatos sem data inicial",
+ len(mandato_sem_data_inicio()),
+ )
)
tabela.append(
- ('parlamentares_duplicados',
- 'Parlamentares duplicados',
- len(parlamentares_duplicados())
- )
+ (
+ "parlamentares_duplicados",
+ "Parlamentares duplicados",
+ len(parlamentares_duplicados()),
+ )
)
tabela.append(
- ('parlamentares_mandatos_intersecao',
- 'Parlamentares com mandatos em interseção',
- len(parlamentares_mandatos_intersecao())
- )
+ (
+ "parlamentares_mandatos_intersecao",
+ "Parlamentares com mandatos em interseção",
+ len(parlamentares_mandatos_intersecao()),
+ )
)
tabela.append(
- ('parlamentares_filiacoes_intersecao',
- 'Parlamentares com filiações em interseção',
- len(parlamentares_filiacoes_intersecao())
- )
+ (
+ "parlamentares_filiacoes_intersecao",
+ "Parlamentares com filiações em interseção",
+ len(parlamentares_filiacoes_intersecao()),
+ )
)
tabela.append(
- ('autores_duplicados',
- 'Autores duplicados',
- len(autores_duplicados())
- )
+ ("autores_duplicados", "Autores duplicados", len(autores_duplicados()))
)
tabela.append(
- ('bancada_comissao_autor_externo',
- 'Bancadas e Comissões com autor externo',
- len(bancada_comissao_autor_externo())
- )
+ (
+ "bancada_comissao_autor_externo",
+ "Bancadas e Comissões com autor externo",
+ len(bancada_comissao_autor_externo()),
+ )
)
tabela.append(
- ('legislatura_infindavel',
- 'Legislaturas sem data fim',
- len(legislatura_infindavel())
- )
+ (
+ "legislatura_infindavel",
+ "Legislaturas sem data fim",
+ len(legislatura_infindavel()),
+ )
)
tabela.append(
- ('anexadas_ciclicas',
- 'Matérias Anexadas cíclicas',
- len(materias_anexadas_ciclicas())
- )
+ (
+ "anexadas_ciclicas",
+ "Matérias Anexadas cíclicas",
+ len(materias_anexadas_ciclicas()),
+ )
)
tabela.append(
- ('anexados_ciclicos',
- 'Documentos Anexados cíclicos',
- len(anexados_ciclicos(False))
- )
+ (
+ "anexados_ciclicos",
+ "Documentos Anexados cíclicos",
+ len(anexados_ciclicos(False)),
+ )
)
return tabela
@@ -481,10 +510,12 @@ class ListarInconsistenciasView(PermissionRequiredMixin, ListView):
def materias_anexadas_ciclicas():
ciclos = []
- for a in Anexada.objects.select_related('materia_principal',
- 'materia_anexada',
- 'materia_principal__tipo',
- 'materia_anexada__tipo'):
+ for a in Anexada.objects.select_related(
+ "materia_principal",
+ "materia_anexada",
+ "materia_principal__tipo",
+ "materia_anexada__tipo",
+ ):
visitados = [a.materia_principal]
anexadas = [a.materia_anexada]
while len(anexadas) > 0:
@@ -492,7 +523,11 @@ def materias_anexadas_ciclicas():
if ma not in visitados:
visitados.append(ma)
anexadas.extend(
- [a.materia_anexada for a in Anexada.objects.filter(materia_principal=ma)])
+ [
+ a.materia_anexada
+ for a in Anexada.objects.filter(materia_principal=ma)
+ ]
+ )
else:
ciclo_list = visitados + [ma]
ciclos.append(ciclo_list)
@@ -519,36 +554,38 @@ def anexados_ciclicos(ofMateriaLegislativa):
ciclicos = []
if ofMateriaLegislativa:
- principais = Anexada.objects.values(
- 'materia_principal'
- ).annotate(
- count=Count('materia_principal')
- ).filter(count__gt=0).order_by('-data_anexacao')
+ principais = (
+ Anexada.objects.values("materia_principal")
+ .annotate(count=Count("materia_principal"))
+ .filter(count__gt=0)
+ .order_by("-data_anexacao")
+ )
else:
- principais = Anexado.objects.values(
- 'documento_principal'
- ).annotate(
- count=Count('documento_principal')
- ).filter(count__gt=0).order_by('-data_anexacao')
+ principais = (
+ Anexado.objects.values("documento_principal")
+ .annotate(count=Count("documento_principal"))
+ .filter(count__gt=0)
+ .order_by("-data_anexacao")
+ )
for principal in principais:
anexados_total = []
if ofMateriaLegislativa:
anexados = Anexada.objects.filter(
- materia_principal=principal['materia_principal']
- ).order_by('-data_anexacao')
+ materia_principal=principal["materia_principal"]
+ ).order_by("-data_anexacao")
else:
anexados = Anexado.objects.filter(
- documento_principal=principal['documento_principal']
- ).order_by('-data_anexacao')
+ documento_principal=principal["documento_principal"]
+ ).order_by("-data_anexacao")
anexados_temp = list(anexados)
while anexados_temp:
anexado = anexados_temp.pop()
if ofMateriaLegislativa:
if anexado.materia_anexada not in anexados_total:
- if not principal['materia_principal'] == anexado.materia_anexada.pk:
+ if not principal["materia_principal"] == anexado.materia_anexada.pk:
anexados_total.append(anexado.materia_anexada)
anexados_anexado = Anexada.objects.filter(
materia_principal=anexado.materia_anexada
@@ -556,10 +593,18 @@ def anexados_ciclicos(ofMateriaLegislativa):
anexados_temp.extend(anexados_anexado)
else:
ciclicos.append(
- (anexado.data_anexacao, anexado.materia_principal, anexado.materia_anexada))
+ (
+ anexado.data_anexacao,
+ anexado.materia_principal,
+ anexado.materia_anexada,
+ )
+ )
else:
if anexado.documento_anexado not in anexados_total:
- if not principal['documento_principal'] == anexado.documento_anexado.pk:
+ if (
+ not principal["documento_principal"]
+ == anexado.documento_anexado.pk
+ ):
anexados_total.append(anexado.documento_anexado)
anexados_anexado = Anexado.objects.filter(
documento_principal=anexado.documento_anexado
@@ -567,112 +612,106 @@ def anexados_ciclicos(ofMateriaLegislativa):
anexados_temp.extend(anexados_anexado)
else:
ciclicos.append(
- (anexado.data_anexacao, anexado.documento_principal, anexado.documento_anexado))
+ (
+ anexado.data_anexacao,
+ anexado.documento_principal,
+ anexado.documento_anexado,
+ )
+ )
return ciclicos
class ListarAnexadosCiclicosView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/anexados_ciclicos.html'
- context_object_name = 'anexados_ciclicos'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/anexados_ciclicos.html"
+ context_object_name = "anexados_ciclicos"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return anexados_ciclicos(False)
def get_context_data(self, **kwargs):
- context = super(
- ListarAnexadosCiclicosView, self
- ).get_context_data(**kwargs)
+ context = super(ListarAnexadosCiclicosView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages
- )
- context['NO_ENTRIES_MSG'] = 'Nenhum encontrado.'
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
class ListarAnexadasCiclicasView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/anexadas_ciclicas.html'
- context_object_name = 'anexadas_ciclicas'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/anexadas_ciclicas.html"
+ context_object_name = "anexadas_ciclicas"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return materias_anexadas_ciclicas()
def get_context_data(self, **kwargs):
- context = super(
- ListarAnexadasCiclicasView, self
- ).get_context_data(**kwargs)
+ context = super(ListarAnexadasCiclicasView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages
- )
- context['NO_ENTRIES_MSG'] = 'Nenhuma encontrada.'
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhuma encontrada."
return context
def legislatura_infindavel():
- return Legislatura.objects.filter(data_fim__isnull=True).order_by('-numero')
+ return Legislatura.objects.filter(data_fim__isnull=True).order_by("-numero")
class ListarLegislaturaInfindavelView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/legislatura_infindavel.html'
- context_object_name = 'legislatura_infindavel'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/legislatura_infindavel.html"
+ context_object_name = "legislatura_infindavel"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return legislatura_infindavel()
def get_context_data(self, **kwargs):
- context = super(
- ListarLegislaturaInfindavelView, self
- ).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhuma encontrada.'
+ context = super(ListarLegislaturaInfindavelView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhuma encontrada."
return context
def bancada_comissao_autor_externo():
- tipo_autor_externo = TipoAutor.objects.filter(descricao='Externo')
+ tipo_autor_externo = TipoAutor.objects.filter(descricao="Externo")
lista_bancada_autor_externo = []
- for bancada in Bancada.objects.all().order_by('nome'):
+ for bancada in Bancada.objects.all().order_by("nome"):
autor_externo = bancada.autor.filter(tipo__in=tipo_autor_externo)
if autor_externo:
q_autor_externo = bancada.autor.get(tipo__in=tipo_autor_externo)
lista_bancada_autor_externo.append(
- (q_autor_externo, bancada, 'Bancada', 'sistema/bancada')
+ (q_autor_externo, bancada, "Bancada", "sistema/bancada")
)
lista_comissao_autor_externo = []
- for comissao in Comissao.objects.all().order_by('nome'):
+ for comissao in Comissao.objects.all().order_by("nome"):
autor_externo = comissao.autor.filter(tipo__in=tipo_autor_externo)
if autor_externo:
q_autor_externo = comissao.autor.get(tipo__in=tipo_autor_externo)
lista_comissao_autor_externo.append(
- (q_autor_externo, comissao, 'Comissão', 'comissao')
+ (q_autor_externo, comissao, "Comissão", "comissao")
)
return lista_bancada_autor_externo + lista_comissao_autor_externo
@@ -680,37 +719,39 @@ def bancada_comissao_autor_externo():
class ListarBancadaComissaoAutorExternoView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/bancada_comissao_autor_externo.html'
- context_object_name = 'bancada_comissao_autor_externo'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/bancada_comissao_autor_externo.html"
+ context_object_name = "bancada_comissao_autor_externo"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return bancada_comissao_autor_externo()
def get_context_data(self, **kwargs):
- context = super(
- ListarBancadaComissaoAutorExternoView, self
- ).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhuma encontrada.'
+ context = super(ListarBancadaComissaoAutorExternoView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhuma encontrada."
return context
def autores_duplicados():
- return [autor for autor in Autor.objects.values('nome').annotate(count=Count('nome')).filter(count__gt=1)]
+ return [
+ autor
+ for autor in Autor.objects.values("nome")
+ .annotate(count=Count("nome"))
+ .filter(count__gt=1)
+ ]
class ListarAutoresDuplicadosView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/autores_duplicados.html'
- context_object_name = 'autores_duplicados'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/autores_duplicados.html"
+ context_object_name = "autores_duplicados"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
@@ -718,36 +759,39 @@ class ListarAutoresDuplicadosView(PermissionRequiredMixin, ListView):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
def parlamentares_filiacoes_intersecao():
intersecoes = []
- for parlamentar in Parlamentar.objects.all().order_by('nome_parlamentar'):
+ for parlamentar in Parlamentar.objects.all().order_by("nome_parlamentar"):
filiacoes = parlamentar.filiacao_set.all()
combinacoes = itertools.combinations(filiacoes, 2)
for c in combinacoes:
data_filiacao1 = c[0].data
- data_desfiliacao1 = c[0].data_desfiliacao if c[0].data_desfiliacao else timezone.now(
- ).date()
+ data_desfiliacao1 = (
+ c[0].data_desfiliacao
+ if c[0].data_desfiliacao
+ else timezone.now().date()
+ )
data_filiacao2 = c[1].data
- data_desfiliacao2 = c[1].data_desfiliacao if c[1].data_desfiliacao else timezone.now(
- ).date()
+ data_desfiliacao2 = (
+ c[1].data_desfiliacao
+ if c[1].data_desfiliacao
+ else timezone.now().date()
+ )
if data_filiacao1 and data_filiacao2:
exists = intervalos_tem_intersecao(
- data_filiacao1, data_desfiliacao1,
- data_filiacao2, data_desfiliacao2)
+ data_filiacao1, data_desfiliacao1, data_filiacao2, data_desfiliacao2
+ )
if exists:
intersecoes.append((parlamentar, c[0], c[1]))
return intersecoes
@@ -755,47 +799,54 @@ def parlamentares_filiacoes_intersecao():
class ListarParlFiliacoesIntersecaoView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/parlamentares_filiacoes_intersecao.html'
- context_object_name = 'parlamentares_filiacoes_intersecao'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/parlamentares_filiacoes_intersecao.html"
+ context_object_name = "parlamentares_filiacoes_intersecao"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return parlamentares_filiacoes_intersecao()
def get_context_data(self, **kwargs):
- context = super(
- ListarParlFiliacoesIntersecaoView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ context = super(ListarParlFiliacoesIntersecaoView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
def parlamentares_mandatos_intersecao():
intersecoes = []
- for parlamentar in Parlamentar.objects.all().order_by('nome_parlamentar'):
+ for parlamentar in Parlamentar.objects.all().order_by("nome_parlamentar"):
mandatos = parlamentar.mandato_set.all()
combinacoes = itertools.combinations(mandatos, 2)
for c in combinacoes:
data_inicio_mandato1 = c[0].data_inicio_mandato
- data_fim_mandato1 = c[0].data_fim_mandato if c[0].data_fim_mandato else timezone.now(
- ).date()
+ data_fim_mandato1 = (
+ c[0].data_fim_mandato
+ if c[0].data_fim_mandato
+ else timezone.now().date()
+ )
data_inicio_mandato2 = c[1].data_inicio_mandato
- data_fim_mandato2 = c[1].data_fim_mandato if c[1].data_fim_mandato else timezone.now(
- ).date()
+ data_fim_mandato2 = (
+ c[1].data_fim_mandato
+ if c[1].data_fim_mandato
+ else timezone.now().date()
+ )
if data_inicio_mandato1 and data_inicio_mandato2:
exists = intervalos_tem_intersecao(
- data_inicio_mandato1, data_fim_mandato1,
- data_inicio_mandato2, data_fim_mandato2)
+ data_inicio_mandato1,
+ data_fim_mandato1,
+ data_inicio_mandato2,
+ data_fim_mandato2,
+ )
if exists:
intersecoes.append((parlamentar, c[0], c[1]))
@@ -804,58 +855,60 @@ def parlamentares_mandatos_intersecao():
class ListarParlMandatosIntersecaoView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/parlamentares_mandatos_intersecao.html'
- context_object_name = 'parlamentares_mandatos_intersecao'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/parlamentares_mandatos_intersecao.html"
+ context_object_name = "parlamentares_mandatos_intersecao"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return parlamentares_mandatos_intersecao()
def get_context_data(self, **kwargs):
- context = super(
- ListarParlMandatosIntersecaoView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ context = super(ListarParlMandatosIntersecaoView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
def parlamentares_duplicados():
- return [parlamentar for parlamentar in Parlamentar.objects.values(
- 'nome_parlamentar').order_by('nome_parlamentar').annotate(count=Count(
- 'nome_parlamentar')).filter(count__gt=1)]
+ return [
+ parlamentar
+ for parlamentar in Parlamentar.objects.values("nome_parlamentar")
+ .order_by("nome_parlamentar")
+ .annotate(count=Count("nome_parlamentar"))
+ .filter(count__gt=1)
+ ]
class ListarParlamentaresDuplicadosView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/parlamentares_duplicados.html'
- context_object_name = 'parlamentares_duplicados'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/parlamentares_duplicados.html"
+ context_object_name = "parlamentares_duplicados"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return parlamentares_duplicados()
def get_context_data(self, **kwargs):
- context = super(
- ListarParlamentaresDuplicadosView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ context = super(ListarParlamentaresDuplicadosView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
def mandato_sem_data_inicio():
- return Mandato.objects.filter(data_inicio_mandato__isnull=True).order_by('parlamentar')
+ return Mandato.objects.filter(data_inicio_mandato__isnull=True).order_by(
+ "parlamentar"
+ )
def get_estatistica(request):
@@ -863,117 +916,117 @@ def get_estatistica(request):
normas = NormaJuridica.objects.all()
datas = [
- materias.order_by(
- '-data_ultima_atualizacao').values_list('data_ultima_atualizacao', flat=True)
- .exclude(data_ultima_atualizacao__isnull=True).first(),
- normas.order_by(
- '-data_ultima_atualizacao').values_list('data_ultima_atualizacao', flat=True)
- .exclude(data_ultima_atualizacao__isnull=True).first()
+ materias.order_by("-data_ultima_atualizacao")
+ .values_list("data_ultima_atualizacao", flat=True)
+ .exclude(data_ultima_atualizacao__isnull=True)
+ .first(),
+ normas.order_by("-data_ultima_atualizacao")
+ .values_list("data_ultima_atualizacao", flat=True)
+ .exclude(data_ultima_atualizacao__isnull=True)
+ .first(),
]
- max_data = max(datas) if datas[0] and datas[1] else next(
- iter([i for i in datas if i is not None]), '')
-
- return JsonResponse({
- "data_ultima_atualizacao": max_data,
- "num_materias_legislativas": materias.count(),
- "num_normas_juridicas ": normas.count(),
- "num_parlamentares": Parlamentar.objects.all().count(),
- "num_sessoes_plenarias": SessaoPlenaria.objects.all().count()
- })
+ max_data = (
+ max(datas)
+ if datas[0] and datas[1]
+ else next(iter([i for i in datas if i is not None]), "")
+ )
+
+ return JsonResponse(
+ {
+ "data_ultima_atualizacao": max_data,
+ "num_materias_legislativas": materias.count(),
+ "num_normas_juridicas ": normas.count(),
+ "num_parlamentares": Parlamentar.objects.all().count(),
+ "num_sessoes_plenarias": SessaoPlenaria.objects.all().count(),
+ }
+ )
class ListarMandatoSemDataInicioView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/mandato_sem_data_inicio.html'
- context_object_name = 'mandato_sem_data_inicio'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/mandato_sem_data_inicio.html"
+ context_object_name = "mandato_sem_data_inicio"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return mandato_sem_data_inicio()
def get_context_data(self, **kwargs):
- context = super(
- ListarMandatoSemDataInicioView, self
- ).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ context = super(ListarMandatoSemDataInicioView, self).get_context_data(**kwargs)
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
def filiacoes_sem_data_filiacao():
- return Filiacao.objects.filter(data__isnull=True).order_by('parlamentar')
+ return Filiacao.objects.filter(data__isnull=True).order_by("parlamentar")
class ListarFiliacoesSemDataFiliacaoView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/filiacoes_sem_data_filiacao.html'
- context_object_name = 'filiacoes_sem_data_filiacao'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/filiacoes_sem_data_filiacao.html"
+ context_object_name = "filiacoes_sem_data_filiacao"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return filiacoes_sem_data_filiacao()
def get_context_data(self, **kwargs):
- context = super(
- ListarFiliacoesSemDataFiliacaoView, self
- ).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhuma encontrada.'
+ context = super(ListarFiliacoesSemDataFiliacaoView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhuma encontrada."
return context
def materias_protocolo_inexistente():
materias = []
- for materia in MateriaLegislativa.objects.filter(numero_protocolo__isnull=False).order_by('-ano', 'numero'):
+ for materia in MateriaLegislativa.objects.filter(
+ numero_protocolo__isnull=False
+ ).order_by("-ano", "numero"):
exists = Protocolo.objects.filter(
- ano=materia.ano, numero=materia.numero_protocolo).exists()
+ ano=materia.ano, numero=materia.numero_protocolo
+ ).exists()
if not exists:
- materias.append(
- (materia, materia.ano, materia.numero_protocolo))
+ materias.append((materia, materia.ano, materia.numero_protocolo))
return materias
class ListarMatProtocoloInexistenteView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/materias_protocolo_inexistente.html'
- context_object_name = 'materias_protocolo_inexistente'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/materias_protocolo_inexistente.html"
+ context_object_name = "materias_protocolo_inexistente"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return materias_protocolo_inexistente()
def get_context_data(self, **kwargs):
- context = super(
- ListarMatProtocoloInexistenteView, self
- ).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhuma encontrada.'
+ context = super(ListarMatProtocoloInexistenteView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhuma encontrada."
return context
def protocolos_com_materias():
protocolos = {}
- for m in MateriaLegislativa.objects.filter(numero_protocolo__isnull=False).order_by('-ano', 'numero_protocolo'):
+ for m in MateriaLegislativa.objects.filter(numero_protocolo__isnull=False).order_by(
+ "-ano", "numero_protocolo"
+ ):
if Protocolo.objects.filter(numero=m.numero_protocolo, ano=m.ano).exists():
key = "{}/{}".format(m.numero_protocolo, m.ano)
val = protocolos.get(key, list())
@@ -985,54 +1038,51 @@ def protocolos_com_materias():
class ListarProtocolosComMateriasView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/protocolos_com_materias.html'
- context_object_name = 'protocolos_com_materias'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/protocolos_com_materias.html"
+ context_object_name = "protocolos_com_materias"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return protocolos_com_materias()
def get_context_data(self, **kwargs):
- context = super(
- ListarProtocolosComMateriasView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ context = super(ListarProtocolosComMateriasView, self).get_context_data(
+ **kwargs
+ )
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
def protocolos_duplicados():
return [
- protocolo for protocolo in Protocolo.objects.values(
- 'numero', 'ano').order_by('-ano', 'numero').annotate(total=Count('numero')).filter(total__gt=1)
+ protocolo
+ for protocolo in Protocolo.objects.values("numero", "ano")
+ .order_by("-ano", "numero")
+ .annotate(total=Count("numero"))
+ .filter(total__gt=1)
]
class ListarProtocolosDuplicadosView(PermissionRequiredMixin, ListView):
model = get_user_model()
- template_name = 'base/protocolos_duplicados.html'
- context_object_name = 'protocolos_duplicados'
- permission_required = ('base.list_appconfig',)
+ template_name = "base/protocolos_duplicados.html"
+ context_object_name = "protocolos_duplicados"
+ permission_required = ("base.list_appconfig",)
paginate_by = 10
def get_queryset(self):
return protocolos_duplicados()
def get_context_data(self, **kwargs):
- context = super(
- ListarProtocolosDuplicadosView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
- context[
- 'NO_ENTRIES_MSG'
- ] = 'Nenhum encontrado.'
+ context = super(ListarProtocolosDuplicadosView, self).get_context_data(**kwargs)
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
+ context["NO_ENTRIES_MSG"] = "Nenhum encontrado."
return context
@@ -1040,21 +1090,16 @@ class UserCrud(Crud):
model = get_user_model()
class BaseMixin(Crud.BaseMixin):
- list_field_names = [
- 'usuario', 'groups', 'is_active'
- ]
+ list_field_names = ["usuario", "groups", "is_active"]
def openapi_url(self):
- return ''
+ return ""
def resolve_url(self, suffix, args=None):
- return reverse('sapl.base:%s' % self.url_name(suffix),
- args=args)
+ return reverse("sapl.base:%s" % self.url_name(suffix), args=args)
def get_layout(self):
- return super().get_layout(
- 'base/layouts.yaml'
- )
+ return super().get_layout("base/layouts.yaml")
def get_context_object_name(self, *args, **kwargs):
return None
@@ -1069,33 +1114,35 @@ class UserCrud(Crud):
def get_form_kwargs(self):
kwargs = Crud.UpdateView.get_form_kwargs(self)
- kwargs['user_session'] = self.request.user
- granular = self.request.GET.get('granular', None)
+ kwargs["user_session"] = self.request.user
+ granular = self.request.GET.get("granular", None)
if not granular is None:
- kwargs['granular'] = granular
+ kwargs["granular"] = granular
return kwargs
class DetailView(Crud.DetailView):
- layout_key = 'UserDetail'
+ layout_key = "UserDetail"
def hook_usuario(self, obj):
- return 'Usuário', '{} {}'.format(
- obj.get_full_name() or '...',
- obj.email
+ return "Usuário", "{} {}".format(
+ obj.get_full_name() or "...", obj.email
)
def hook_auth_token(self, obj):
- return 'Token', str(obj.auth_token) if hasattr(obj, 'auth_token') else ' '
+ return (
+ "Token",
+ str(obj.auth_token) if hasattr(obj, "auth_token") else " ",
+ )
def hook_username(self, obj):
- return 'username', obj.username
+ return "username", obj.username
def get_context_data(self, **kwargs):
context = Crud.DetailView.get_context_data(self, **kwargs)
- context['title'] = '{} ({}) {}'.format(
- self.object.get_full_name() or '...',
+ context["title"] = "{} ({}) {}".format(
+ self.object.get_full_name() or "...",
self.object.username,
- self.object.email
+ self.object.email,
)
return context
@@ -1103,10 +1150,11 @@ class UserCrud(Crud):
def extras_url(self):
btns = [
(
- '{}?granular'.format(reverse('sapl.base:user_update',
- kwargs={'pk': self.object.pk})),
- 'btn-outline-primary',
- _('Edição granular')
+ "{}?granular".format(
+ reverse("sapl.base:user_update", kwargs={"pk": self.object.pk})
+ ),
+ "btn-outline-primary",
+ _("Edição granular"),
)
]
@@ -1118,29 +1166,30 @@ class UserCrud(Crud):
def get_context_data(self, **kwargs):
context = Crud.ListView.get_context_data(self, **kwargs)
- context['subnav_template_name'] = None
- context['title'] = _('Usuários')
+ context["subnav_template_name"] = None
+ context["title"] = _("Usuários")
return context
def hook_header_usuario(self, *args, **kwargs):
- return 'Usuário'
+ return "Usuário"
def hook_header_groups(self, *args, **kwargs):
- return 'Grupos'
+ return "Grupos"
def hook_header_is_active(self, *args, **kwargs):
- return 'Ativo'
+ return "Ativo"
def hook_usuario(self, *args, **kwargs):
- return '{} ({}) {}'.format(
- args[0].get_full_name() or '...',
- args[0].username,
- args[0].email
- ), args[2]
+ return (
+ "{} ({}) {}".format(
+ args[0].get_full_name() or "...", args[0].username, args[0].email
+ ),
+ args[2],
+ )
def get_queryset(self):
qs = self.model.objects.all()
- q_param = self.request.GET.get('q', '')
+ q_param = self.request.GET.get("q", "")
if q_param:
q = Q(first_name__icontains=q_param)
q |= Q(last_name__icontains=q_param)
@@ -1149,52 +1198,57 @@ class UserCrud(Crud):
q |= Q(groups__name__icontains=q_param)
qs = qs.filter(q)
- return qs.distinct('id').order_by('-id')
+ return qs.distinct("id").order_by("-id")
class CasaLegislativaCrud(CrudAux):
model = CasaLegislativa
class BaseMixin(CrudAux.BaseMixin):
- list_field_names = ['codigo', 'nome', 'sigla']
+ list_field_names = ["codigo", "nome", "sigla"]
form_class = CasaLegislativaForm
class ListView(CrudAux.ListView):
-
def get(self, request, *args, **kwargs):
casa = get_casalegislativa()
if casa:
return HttpResponseRedirect(
- reverse('sapl.base:casalegislativa_detail',
- kwargs={'pk': casa.pk}))
+ reverse("sapl.base:casalegislativa_detail", kwargs={"pk": casa.pk})
+ )
else:
- return HttpResponseRedirect(
- reverse('sapl.base:casalegislativa_create'))
+ return HttpResponseRedirect(reverse("sapl.base:casalegislativa_create"))
class DetailView(CrudAux.DetailView):
-
def get(self, request, *args, **kwargs):
return HttpResponseRedirect(
- reverse('sapl.base:casalegislativa_update',
- kwargs={'pk': self.kwargs['pk']}))
+ reverse(
+ "sapl.base:casalegislativa_update", kwargs={"pk": self.kwargs["pk"]}
+ )
+ )
class HelpTopicView(TemplateView):
logger = logging.getLogger(__name__)
def get_template_names(self):
-
username = self.request.user.username
- topico = self.kwargs['topic']
+ topico = self.kwargs["topic"]
try:
- self.logger.debug('user=' + username +
- '. Tentando obter template %s.html.' % topico)
- get_template('ajuda/%s.html' % topico)
+ self.logger.debug(
+ "user=" + username + ". Tentando obter template %s.html." % topico
+ )
+ get_template("ajuda/%s.html" % topico)
except TemplateDoesNotExist as e:
self.logger.error(
- 'user=' + username + '. Erro ao obter template {}.html. Template não existe. '.format(topico) + str(e))
+ "user="
+ + username
+ + ". Erro ao obter template {}.html. Template não existe. ".format(
+ topico
+ )
+ + str(e)
+ )
raise Http404()
- return ['ajuda/%s.html' % topico]
+ return ["ajuda/%s.html" % topico]
class AppConfigCrud(CrudAux):
@@ -1202,23 +1256,26 @@ class AppConfigCrud(CrudAux):
class BaseMixin(CrudAux.BaseMixin):
form_class = ConfiguracoesAppForm
- list_url = ''
- create_url = ''
+ list_url = ""
+ create_url = ""
def form_valid(self, form):
recibo_prop_atual = AppConfig.objects.last().receber_recibo_proposicao
- recibo_prop_novo = self.request.POST['receber_recibo_proposicao']
- if recibo_prop_novo == 'False' and recibo_prop_atual:
+ recibo_prop_novo = self.request.POST["receber_recibo_proposicao"]
+ if recibo_prop_novo == "False" and recibo_prop_atual:
props = Proposicao.objects.filter(
- hash_code='', data_recebimento__isnull=True).exclude(data_envio__isnull=True)
+ hash_code="", data_recebimento__isnull=True
+ ).exclude(data_envio__isnull=True)
for prop in props:
try:
self.gerar_hash(prop)
except ValidationError as e:
- form.add_error('receber_recibo_proposicao', e)
+ form.add_error("receber_recibo_proposicao", e)
msg = _(
"Não foi possível mudar a configuração porque a Proposição {} não possui texto original vinculado!".format(
- prop))
+ prop
+ )
+ )
messages.error(self.request, msg)
return super().form_invalid(form)
return super().form_valid(form)
@@ -1227,18 +1284,21 @@ class AppConfigCrud(CrudAux):
if inst.texto_original:
try:
inst.hash_code = gerar_hash_arquivo(
- inst.texto_original.path, str(inst.pk))
+ inst.texto_original.path, str(inst.pk)
+ )
inst.save()
except IOError:
raise ValidationError(
- "Existem proposicoes com arquivos inexistentes.")
+ "Existem proposicoes com arquivos inexistentes."
+ )
elif inst.texto_articulado.exists():
ta = inst.texto_articulado.first()
- inst.hash_code = 'P' + ta.hash() + SEPARADOR_HASH_PROPOSICAO + str(inst.pk)
+ inst.hash_code = (
+ "P" + ta.hash() + SEPARADOR_HASH_PROPOSICAO + str(inst.pk)
+ )
inst.save()
class CreateView(CrudAux.CreateView):
-
def get(self, request, *args, **kwargs):
app_config = AppConfig.objects.first()
@@ -1247,48 +1307,47 @@ class AppConfigCrud(CrudAux):
app_config.save()
return HttpResponseRedirect(
- reverse('sapl.base:appconfig_update',
- kwargs={'pk': app_config.pk}))
+ reverse("sapl.base:appconfig_update", kwargs={"pk": app_config.pk})
+ )
class UpdateView(CrudAux.UpdateView):
form_class = ConfiguracoesAppForm
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
- context['title'] = self.model._meta.verbose_name
+ context["title"] = self.model._meta.verbose_name
return context
def get(self, request, *args, **kwargs):
- if 'jsidd' in request.GET:
- return self.json_simular_identificacao_de_documentos(request, *args, **kwargs)
+ if "jsidd" in request.GET:
+ return self.json_simular_identificacao_de_documentos(
+ request, *args, **kwargs
+ )
return super().get(request, *args, **kwargs)
def json_simular_identificacao_de_documentos(self, request, *args, **kwargs):
-
DocumentoAdministrativo = apps.get_model(
- 'protocoloadm',
- 'DocumentoAdministrativo'
+ "protocoloadm", "DocumentoAdministrativo"
)
- d = DocumentoAdministrativo.objects.order_by('-id').first()
+ d = DocumentoAdministrativo.objects.order_by("-id").first()
- jsidd = request.GET.get('jsidd', '')
+ jsidd = request.GET.get("jsidd", "")
values = {
- '{sigla}': d.tipo.sigla if d else 'OF',
- '{nome}': d.tipo.descricao if d else 'Ofício',
- '{numero}': f'{d.numero:0>3}' if d else '001',
- '{ano}': f'{d.ano}' if d else str(timezone.now().year),
- '{complemento}': d.complemento if d else 'GAB',
- '{assunto}': d.assunto if d else 'Simulação de Identificação de Documentos'
+ "{sigla}": d.tipo.sigla if d else "OF",
+ "{nome}": d.tipo.descricao if d else "Ofício",
+ "{numero}": f"{d.numero:0>3}" if d else "001",
+ "{ano}": f"{d.ano}" if d else str(timezone.now().year),
+ "{complemento}": d.complemento if d else "GAB",
+ "{assunto}": d.assunto
+ if d
+ else "Simulação de Identificação de Documentos",
}
result = DocumentoAdministrativo.mask_to_str(values, jsidd)
- return JsonResponse({
- 'jsidd': result[0],
- 'error': list(result[1])
- })
+ return JsonResponse({"jsidd": result[0], "error": list(result[1])})
def form_valid(self, form):
numeracao = AppConfig.objects.last().sequencia_numeracao_protocolo
@@ -1298,14 +1357,14 @@ class AppConfigCrud(CrudAux):
numeracao_nova = self.object.inicio_numeracao_protocolo
if numeracao_nova != numeracao_antiga:
- if numeracao == 'A':
+ if numeracao == "A":
numero_max = Protocolo.objects.filter(
ano=timezone.now().year
- ).aggregate(Max('numero'))['numero__max']
- elif numeracao == 'L':
+ ).aggregate(Max("numero"))["numero__max"]
+ elif numeracao == "L":
legislatura = Legislatura.objects.filter(
data_inicio__year__lte=timezone.now().year,
- data_fim__year__gte=timezone.now().year
+ data_fim__year__gte=timezone.now().year,
).first()
data_inicio = legislatura.data_inicio
@@ -1315,56 +1374,64 @@ class AppConfigCrud(CrudAux):
data_fim_utc = from_date_to_datetime_utc(data_fim)
numero_max = Protocolo.objects.filter(
- Q(data__isnull=False, data__gte=data_inicio, data__lte=data_fim) |
- Q(
- timestamp__isnull=False, timestamp__gte=data_inicio_utc,
- timestamp__lte=data_fim_utc
- ) | Q(
+ Q(data__isnull=False, data__gte=data_inicio, data__lte=data_fim)
+ | Q(
+ timestamp__isnull=False,
+ timestamp__gte=data_inicio_utc,
+ timestamp__lte=data_fim_utc,
+ )
+ | Q(
timestamp_data_hora_manual__isnull=False,
timestamp_data_hora_manual__gte=data_inicio_utc,
timestamp_data_hora_manual__lte=data_fim_utc,
)
- ).aggregate(Max('numero'))['numero__max']
- elif numeracao == 'U':
- numero_max = Protocolo.objects.all().aggregate(
- Max('numero')
- )['numero__max']
+ ).aggregate(Max("numero"))["numero__max"]
+ elif numeracao == "U":
+ numero_max = Protocolo.objects.all().aggregate(Max("numero"))[
+ "numero__max"
+ ]
ultimo_numero_cadastrado = int(numero_max) if numero_max else 0
- if numeracao_nova <= ultimo_numero_cadastrado and numeracao != 'U':
- msg = "O novo início da numeração de protocolo entrará em vigor na " \
- "próxima sequência, pois já existe protocolo cadastrado com " \
- "número superior ou igual ao número inicial definido."
+ if numeracao_nova <= ultimo_numero_cadastrado and numeracao != "U":
+ msg = (
+ "O novo início da numeração de protocolo entrará em vigor na "
+ "próxima sequência, pois já existe protocolo cadastrado com "
+ "número superior ou igual ao número inicial definido."
+ )
messages.warning(self.request, msg)
return super().form_valid(form)
class ListView(CrudAux.ListView):
-
def get(self, request, *args, **kwargs):
- return HttpResponseRedirect(reverse('sapl.base:appconfig_create'))
+ return HttpResponseRedirect(reverse("sapl.base:appconfig_create"))
class DetailView(CrudAux.DetailView):
-
def get(self, request, *args, **kwargs):
- return HttpResponseRedirect(reverse('sapl.base:appconfig_create'))
+ return HttpResponseRedirect(reverse("sapl.base:appconfig_create"))
class DeleteView(CrudAux.DeleteView):
-
def get(self, request, *args, **kwargs):
- return HttpResponseRedirect(reverse('sapl.base:appconfig_create'))
+ return HttpResponseRedirect(reverse("sapl.base:appconfig_create"))
class SaplSearchView(SearchView):
results_per_page = 10
- def __init__(self, template=None, load_all=True, form_class=None, searchqueryset=None, results_per_page=None):
+ def __init__(
+ self,
+ template=None,
+ load_all=True,
+ form_class=None,
+ searchqueryset=None,
+ results_per_page=None,
+ ):
super().__init__(
template=template,
load_all=load_all,
form_class=SaplSearchForm,
searchqueryset=None,
- results_per_page=results_per_page
+ results_per_page=results_per_page,
)
def get_context(self):
@@ -1373,28 +1440,26 @@ class SaplSearchView(SearchView):
data = self.request.GET or self.request.POST
data = data.copy()
- if 'models' in self.request.GET:
- models = self.request.GET.getlist('models')
+ if "models" in self.request.GET:
+ models = self.request.GET.getlist("models")
else:
models = []
- context['models'] = ''
- context['is_paginated'] = True
+ context["models"] = ""
+ context["is_paginated"] = True
- page_obj = context['page']
- context['page_obj'] = page_obj
- paginator = context['paginator']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
+ page_obj = context["page"]
+ context["page_obj"] = page_obj
+ paginator = context["paginator"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
- if 'page' in data:
- del data['page']
+ if "page" in data:
+ del data["page"]
- context['filter_url'] = (
- '&' + data.urlencode()) if len(data) > 0 else ''
+ context["filter_url"] = ("&" + data.urlencode()) if len(data) > 0 else ""
for m in models:
- context['models'] = context['models'] + '&models=' + m
+ context["models"] = context["models"] + "&models=" + m
return context
@@ -1404,60 +1469,56 @@ class PesquisarAuditLogView(PermissionRequiredMixin, FilterView):
filterset_class = AuditLogFilterSet
paginate_by = 20
- permission_required = ('base.list_appconfig',)
+ permission_required = ("base.list_appconfig",)
def get_filterset_kwargs(self, filterset_class):
- super(PesquisarAuditLogView, self).get_filterset_kwargs(
- filterset_class
- )
+ super(PesquisarAuditLogView, self).get_filterset_kwargs(filterset_class)
- return ({
+ return {
"data": self.request.GET or None,
- "queryset": self.get_queryset().order_by("-id")
- })
+ "queryset": self.get_queryset().order_by("-id"),
+ }
def get_context_data(self, **kwargs):
- context = super(PesquisarAuditLogView, self).get_context_data(
- **kwargs
- )
+ context = super(PesquisarAuditLogView, self).get_context_data(**kwargs)
paginator = context["paginator"]
page_obj = context["page_obj"]
qr = self.request.GET.copy()
- if 'page' in qr:
- del qr['page']
- context['filter_url'] = ('&' + qr.urlencode()) if len(qr) > 0 else ''
- context['show_results'] = show_results_filter_set(qr)
-
- context.update({
- "page_range": make_pagination(
- page_obj.number, paginator.num_pages
- ),
- "NO_ENTRIES_MSG": "Nenhum registro de log encontrado!",
- "title": _("Pesquisar Logs de Auditoria")
- })
+ if "page" in qr:
+ del qr["page"]
+ context["filter_url"] = ("&" + qr.urlencode()) if len(qr) > 0 else ""
+ context["show_results"] = show_results_filter_set(qr)
+
+ context.update(
+ {
+ "page_range": make_pagination(page_obj.number, paginator.num_pages),
+ "NO_ENTRIES_MSG": "Nenhum registro de log encontrado!",
+ "title": _("Pesquisar Logs de Auditoria"),
+ }
+ )
return context
def get(self, request, *args, **kwargs):
- timefilter = request.GET.get('timestamp', None)
+ timefilter = request.GET.get("timestamp", None)
if not timefilter:
newgetrequest = request.GET.copy()
- newgetrequest['timestamp'] = 'week'
+ newgetrequest["timestamp"] = "week"
request.GET = newgetrequest
super(PesquisarAuditLogView, self).get(request)
data = self.filterset.data
- url = ''
+ url = ""
if data:
- url = '&' + str(self.request.META["QUERY_STRING"])
+ url = "&" + str(self.request.META["QUERY_STRING"])
if url.startswith("&page"):
- url = ''
+ url = ""
resultados = self.object_list
# if 'page' in self.request.META['QUERY_STRING']:
@@ -1465,14 +1526,14 @@ class PesquisarAuditLogView(PermissionRequiredMixin, FilterView):
# else:
# resultados = []
- context = self.get_context_data(filter=self.filterset,
- object_list=resultados,
- filter_url=url,
- numero_res=len(resultados)
- )
+ context = self.get_context_data(
+ filter=self.filterset,
+ object_list=resultados,
+ filter_url=url,
+ numero_res=len(resultados),
+ )
- context['show_results'] = show_results_filter_set(
- self.request.GET.copy())
+ context["show_results"] = show_results_filter_set(self.request.GET.copy())
return self.render_to_response(context)
@@ -1481,31 +1542,30 @@ class AlterarSenha(FormView):
from sapl.settings import LOGIN_URL
form_class = AlterarSenhaForm
- template_name = 'base/alterar_senha.html'
+ template_name = "base/alterar_senha.html"
success_url = LOGIN_URL
def get_initial(self):
initial = super(AlterarSenha, self).get_initial()
- initial['username'] = self.request.user
+ initial["username"] = self.request.user
return initial
def form_valid(self, form):
- new_password = form.cleaned_data['new_password1']
+ new_password = form.cleaned_data["new_password1"]
user = self.request.user
user.set_password(new_password)
user.save()
- self.request.session.pop('weak_password', None)
+ self.request.session.pop("weak_password", None)
return super().form_valid(form)
-STATIC_LOGO = os.path.join(settings.STATIC_URL, 'img/logo.png')
+STATIC_LOGO = os.path.join(settings.STATIC_URL, "img/logo.png")
class LogotipoView(RedirectView):
-
def get_redirect_url(self, *args, **kwargs):
casa = get_casalegislativa()
logo = casa and casa.logotipo and casa.logotipo.name
@@ -1513,16 +1573,18 @@ class LogotipoView(RedirectView):
def filtro_campos(dicionario):
- chaves_desejadas = ['ementa',
- 'ano',
- 'numero',
- 'em_tramitacao',
- 'data_apresentacao',
- 'apelido',
- 'indexacao',
- 'data_publicacao',
- 'data',
- 'data_vigencia']
+ chaves_desejadas = [
+ "ementa",
+ "ano",
+ "numero",
+ "em_tramitacao",
+ "data_apresentacao",
+ "apelido",
+ "indexacao",
+ "data_publicacao",
+ "data",
+ "data_vigencia",
+ ]
del_list = []
for key in dicionario.keys():
if key not in chaves_desejadas:
@@ -1535,32 +1597,30 @@ def filtro_campos(dicionario):
def pesquisa_textual(request):
- if 'q' not in request.GET:
- return JsonResponse({'total': 0,
- 'resultados': []})
+ if "q" not in request.GET:
+ return JsonResponse({"total": 0, "resultados": []})
- results = SearchQuerySet().filter(content=request.GET['q'])
+ results = SearchQuerySet().filter(content=request.GET["q"])
json_dict = {
- 'total': results.count(),
- 'parametros': request.GET['q'],
- 'resultados': [],
+ "total": results.count(),
+ "parametros": request.GET["q"],
+ "resultados": [],
}
for e in results:
-
sec_dict = {}
try:
- sec_dict['pk'] = e.object.pk
+ sec_dict["pk"] = e.object.pk
except:
# Index and db are out of sync. Object has been deleted from
# database
continue
dici = filtro_campos(e.object.__dict__)
- sec_dict['objeto'] = str(dici)
- sec_dict['text'] = str(e.object.ementa)
+ sec_dict["objeto"] = str(dici)
+ sec_dict["text"] = str(e.object.ementa)
- sec_dict['model'] = str(type(e.object))
+ sec_dict["model"] = str(type(e.object))
- json_dict['resultados'].append(sec_dict)
+ json_dict["resultados"].append(sec_dict)
return JsonResponse(json_dict)
diff --git a/sapl/comissoes/apps.py b/sapl/comissoes/apps.py
index 49a63c70c..179c23a1e 100644
--- a/sapl/comissoes/apps.py
+++ b/sapl/comissoes/apps.py
@@ -3,6 +3,6 @@ from django.utils.translation import gettext_lazy as _
class AppConfig(apps.AppConfig):
- name = 'sapl.comissoes'
- label = 'comissoes'
- verbose_name = _('Comissões')
+ name = "sapl.comissoes"
+ label = "comissoes"
+ verbose_name = _("Comissões")
diff --git a/sapl/comissoes/forms.py b/sapl/comissoes/forms.py
index 7fd2cfa1c..693477b6f 100644
--- a/sapl/comissoes/forms.py
+++ b/sapl/comissoes/forms.py
@@ -1,34 +1,30 @@
-import django_filters
import logging
+import django_filters
from crispy_forms.layout import Fieldset, Layout
-
from django import forms
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.db import transaction
from django.db.models import Q
from django.forms import ModelForm
-from django.utils.translation import gettext_lazy as _
from django.utils import timezone
+from django.utils.translation import gettext_lazy as _
from sapl.base.models import Autor, TipoAutor
-from sapl.comissoes.models import (Comissao, Composicao,
- DocumentoAcessorio, Participacao,
- Periodo, Reuniao)
-from sapl.crispy_layout_mixin import (form_actions, SaplFormHelper,
- to_row)
+from sapl.comissoes.models import (Comissao, Composicao, DocumentoAcessorio,
+ Participacao, Periodo, Reuniao)
+from sapl.crispy_layout_mixin import SaplFormHelper, form_actions, to_row
from sapl.materia.models import MateriaEmTramitacao, PautaReuniao
-from sapl.parlamentares.models import (Legislatura, Mandato,
- Parlamentar)
-from sapl.utils import (FileFieldCheckMixin,
- FilterOverridesMetaMixin, validar_arquivo)
+from sapl.parlamentares.models import Legislatura, Mandato, Parlamentar
+from sapl.utils import (FileFieldCheckMixin, FilterOverridesMetaMixin,
+ validar_arquivo)
class ComposicaoForm(forms.ModelForm):
-
comissao = forms.CharField(
- required=False, label='Comissao', widget=forms.HiddenInput())
+ required=False, label="Comissao", widget=forms.HiddenInput()
+ )
logger = logging.getLogger(__name__)
class Meta:
@@ -37,48 +33,60 @@ class ComposicaoForm(forms.ModelForm):
def __init__(self, user=None, **kwargs):
super(ComposicaoForm, self).__init__(**kwargs)
- self.fields['comissao'].widget.attrs['disabled'] = 'disabled'
+ self.fields["comissao"].widget.attrs["disabled"] = "disabled"
def clean(self):
data = super().clean()
- data['comissao'] = self.initial['comissao']
- comissao_pk = self.initial['comissao'].id
+ data["comissao"] = self.initial["comissao"]
+ comissao_pk = self.initial["comissao"].id
if not self.is_valid():
return data
- periodo = data['periodo']
+ periodo = data["periodo"]
if periodo.data_fim:
intersecao_periodo = Composicao.objects.filter(
- Q(periodo__data_inicio__lte=periodo.data_fim, periodo__data_fim__gte=periodo.data_fim) |
- Q(periodo__data_inicio__gte=periodo.data_inicio, periodo__data_fim__lte=periodo.data_inicio),
- comissao_id=comissao_pk)
+ Q(
+ periodo__data_inicio__lte=periodo.data_fim,
+ periodo__data_fim__gte=periodo.data_fim,
+ )
+ | Q(
+ periodo__data_inicio__gte=periodo.data_inicio,
+ periodo__data_fim__lte=periodo.data_inicio,
+ ),
+ comissao_id=comissao_pk,
+ )
else:
intersecao_periodo = Composicao.objects.filter(
- Q(periodo__data_inicio__gte=periodo.data_inicio, periodo__data_fim__lte=periodo.data_inicio),
- comissao_id=comissao_pk)
+ Q(
+ periodo__data_inicio__gte=periodo.data_inicio,
+ periodo__data_fim__lte=periodo.data_inicio,
+ ),
+ comissao_id=comissao_pk,
+ )
if intersecao_periodo:
if periodo.data_fim:
self.logger.warning(
- 'O período informado ({} a {}) choca com períodos já cadastrados para esta comissão'.format(
+ "O período informado ({} a {}) choca com períodos já cadastrados para esta comissão".format(
periodo.data_inicio, periodo.data_fim
)
)
else:
self.logger.warning(
- 'O período informado ({} - ) choca com períodos já cadastrados para esta comissão'.format(
+ "O período informado ({} - ) choca com períodos já cadastrados para esta comissão".format(
periodo.data_inicio
)
)
- raise ValidationError('O período informado choca com períodos já cadastrados para esta comissão')
+ raise ValidationError(
+ "O período informado choca com períodos já cadastrados para esta comissão"
+ )
return data
class PeriodoForm(forms.ModelForm):
-
logger = logging.getLogger(__name__)
class Meta:
@@ -91,54 +99,57 @@ class PeriodoForm(forms.ModelForm):
if not self.is_valid():
return cleaned_data
- data_inicio = cleaned_data['data_inicio']
- data_fim = cleaned_data['data_fim']
+ data_inicio = cleaned_data["data_inicio"]
+ data_fim = cleaned_data["data_fim"]
if data_fim and data_fim < data_inicio:
self.logger.warning(
- 'A Data Final ({}) é menor que '
- 'a Data Inicial({}).'.format(data_fim, data_inicio)
+ "A Data Final ({}) é menor que "
+ "a Data Inicial({}).".format(data_fim, data_inicio)
+ )
+ raise ValidationError(
+ "A Data Final não pode ser menor que " "a Data Inicial"
)
- raise ValidationError('A Data Final não pode ser menor que '
- 'a Data Inicial')
# Evita NoneType exception se não preenchida a data_fim
if not data_fim:
data_fim = data_inicio
- legislatura = Legislatura.objects.filter(data_inicio__lte=data_inicio,
- data_fim__gte=data_fim,
- )
+ legislatura = Legislatura.objects.filter(
+ data_inicio__lte=data_inicio,
+ data_fim__gte=data_fim,
+ )
if not legislatura:
self.logger.warning(
- 'O período informado ({} a {})'
- 'não está contido em uma única '
- 'legislatura existente'.format(data_inicio, data_fim)
+ "O período informado ({} a {})"
+ "não está contido em uma única "
+ "legislatura existente".format(data_inicio, data_fim)
+ )
+ raise ValidationError(
+ "O período informado "
+ "deve estar contido em uma única "
+ "legislatura existente"
)
- raise ValidationError('O período informado '
- 'deve estar contido em uma única '
- 'legislatura existente')
return cleaned_data
class ParticipacaoCreateForm(forms.ModelForm):
-
logger = logging.getLogger(__name__)
parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput())
class Meta:
model = Participacao
- fields = '__all__'
- exclude = ['composicao']
+ fields = "__all__"
+ exclude = ["composicao"]
def __init__(self, user=None, **kwargs):
super(ParticipacaoCreateForm, self).__init__(**kwargs)
if self.instance:
- comissao = kwargs['initial']
- comissao_pk = int(comissao['parent_pk'])
+ comissao = kwargs["initial"]
+ comissao_pk = int(comissao["parent_pk"])
composicao = Composicao.objects.get(id=comissao_pk)
participantes = composicao.participacao_set.all()
id_part = [p.parlamentar.id for p in participantes]
@@ -147,22 +158,25 @@ class ParticipacaoCreateForm(forms.ModelForm):
qs = self.create_participacao()
- parlamentares = Mandato.objects.filter(qs,
- parlamentar__ativo=True
- ).prefetch_related('parlamentar').\
- values_list('parlamentar',
- flat=True
- ).distinct()
- qs = Parlamentar.objects.filter(id__in=parlamentares).distinct().\
- exclude(id__in=id_part)
+ parlamentares = (
+ Mandato.objects.filter(qs, parlamentar__ativo=True)
+ .prefetch_related("parlamentar")
+ .values_list("parlamentar", flat=True)
+ .distinct()
+ )
+ qs = (
+ Parlamentar.objects.filter(id__in=parlamentares)
+ .distinct()
+ .exclude(id__in=id_part)
+ )
eligible = self.verifica()
result = list(set(qs) & set(eligible))
if result == eligible:
- self.fields['parlamentar'].queryset = qs
+ self.fields["parlamentar"].queryset = qs
else:
ids = [e.id for e in eligible]
qs = Parlamentar.objects.filter(id__in=ids)
- self.fields['parlamentar'].queryset = qs
+ self.fields["parlamentar"].queryset = qs
def clean(self):
cleaned_data = super(ParticipacaoCreateForm, self).clean()
@@ -170,51 +184,62 @@ class ParticipacaoCreateForm(forms.ModelForm):
if not self.is_valid():
return cleaned_data
- data_designacao = cleaned_data['data_designacao']
- data_desligamento = cleaned_data['data_desligamento']
+ data_designacao = cleaned_data["data_designacao"]
+ data_desligamento = cleaned_data["data_desligamento"]
- if data_desligamento and \
- data_designacao > data_desligamento:
+ if data_desligamento and data_designacao > data_desligamento:
self.logger.warning(
- 'Data de designação ({}) superior '
- 'à data de desligamento ({})'.format(data_designacao, data_desligamento)
+ "Data de designação ({}) superior "
+ "à data de desligamento ({})".format(data_designacao, data_desligamento)
+ )
+ raise ValidationError(
+ _("Data de designação não pode ser superior " "à data de desligamento")
)
- raise ValidationError(_('Data de designação não pode ser superior '
- 'à data de desligamento'))
- composicao = Composicao.objects.get(id=self.initial['parent_pk'])
+ composicao = Composicao.objects.get(id=self.initial["parent_pk"])
cargos_unicos = [
- c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)]
+ c.cargo.nome for c in composicao.participacao_set.filter(cargo__unico=True)
+ ]
- if cleaned_data['cargo'].nome in cargos_unicos:
- msg = _('Este cargo é único para esta Comissão.')
+ if cleaned_data["cargo"].nome in cargos_unicos:
+ msg = _("Este cargo é único para esta Comissão.")
self.logger.warning(
- 'Este cargo ({}) é único para esta Comissão.'.format(
- cleaned_data['cargo'].nome
+ "Este cargo ({}) é único para esta Comissão.".format(
+ cleaned_data["cargo"].nome
)
)
raise ValidationError(msg)
return cleaned_data
def create_participacao(self):
- composicao = Composicao.objects.get(id=self.initial['parent_pk'])
+ composicao = Composicao.objects.get(id=self.initial["parent_pk"])
data_inicio_comissao = composicao.periodo.data_inicio
- data_fim_comissao = composicao.periodo.data_fim if composicao.periodo.data_fim else timezone.now()
- q1 = Q(data_fim_mandato__isnull=False,
- data_fim_mandato__gte=data_inicio_comissao)
- q2 = Q(data_inicio_mandato__gte=data_inicio_comissao) \
- & Q(data_inicio_mandato__lte=data_fim_comissao)
- q3 = Q(data_fim_mandato__isnull=True,
- data_inicio_mandato__lte=data_inicio_comissao)
+ data_fim_comissao = (
+ composicao.periodo.data_fim
+ if composicao.periodo.data_fim
+ else timezone.now()
+ )
+ q1 = Q(
+ data_fim_mandato__isnull=False, data_fim_mandato__gte=data_inicio_comissao
+ )
+ q2 = Q(data_inicio_mandato__gte=data_inicio_comissao) & Q(
+ data_inicio_mandato__lte=data_fim_comissao
+ )
+ q3 = Q(
+ data_fim_mandato__isnull=True, data_inicio_mandato__lte=data_inicio_comissao
+ )
qs = q1 | q2 | q3
return qs
def verifica(self):
- composicao = Composicao.objects.get(id=self.initial['parent_pk'])
+ composicao = Composicao.objects.get(id=self.initial["parent_pk"])
participantes = composicao.participacao_set.all()
participantes_id = [p.parlamentar.id for p in participantes]
- parlamentares = Parlamentar.objects.all().exclude(
- id__in=participantes_id).order_by('nome_completo')
+ parlamentares = (
+ Parlamentar.objects.all()
+ .exclude(id__in=participantes_id)
+ .order_by("nome_completo")
+ )
parlamentares = [p for p in parlamentares if p.ativo]
lista = []
@@ -226,9 +251,13 @@ class ParticipacaoCreateForm(forms.ModelForm):
data_fim = m.data_fim_mandato
comp_data_inicio = composicao.periodo.data_inicio
comp_data_fim = composicao.periodo.data_fim
- if (data_fim and data_fim >= comp_data_inicio)\
- or (data_inicio >= comp_data_inicio and data_inicio <= comp_data_fim)\
- or (data_fim is None and data_inicio <= comp_data_inicio):
+ if (
+ (data_fim and data_fim >= comp_data_inicio)
+ or (
+ data_inicio >= comp_data_inicio and data_inicio <= comp_data_fim
+ )
+ or (data_fim is None and data_inicio <= comp_data_inicio)
+ ):
lista.append(p)
lista = list(set(lista))
@@ -237,25 +266,32 @@ class ParticipacaoCreateForm(forms.ModelForm):
class ParticipacaoEditForm(forms.ModelForm):
-
logger = logging.getLogger(__name__)
parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput())
- nome_parlamentar = forms.CharField(required=False, label='Parlamentar')
+ nome_parlamentar = forms.CharField(required=False, label="Parlamentar")
class Meta:
model = Participacao
- fields = ['nome_parlamentar', 'parlamentar', 'cargo', 'titular',
- 'data_designacao', 'data_desligamento',
- 'motivo_desligamento', 'observacao']
+ fields = [
+ "nome_parlamentar",
+ "parlamentar",
+ "cargo",
+ "titular",
+ "data_designacao",
+ "data_desligamento",
+ "motivo_desligamento",
+ "observacao",
+ ]
widgets = {
- 'parlamentar': forms.HiddenInput(),
+ "parlamentar": forms.HiddenInput(),
}
def __init__(self, user=None, **kwargs):
super(ParticipacaoEditForm, self).__init__(**kwargs)
- self.initial['nome_parlamentar'] = Parlamentar.objects.get(
- id=self.initial['parlamentar']).nome_parlamentar
- self.fields['nome_parlamentar'].widget.attrs['disabled'] = 'disabled'
+ self.initial["nome_parlamentar"] = Parlamentar.objects.get(
+ id=self.initial["parlamentar"]
+ ).nome_parlamentar
+ self.fields["nome_parlamentar"].widget.attrs["disabled"] = "disabled"
def clean(self):
cleaned_data = super(ParticipacaoEditForm, self).clean()
@@ -263,29 +299,33 @@ class ParticipacaoEditForm(forms.ModelForm):
if not self.is_valid():
return cleaned_data
- data_designacao = cleaned_data['data_designacao']
- data_desligamento = cleaned_data['data_desligamento']
+ data_designacao = cleaned_data["data_designacao"]
+ data_desligamento = cleaned_data["data_desligamento"]
- if data_desligamento and \
- data_designacao > data_desligamento:
+ if data_desligamento and data_designacao > data_desligamento:
self.logger.warning(
- 'Data de designação ({}) superior '
- 'à data de desligamento ({})'.format(data_designacao, data_desligamento)
+ "Data de designação ({}) superior "
+ "à data de desligamento ({})".format(data_designacao, data_desligamento)
+ )
+ raise ValidationError(
+ _("Data de designação não pode ser superior " "à data de desligamento")
)
- raise ValidationError(_('Data de designação não pode ser superior '
- 'à data de desligamento'))
composicao_id = self.instance.composicao_id
composicao = Composicao.objects.get(id=composicao_id)
- cargos_unicos = [c.cargo.nome for c in
- composicao.participacao_set.filter(cargo__unico=True).exclude(id=self.instance.pk)]
+ cargos_unicos = [
+ c.cargo.nome
+ for c in composicao.participacao_set.filter(cargo__unico=True).exclude(
+ id=self.instance.pk
+ )
+ ]
- if cleaned_data['cargo'].nome in cargos_unicos:
- msg = _('Este cargo é único para esta Comissão.')
+ if cleaned_data["cargo"].nome in cargos_unicos:
+ msg = _("Este cargo é único para esta Comissão.")
self.logger.warning(
- 'Este cargo ({}) é único para esta Comissão (id={}).'.format(
- cleaned_data['cargo'].nome, composicao_id
+ "Este cargo ({}) é único para esta Comissão (id={}).".format(
+ cleaned_data["cargo"].nome, composicao_id
)
)
raise ValidationError(msg)
@@ -294,23 +334,28 @@ class ParticipacaoEditForm(forms.ModelForm):
class ComissaoForm(forms.ModelForm):
-
logger = logging.getLogger(__name__)
class Meta:
model = Comissao
- fields = '__all__'
+ fields = "__all__"
def __init__(self, user=None, **kwargs):
super(ComissaoForm, self).__init__(**kwargs)
inst = self.instance
if inst.pk:
- if inst.tipo.natureza == 'P':
- self.fields['apelido_temp'].widget.attrs['disabled'] = 'disabled'
- self.fields['data_instalacao_temp'].widget.attrs['disabled'] = 'disabled'
- self.fields['data_final_prevista_temp'].widget.attrs['disabled'] = 'disabled'
- self.fields['data_prorrogada_temp'].widget.attrs['disabled'] = 'disabled'
- self.fields['data_fim_comissao'].widget.attrs['disabled'] = 'disabled'
+ if inst.tipo.natureza == "P":
+ self.fields["apelido_temp"].widget.attrs["disabled"] = "disabled"
+ self.fields["data_instalacao_temp"].widget.attrs[
+ "disabled"
+ ] = "disabled"
+ self.fields["data_final_prevista_temp"].widget.attrs[
+ "disabled"
+ ] = "disabled"
+ self.fields["data_prorrogada_temp"].widget.attrs[
+ "disabled"
+ ] = "disabled"
+ self.fields["data_fim_comissao"].widget.attrs["disabled"] = "disabled"
def clean(self):
super(ComissaoForm, self).clean()
@@ -318,71 +363,92 @@ class ComissaoForm(forms.ModelForm):
if not self.is_valid():
return self.cleaned_data
- if len(self.cleaned_data['nome']) > 100:
- msg = _('Nome da Comissão informado ({}) tem mais de 50 caracteres.'.format(
- self.cleaned_data['nome']))
- self.logger.warning(
- 'Nome da Comissão deve ter no máximo 50 caracteres.'
+ if len(self.cleaned_data["nome"]) > 100:
+ msg = _(
+ "Nome da Comissão informado ({}) tem mais de 50 caracteres.".format(
+ self.cleaned_data["nome"]
+ )
)
+ self.logger.warning("Nome da Comissão deve ter no máximo 50 caracteres.")
raise ValidationError(msg)
- if (self.cleaned_data['data_extincao'] and
- self.cleaned_data['data_extincao'] <
- self.cleaned_data['data_criacao']):
- msg = _('Data de extinção não pode ser menor que a de criação')
+ if (
+ self.cleaned_data["data_extincao"]
+ and self.cleaned_data["data_extincao"] < self.cleaned_data["data_criacao"]
+ ):
+ msg = _("Data de extinção não pode ser menor que a de criação")
self.logger.warning(
- 'Data de extinção ({}) não pode ser menor que a de criação ({}).'.format(
- self.cleaned_data['data_extincao'], self.cleaned_data['data_criacao']
+ "Data de extinção ({}) não pode ser menor que a de criação ({}).".format(
+ self.cleaned_data["data_extincao"],
+ self.cleaned_data["data_criacao"],
)
)
raise ValidationError(msg)
- if (self.cleaned_data['data_final_prevista_temp'] and
- self.cleaned_data['data_final_prevista_temp'] <
- self.cleaned_data['data_criacao']):
- msg = _('Data Prevista para Término não pode ser menor que a de criação')
+ if (
+ self.cleaned_data["data_final_prevista_temp"]
+ and self.cleaned_data["data_final_prevista_temp"]
+ < self.cleaned_data["data_criacao"]
+ ):
+ msg = _("Data Prevista para Término não pode ser menor que a de criação")
self.logger.warning(
- 'Data Prevista para Término ({}) não pode ser menor que a de criação ({}).'.format(
- self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_criacao']
+ "Data Prevista para Término ({}) não pode ser menor que a de criação ({}).".format(
+ self.cleaned_data["data_final_prevista_temp"],
+ self.cleaned_data["data_criacao"],
)
)
raise ValidationError(msg)
- if (self.cleaned_data['data_prorrogada_temp'] and
- self.cleaned_data['data_prorrogada_temp'] <
- self.cleaned_data['data_criacao']):
- msg = _('Data Novo Prazo não pode ser menor que a de criação')
+ if (
+ self.cleaned_data["data_prorrogada_temp"]
+ and self.cleaned_data["data_prorrogada_temp"]
+ < self.cleaned_data["data_criacao"]
+ ):
+ msg = _("Data Novo Prazo não pode ser menor que a de criação")
self.logger.warning(
- 'Data Novo Prazo ({}) não pode ser menor que a de criação ({}).'.format(
- self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_criacao']
+ "Data Novo Prazo ({}) não pode ser menor que a de criação ({}).".format(
+ self.cleaned_data["data_prorrogada_temp"],
+ self.cleaned_data["data_criacao"],
)
)
raise ValidationError(msg)
- if (self.cleaned_data['data_instalacao_temp'] and
- self.cleaned_data['data_instalacao_temp'] <
- self.cleaned_data['data_criacao']):
- msg = _('Data de Instalação não pode ser menor que a de criação')
+ if (
+ self.cleaned_data["data_instalacao_temp"]
+ and self.cleaned_data["data_instalacao_temp"]
+ < self.cleaned_data["data_criacao"]
+ ):
+ msg = _("Data de Instalação não pode ser menor que a de criação")
self.logger.warning(
- 'Data de Instalação ({}) não pode ser menor que a de criação ({}).'.format(
- self.cleaned_data['data_instalacao_temp'], self.cleaned_data['data_criacao']
+ "Data de Instalação ({}) não pode ser menor que a de criação ({}).".format(
+ self.cleaned_data["data_instalacao_temp"],
+ self.cleaned_data["data_criacao"],
)
)
raise ValidationError(msg)
- if (self.cleaned_data['data_final_prevista_temp'] and self.cleaned_data['data_instalacao_temp'] and
- self.cleaned_data['data_final_prevista_temp'] <
- self.cleaned_data['data_instalacao_temp']):
+ if (
+ self.cleaned_data["data_final_prevista_temp"]
+ and self.cleaned_data["data_instalacao_temp"]
+ and self.cleaned_data["data_final_prevista_temp"]
+ < self.cleaned_data["data_instalacao_temp"]
+ ):
msg = _(
- 'Data Prevista para Término não pode ser menor que a de Instalação.')
+ "Data Prevista para Término não pode ser menor que a de Instalação."
+ )
self.logger.warning(
- 'Data Prevista para Término ({}) não pode ser menor que a de Instalação ({}).'.format(
- self.cleaned_data['data_final_prevista_temp'], self.cleaned_data['data_instalacao_temp']
+ "Data Prevista para Término ({}) não pode ser menor que a de Instalação ({}).".format(
+ self.cleaned_data["data_final_prevista_temp"],
+ self.cleaned_data["data_instalacao_temp"],
)
)
raise ValidationError(msg)
- if (self.cleaned_data['data_prorrogada_temp'] and self.cleaned_data['data_instalacao_temp'] and
- self.cleaned_data['data_prorrogada_temp'] <
- self.cleaned_data['data_instalacao_temp']):
- msg = _('Data Novo Prazo não pode ser menor que a de Instalação.')
+ if (
+ self.cleaned_data["data_prorrogada_temp"]
+ and self.cleaned_data["data_instalacao_temp"]
+ and self.cleaned_data["data_prorrogada_temp"]
+ < self.cleaned_data["data_instalacao_temp"]
+ ):
+ msg = _("Data Novo Prazo não pode ser menor que a de Instalação.")
self.logger.warning(
- 'Data Novo Prazo ({}) não pode ser menor que a de Instalação ({}).'.format(
- self.cleaned_data['data_prorrogada_temp'], self.cleaned_data['data_instalacao_temp']
+ "Data Novo Prazo ({}) não pode ser menor que a de Instalação ({}).".format(
+ self.cleaned_data["data_prorrogada_temp"],
+ self.cleaned_data["data_instalacao_temp"],
)
)
raise ValidationError(msg)
@@ -396,12 +462,9 @@ class ComissaoForm(forms.ModelForm):
content_type = ContentType.objects.get_for_model(Comissao)
object_id = comissao.pk
tipo = TipoAutor.objects.get(content_type=content_type)
- nome = comissao.sigla + ' - ' + comissao.nome
+ nome = comissao.sigla + " - " + comissao.nome
Autor.objects.create(
- content_type=content_type,
- object_id=object_id,
- tipo=tipo,
- nome=nome
+ content_type=content_type, object_id=object_id, tipo=tipo, nome=nome
)
return comissao
else:
@@ -410,14 +473,14 @@ class ComissaoForm(forms.ModelForm):
class ReuniaoForm(ModelForm):
-
logger = logging.getLogger(__name__)
- comissao = forms.ModelChoiceField(queryset=Comissao.objects.all(),
- widget=forms.HiddenInput())
+ comissao = forms.ModelChoiceField(
+ queryset=Comissao.objects.all(), widget=forms.HiddenInput()
+ )
class Meta:
model = Reuniao
- exclude = ['cod_andamento_reuniao']
+ exclude = ["cod_andamento_reuniao"]
def clean(self):
super(ReuniaoForm, self).clean()
@@ -425,28 +488,28 @@ class ReuniaoForm(ModelForm):
if not self.is_valid():
return self.cleaned_data
- if self.cleaned_data['hora_fim']:
- if (self.cleaned_data['hora_fim'] <
- self.cleaned_data['hora_inicio']):
+ if self.cleaned_data["hora_fim"]:
+ if self.cleaned_data["hora_fim"] < self.cleaned_data["hora_inicio"]:
msg = _(
- 'A hora de término da reunião não pode ser menor que a de início')
+ "A hora de término da reunião não pode ser menor que a de início"
+ )
self.logger.warning(
"A hora de término da reunião ({}) não pode ser menor que a de início ({}).".format(
- self.cleaned_data['hora_fim'], self.cleaned_data['hora_inicio']
+ self.cleaned_data["hora_fim"], self.cleaned_data["hora_inicio"]
)
)
raise ValidationError(msg)
- upload_pauta = self.cleaned_data.get('upload_pauta', False)
- upload_ata = self.cleaned_data.get('upload_ata', False)
- upload_anexo = self.cleaned_data.get('upload_anexo', False)
+ upload_pauta = self.cleaned_data.get("upload_pauta", False)
+ upload_ata = self.cleaned_data.get("upload_ata", False)
+ upload_anexo = self.cleaned_data.get("upload_anexo", False)
if upload_pauta:
validar_arquivo(upload_pauta, "Pauta da Reunião")
-
+
if upload_ata:
validar_arquivo(upload_ata, "Ata da Reunião")
-
+
if upload_anexo:
validar_arquivo(upload_anexo, "Anexo da Reunião")
@@ -454,59 +517,62 @@ class ReuniaoForm(ModelForm):
class PautaReuniaoFilterSet(django_filters.FilterSet):
-
class Meta(FilterOverridesMetaMixin):
model = MateriaEmTramitacao
- fields = ['materia__tipo', 'materia__ano', 'materia__numero', 'materia__data_apresentacao']
+ fields = [
+ "materia__tipo",
+ "materia__ano",
+ "materia__numero",
+ "materia__data_apresentacao",
+ ]
def __init__(self, *args, **kwargs):
super(PautaReuniaoFilterSet, self).__init__(*args, **kwargs)
- self.filters['materia__tipo'].label = "Tipo da Matéria"
- self.filters['materia__ano'].label = "Ano da Matéria"
- self.filters['materia__numero'].label = "Número da Matéria"
- self.filters['materia__data_apresentacao'].label = "Data (Inicial - Final)"
+ self.filters["materia__tipo"].label = "Tipo da Matéria"
+ self.filters["materia__ano"].label = "Ano da Matéria"
+ self.filters["materia__numero"].label = "Número da Matéria"
+ self.filters["materia__data_apresentacao"].label = "Data (Inicial - Final)"
- row1 = to_row([('materia__tipo', 4), ('materia__ano', 4), ('materia__numero', 4)])
- row2 = to_row([('materia__data_apresentacao', 12)])
+ row1 = to_row(
+ [("materia__tipo", 4), ("materia__ano", 4), ("materia__numero", 4)]
+ )
+ row2 = to_row([("materia__data_apresentacao", 12)])
self.form.helper = SaplFormHelper()
self.form.helper.form_method = "GET"
self.form.helper.layout = Layout(
Fieldset(
- _("Pesquisa de Matérias"), row1, row2,
- form_actions(label="Pesquisar")
+ _("Pesquisa de Matérias"), row1, row2, form_actions(label="Pesquisar")
)
)
class PautaReuniaoForm(forms.ModelForm):
-
class Meta:
model = PautaReuniao
- exclude = ['reuniao']
+ exclude = ["reuniao"]
class DocumentoAcessorioCreateForm(FileFieldCheckMixin, forms.ModelForm):
-
parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput())
class Meta:
model = DocumentoAcessorio
- exclude = ['reuniao']
+ exclude = ["reuniao"]
def __init__(self, user=None, **kwargs):
super(DocumentoAcessorioCreateForm, self).__init__(**kwargs)
if self.instance:
- reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
+ reuniao = Reuniao.objects.get(id=self.initial["parent_pk"])
comissao = reuniao.comissao
comissao_pk = comissao.id
documentos = reuniao.documentoacessorio_set.all()
return self.create_documentoacessorio()
def create_documentoacessorio(self):
- reuniao = Reuniao.objects.get(id=self.initial['parent_pk'])
+ reuniao = Reuniao.objects.get(id=self.initial["parent_pk"])
def clean(self):
super(DocumentoAcessorioCreateForm, self).clean()
@@ -514,7 +580,7 @@ class DocumentoAcessorioCreateForm(FileFieldCheckMixin, forms.ModelForm):
if not self.is_valid():
return self.cleaned_data
- arquivo = self.cleaned_data.get('arquivo')
+ arquivo = self.cleaned_data.get("arquivo")
if arquivo:
validar_arquivo(arquivo, "Texto Integral")
@@ -529,13 +595,11 @@ class DocumentoAcessorioCreateForm(FileFieldCheckMixin, forms.ModelForm):
class DocumentoAcessorioEditForm(FileFieldCheckMixin, forms.ModelForm):
-
parent_pk = forms.CharField(required=False) # widget=forms.HiddenInput())
class Meta:
model = DocumentoAcessorio
- fields = ['nome', 'data', 'autor', 'ementa',
- 'indexacao', 'arquivo']
+ fields = ["nome", "data", "autor", "ementa", "indexacao", "arquivo"]
def __init__(self, user=None, **kwargs):
super(DocumentoAcessorioEditForm, self).__init__(**kwargs)
@@ -546,7 +610,7 @@ class DocumentoAcessorioEditForm(FileFieldCheckMixin, forms.ModelForm):
if not self.is_valid():
return self.cleaned_data
- arquivo = self.cleaned_data.get('arquivo')
+ arquivo = self.cleaned_data.get("arquivo")
if arquivo:
validar_arquivo(arquivo, "Texto Integral")
diff --git a/sapl/comissoes/models.py b/sapl/comissoes/models.py
index 0245a2d8a..2b365da65 100644
--- a/sapl/comissoes/models.py
+++ b/sapl/comissoes/models.py
@@ -4,261 +4,276 @@ from model_utils import Choices
from sapl.base.models import Autor
from sapl.parlamentares.models import Parlamentar
-from sapl.utils import (YES_NO_CHOICES, SaplGenericRelation,
- restringe_tipos_de_arquivo_txt, texto_upload_path,
- OverwriteStorage)
+from sapl.utils import (YES_NO_CHOICES, OverwriteStorage, SaplGenericRelation,
+ restringe_tipos_de_arquivo_txt, texto_upload_path)
class TipoComissao(models.Model):
- NATUREZA_CHOICES = Choices(('T', 'temporaria', _('Temporária')),
- ('P', 'permanente', _('Permanente')))
- nome = models.CharField(max_length=50, verbose_name=_('Nome'))
+ NATUREZA_CHOICES = Choices(
+ ("T", "temporaria", _("Temporária")), ("P", "permanente", _("Permanente"))
+ )
+ nome = models.CharField(max_length=50, verbose_name=_("Nome"))
natureza = models.CharField(
- max_length=1, verbose_name=_('Natureza'), choices=NATUREZA_CHOICES)
- sigla = models.CharField(max_length=10, verbose_name=_('Sigla'))
+ max_length=1, verbose_name=_("Natureza"), choices=NATUREZA_CHOICES
+ )
+ sigla = models.CharField(max_length=10, verbose_name=_("Sigla"))
dispositivo_regimental = models.CharField(
- max_length=50,
- blank=True,
- verbose_name=_('Dispositivo Regimental'))
+ max_length=50, blank=True, verbose_name=_("Dispositivo Regimental")
+ )
class Meta:
- verbose_name = _('Tipo de Comissão')
- verbose_name_plural = _('Tipos de Comissão')
- ordering = ('id',)
+ verbose_name = _("Tipo de Comissão")
+ verbose_name_plural = _("Tipos de Comissão")
+ ordering = ("id",)
def __str__(self):
return self.nome
class Comissao(models.Model):
- tipo = models.ForeignKey(TipoComissao,
- on_delete=models.PROTECT,
- verbose_name=_('Tipo'))
- nome = models.CharField(max_length=100, verbose_name=_('Nome'))
- sigla = models.CharField(max_length=10, verbose_name=_('Sigla'))
- data_criacao = models.DateField(verbose_name=_('Data de Criação'))
+ tipo = models.ForeignKey(
+ TipoComissao, on_delete=models.PROTECT, verbose_name=_("Tipo")
+ )
+ nome = models.CharField(max_length=100, verbose_name=_("Nome"))
+ sigla = models.CharField(max_length=10, verbose_name=_("Sigla"))
+ data_criacao = models.DateField(verbose_name=_("Data de Criação"))
data_extincao = models.DateField(
- blank=True, null=True, verbose_name=_('Data de Extinção'))
+ blank=True, null=True, verbose_name=_("Data de Extinção")
+ )
apelido_temp = models.CharField(
- max_length=100, blank=True, verbose_name=_('Apelido'))
+ max_length=100, blank=True, verbose_name=_("Apelido")
+ )
data_instalacao_temp = models.DateField(
- blank=True, null=True, verbose_name=_('Data Instalação'))
+ blank=True, null=True, verbose_name=_("Data Instalação")
+ )
data_final_prevista_temp = models.DateField(
- blank=True, null=True, verbose_name=_('Data Prevista Término'))
+ blank=True, null=True, verbose_name=_("Data Prevista Término")
+ )
data_prorrogada_temp = models.DateField(
- blank=True, null=True, verbose_name=_('Novo Prazo'))
+ blank=True, null=True, verbose_name=_("Novo Prazo")
+ )
data_fim_comissao = models.DateField(
- blank=True, null=True, verbose_name=_('Data Término'))
+ blank=True, null=True, verbose_name=_("Data Término")
+ )
secretario = models.CharField(
- max_length=30, blank=True, verbose_name=_('Secretário'))
+ max_length=30, blank=True, verbose_name=_("Secretário")
+ )
telefone_reuniao = models.CharField(
- max_length=15, blank=True,
- verbose_name=_('Tel. Sala Reunião'))
+ max_length=15, blank=True, verbose_name=_("Tel. Sala Reunião")
+ )
endereco_secretaria = models.CharField(
- max_length=100, blank=True,
- verbose_name=_('Endereço Secretaria'))
+ max_length=100, blank=True, verbose_name=_("Endereço Secretaria")
+ )
telefone_secretaria = models.CharField(
- max_length=15, blank=True,
- verbose_name=_('Tel. Secretaria'))
+ max_length=15, blank=True, verbose_name=_("Tel. Secretaria")
+ )
fax_secretaria = models.CharField(
- max_length=15, blank=True, verbose_name=_('Fax Secretaria'))
+ max_length=15, blank=True, verbose_name=_("Fax Secretaria")
+ )
agenda_reuniao = models.CharField(
- max_length=100, blank=True,
- verbose_name=_('Data/Hora Reunião'))
+ max_length=100, blank=True, verbose_name=_("Data/Hora Reunião")
+ )
local_reuniao = models.CharField(
- max_length=100, blank=True, verbose_name=_('Local Reunião'))
- finalidade = models.TextField(
- blank=True, verbose_name=_('Finalidade'))
- email = models.EmailField(max_length=100,
- blank=True,
- verbose_name=_('E-mail'))
+ max_length=100, blank=True, verbose_name=_("Local Reunião")
+ )
+ finalidade = models.TextField(blank=True, verbose_name=_("Finalidade"))
+ email = models.EmailField(max_length=100, blank=True, verbose_name=_("E-mail"))
unidade_deliberativa = models.BooleanField(
- choices=YES_NO_CHOICES,
- verbose_name=_('Unidade Deliberativa'),
- default=False)
+ choices=YES_NO_CHOICES, verbose_name=_("Unidade Deliberativa"), default=False
+ )
ativa = models.BooleanField(
- default=False,
- choices=YES_NO_CHOICES,
- verbose_name=_('Comissão Ativa?'))
- autor = SaplGenericRelation(Autor,
- related_query_name='comissao_set',
- fields_search=(
- ('nome', '__icontains'),
- ('sigla', '__icontains')
- ))
+ default=False, choices=YES_NO_CHOICES, verbose_name=_("Comissão Ativa?")
+ )
+ autor = SaplGenericRelation(
+ Autor,
+ related_query_name="comissao_set",
+ fields_search=(("nome", "__icontains"), ("sigla", "__icontains")),
+ )
class Meta:
- verbose_name = _('Comissão')
- verbose_name_plural = _('Comissões')
- ordering = ['nome']
+ verbose_name = _("Comissão")
+ verbose_name_plural = _("Comissões")
+ ordering = ["nome"]
def __str__(self):
- return self.sigla + ' - ' + self.nome
+ return self.sigla + " - " + self.nome
class Periodo(models.Model): # PeriodoCompComissao
- data_inicio = models.DateField(verbose_name=_('Data Início'))
- data_fim = models.DateField(
- blank=True, null=True, verbose_name=_('Data Fim'))
+ data_inicio = models.DateField(verbose_name=_("Data Início"))
+ data_fim = models.DateField(blank=True, null=True, verbose_name=_("Data Fim"))
class Meta:
- verbose_name = _('Período de composição de Comissão')
- verbose_name_plural = _('Períodos de composição de Comissão')
- ordering = ['-data_inicio', '-data_fim']
+ verbose_name = _("Período de composição de Comissão")
+ verbose_name_plural = _("Períodos de composição de Comissão")
+ ordering = ["-data_inicio", "-data_fim"]
def __str__(self):
if self.data_inicio and self.data_fim:
- return '%s - %s' % (self.data_inicio.strftime("%d/%m/%Y"),
- self.data_fim.strftime("%d/%m/%Y"))
+ return "%s - %s" % (
+ self.data_inicio.strftime("%d/%m/%Y"),
+ self.data_fim.strftime("%d/%m/%Y"),
+ )
elif self.data_inicio and not self.data_fim:
- return '%s - ' % self.data_inicio.strftime("%d/%m/%Y")
+ return "%s - " % self.data_inicio.strftime("%d/%m/%Y")
else:
- return '-'
+ return "-"
class CargoComissao(models.Model):
id_ordenacao = models.PositiveIntegerField(
- blank=True, null=True, verbose_name=_('Posição na Ordenação'),
+ blank=True,
+ null=True,
+ verbose_name=_("Posição na Ordenação"),
)
- nome = models.CharField(max_length=50, verbose_name=_('Nome do Cargo'))
+ nome = models.CharField(max_length=50, verbose_name=_("Nome do Cargo"))
unico = models.BooleanField(
- choices=YES_NO_CHOICES, verbose_name=_('Cargo Único'), default=True
+ choices=YES_NO_CHOICES, verbose_name=_("Cargo Único"), default=True
)
class Meta:
- verbose_name = _('Cargo de Comissão')
- verbose_name_plural = _('Cargos de Comissão')
- ordering = ['id_ordenacao']
+ verbose_name = _("Cargo de Comissão")
+ verbose_name_plural = _("Cargos de Comissão")
+ ordering = ["id_ordenacao"]
def __str__(self):
return self.nome
class Composicao(models.Model): # IGNORE
- comissao = models.ForeignKey(Comissao,
- on_delete=models.CASCADE,
- verbose_name=_('Comissão'))
- periodo = models.ForeignKey(Periodo,
- on_delete=models.PROTECT,
- verbose_name=_('Período'))
+ comissao = models.ForeignKey(
+ Comissao, on_delete=models.CASCADE, verbose_name=_("Comissão")
+ )
+ periodo = models.ForeignKey(
+ Periodo, on_delete=models.PROTECT, verbose_name=_("Período")
+ )
class Meta:
- verbose_name = _('Composição de Comissão')
- verbose_name_plural = _('Composições de Comissão')
- ordering = ['periodo']
+ verbose_name = _("Composição de Comissão")
+ verbose_name_plural = _("Composições de Comissão")
+ ordering = ["periodo"]
def __str__(self):
- return '%s: %s' % (self.comissao.sigla, self.periodo)
+ return "%s: %s" % (self.comissao.sigla, self.periodo)
class Participacao(models.Model): # ComposicaoComissao
- composicao = models.ForeignKey(Composicao,
- related_name='participacao_set',
- on_delete=models.CASCADE,
- verbose_name=_('Composição'))
- parlamentar = models.ForeignKey(Parlamentar,
- on_delete=models.PROTECT,
- verbose_name='Parlamentar')
- cargo = models.ForeignKey(CargoComissao,
- on_delete=models.PROTECT,
- verbose_name='Cargo')
+ composicao = models.ForeignKey(
+ Composicao,
+ related_name="participacao_set",
+ on_delete=models.CASCADE,
+ verbose_name=_("Composição"),
+ )
+ parlamentar = models.ForeignKey(
+ Parlamentar, on_delete=models.PROTECT, verbose_name="Parlamentar"
+ )
+ cargo = models.ForeignKey(
+ CargoComissao, on_delete=models.PROTECT, verbose_name="Cargo"
+ )
titular = models.BooleanField(
- verbose_name=_('Titular'),
- default=False,
- choices=YES_NO_CHOICES)
- data_designacao = models.DateField(verbose_name=_('Data Designação'))
- data_desligamento = models.DateField(blank=True,
- null=True,
- verbose_name=_('Data Desligamento'))
+ verbose_name=_("Titular"), default=False, choices=YES_NO_CHOICES
+ )
+ data_designacao = models.DateField(verbose_name=_("Data Designação"))
+ data_desligamento = models.DateField(
+ blank=True, null=True, verbose_name=_("Data Desligamento")
+ )
motivo_desligamento = models.TextField(
- blank=True, verbose_name=_('Motivo Desligamento'))
- observacao = models.TextField(
- blank=True, verbose_name=_('Observação'))
+ blank=True, verbose_name=_("Motivo Desligamento")
+ )
+ observacao = models.TextField(blank=True, verbose_name=_("Observação"))
class Meta:
- verbose_name = _('Participação em Comissão')
- verbose_name_plural = _('Participações em Comissão')
- ordering = ['-titular', 'cargo__id_ordenacao']
+ verbose_name = _("Participação em Comissão")
+ verbose_name_plural = _("Participações em Comissão")
+ ordering = ["-titular", "cargo__id_ordenacao"]
def __str__(self):
- return '%s : %s' % (self.cargo, self.parlamentar)
+ return "%s : %s" % (self.cargo, self.parlamentar)
def get_comissao_media_path(instance, subpath, filename):
- return './sapl/comissao/%s/%s/%s' % (instance.numero, subpath, filename)
+ return "./sapl/comissao/%s/%s/%s" % (instance.numero, subpath, filename)
def pauta_upload_path(instance, filename):
-
- return texto_upload_path(instance, filename, subpath='pauta', pk_first=True)
+ return texto_upload_path(instance, filename, subpath="pauta", pk_first=True)
def ata_upload_path(instance, filename):
- return texto_upload_path(instance, filename, subpath='ata', pk_first=True)
+ return texto_upload_path(instance, filename, subpath="ata", pk_first=True)
def anexo_upload_path(instance, filename):
- return texto_upload_path(instance, filename, subpath='anexo', pk_first=True)
+ return texto_upload_path(instance, filename, subpath="anexo", pk_first=True)
class Reuniao(models.Model):
- periodo = models. ForeignKey(
+ periodo = models.ForeignKey(
Periodo,
null=True,
on_delete=models.PROTECT,
- verbose_name=_('Periodo da Composicão da Comissão'))
+ verbose_name=_("Periodo da Composicão da Comissão"),
+ )
comissao = models.ForeignKey(
- Comissao,
- on_delete=models.CASCADE,
- verbose_name=_('Comissão'))
- numero = models.PositiveIntegerField(verbose_name=_('Número'))
- nome = models.CharField(
- max_length=150, verbose_name=_('Nome da Reunião'))
+ Comissao, on_delete=models.CASCADE, verbose_name=_("Comissão")
+ )
+ numero = models.PositiveIntegerField(verbose_name=_("Número"))
+ nome = models.CharField(max_length=150, verbose_name=_("Nome da Reunião"))
tema = models.CharField(
- max_length=150, blank=True, verbose_name=_('Tema da Reunião'))
- data = models.DateField(verbose_name=_('Data'))
+ max_length=150, blank=True, verbose_name=_("Tema da Reunião")
+ )
+ data = models.DateField(verbose_name=_("Data"))
hora_inicio = models.TimeField(
- null=True,
- verbose_name=_('Horário de Início (hh:mm)'))
+ null=True, verbose_name=_("Horário de Início (hh:mm)")
+ )
hora_fim = models.TimeField(
- blank=True,
- null=True,
- verbose_name=_('Horário de Término (hh:mm)'))
+ blank=True, null=True, verbose_name=_("Horário de Término (hh:mm)")
+ )
local_reuniao = models.CharField(
- max_length=100, blank=True, verbose_name=_('Local da Reunião'))
- observacao = models.TextField(
- blank=True, verbose_name=_('Observação'))
+ max_length=100, blank=True, verbose_name=_("Local da Reunião")
+ )
+ observacao = models.TextField(blank=True, verbose_name=_("Observação"))
url_audio = models.URLField(
- max_length=150, blank=True,
- verbose_name=_('URL do Arquivo de Áudio (Formatos MP3 / AAC)'))
+ max_length=150,
+ blank=True,
+ verbose_name=_("URL do Arquivo de Áudio (Formatos MP3 / AAC)"),
+ )
url_video = models.URLField(
- max_length=150, blank=True,
- verbose_name=_('URL do Arquivo de Vídeo (Formatos MP4 / FLV / WebM)'))
+ max_length=150,
+ blank=True,
+ verbose_name=_("URL do Arquivo de Vídeo (Formatos MP4 / FLV / WebM)"),
+ )
upload_pauta = models.FileField(
max_length=300,
- blank=True, null=True,
+ blank=True,
+ null=True,
upload_to=pauta_upload_path,
- verbose_name=_('Pauta da Reunião'),
+ verbose_name=_("Pauta da Reunião"),
storage=OverwriteStorage(),
- validators=[restringe_tipos_de_arquivo_txt])
+ validators=[restringe_tipos_de_arquivo_txt],
+ )
upload_ata = models.FileField(
max_length=300,
- blank=True, null=True,
+ blank=True,
+ null=True,
upload_to=ata_upload_path,
- verbose_name=_('Ata da Reunião'),
+ verbose_name=_("Ata da Reunião"),
storage=OverwriteStorage(),
- validators=[restringe_tipos_de_arquivo_txt])
+ validators=[restringe_tipos_de_arquivo_txt],
+ )
upload_anexo = models.FileField(
max_length=300,
- blank=True, null=True,
+ blank=True,
+ null=True,
upload_to=anexo_upload_path,
storage=OverwriteStorage(),
- verbose_name=_('Anexo da Reunião'))
+ verbose_name=_("Anexo da Reunião"),
+ )
class Meta:
- verbose_name = _('Reunião de Comissão')
- verbose_name_plural = _('Reuniões de Comissão')
- ordering = ('-data', '-nome')
+ verbose_name = _("Reunião de Comissão")
+ verbose_name_plural = _("Reuniões de Comissão")
+ ordering = ("-data", "-nome")
def __str__(self):
return self.nome
@@ -281,67 +296,68 @@ class Reuniao(models.Model):
return result
- def save(self, force_insert=False, force_update=False, using=None,
- update_fields=None):
-
- if not self.pk and (self.upload_pauta or self.upload_ata or
- self.upload_anexo):
+ def save(
+ self, force_insert=False, force_update=False, using=None, update_fields=None
+ ):
+ if not self.pk and (self.upload_pauta or self.upload_ata or self.upload_anexo):
upload_pauta = self.upload_pauta
upload_ata = self.upload_ata
upload_anexo = self.upload_anexo
self.upload_pauta = None
self.upload_ata = None
self.upload_anexo = None
- models.Model.save(self, force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields)
+ models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
self.upload_pauta = upload_pauta
self.upload_ata = upload_ata
self.upload_anexo = upload_anexo
- return models.Model.save(self, force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields)
+ return models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
class DocumentoAcessorio(models.Model):
- reuniao = models.ForeignKey(Reuniao,
- related_name='documentoacessorio_set',
- on_delete=models.PROTECT)
- nome = models.CharField(max_length=50, verbose_name=_('Nome'))
-
- data = models.DateField(blank=True, null=True,
- default=None, verbose_name=_('Data'))
- autor = models.CharField(
- max_length=200, verbose_name=_('Autor'))
- ementa = models.TextField(blank=True, verbose_name=_('Ementa'))
+ reuniao = models.ForeignKey(
+ Reuniao, related_name="documentoacessorio_set", on_delete=models.PROTECT
+ )
+ nome = models.CharField(max_length=50, verbose_name=_("Nome"))
+
+ data = models.DateField(blank=True, null=True, default=None, verbose_name=_("Data"))
+ autor = models.CharField(max_length=200, verbose_name=_("Autor"))
+ ementa = models.TextField(blank=True, verbose_name=_("Ementa"))
indexacao = models.TextField(blank=True)
arquivo = models.FileField(
max_length=300,
blank=True,
null=True,
upload_to=anexo_upload_path,
- verbose_name=_('Texto Integral'),
+ verbose_name=_("Texto Integral"),
storage=OverwriteStorage(),
- validators=[restringe_tipos_de_arquivo_txt])
+ validators=[restringe_tipos_de_arquivo_txt],
+ )
data_ultima_atualizacao = models.DateTimeField(
- blank=True, null=True,
- auto_now=True,
- verbose_name=_('Data'))
+ blank=True, null=True, auto_now=True, verbose_name=_("Data")
+ )
class Meta:
- verbose_name = _('Documento Acessório')
- verbose_name_plural = _('Documentos Acessórios')
- ordering = ('data', 'id')
+ verbose_name = _("Documento Acessório")
+ verbose_name_plural = _("Documentos Acessórios")
+ ordering = ("data", "id")
def __str__(self):
- return _('%(nome)s por %(autor)s') % {
- 'nome': self.nome,
- 'autor': self.autor}
+ return _("%(nome)s por %(autor)s") % {"nome": self.nome, "autor": self.autor}
def delete(self, using=None, keep_parents=False):
arquivo = self.arquivo
@@ -352,19 +368,25 @@ class DocumentoAcessorio(models.Model):
return result
- def save(self, force_insert=False, force_update=False, using=None,
- update_fields=None):
-
+ def save(
+ self, force_insert=False, force_update=False, using=None, update_fields=None
+ ):
if not self.pk and self.arquivo:
arquivo = self.arquivo
self.arquivo = None
- models.Model.save(self, force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields)
+ models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
self.arquivo = arquivo
- return models.Model.save(self, force_insert=force_insert,
- force_update=force_update,
- using=using,
- update_fields=update_fields)
+ return models.Model.save(
+ self,
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ )
diff --git a/sapl/comissoes/tests/test_comissoes.py b/sapl/comissoes/tests/test_comissoes.py
index 9a3c30dd8..33b718410 100644
--- a/sapl/comissoes/tests/test_comissoes.py
+++ b/sapl/comissoes/tests/test_comissoes.py
@@ -3,61 +3,55 @@ from django.urls import reverse
from django.utils.translation import gettext as _
from model_bakery import baker
-from sapl.comissoes.models import Comissao, Composicao, Periodo
-from sapl.comissoes.models import TipoComissao, Reuniao
-from sapl.parlamentares.models import Filiacao, Parlamentar, Partido
from sapl.comissoes import forms
+from sapl.comissoes.models import (Comissao, Composicao, Periodo, Reuniao,
+ TipoComissao)
+from sapl.parlamentares.models import Filiacao, Parlamentar, Partido
def make_composicao(comissao):
- periodo = baker.make(Periodo,
- data_inicio='2016-01-01',
- data_fim='2016-12-31')
- baker.make(Composicao,
- periodo=periodo,
- comissao=comissao)
+ periodo = baker.make(Periodo, data_inicio="2016-01-01", data_fim="2016-12-31")
+ baker.make(Composicao, periodo=periodo, comissao=comissao)
return Composicao.objects.first()
def make_comissao():
tipo = baker.make(TipoComissao)
- baker.make(Comissao,
- tipo=tipo,
- nome='Comissão Teste',
- sigla='CT',
- data_criacao='2016-03-22')
+ baker.make(
+ Comissao,
+ tipo=tipo,
+ nome="Comissão Teste",
+ sigla="CT",
+ data_criacao="2016-03-22",
+ )
return Comissao.objects.first()
def make_filiacao():
- partido = baker.make(Partido,
- nome='Partido Meu',
- sigla='PM')
- parlamentar = baker.make(Parlamentar,
- nome_parlamentar='Eduardo',
- nome_completo='Eduardo',
- sexo='M',
- ativo=True)
- baker.make(Filiacao,
- data='2016-03-22',
- parlamentar=parlamentar,
- partido=partido)
+ partido = baker.make(Partido, nome="Partido Meu", sigla="PM")
+ parlamentar = baker.make(
+ Parlamentar,
+ nome_parlamentar="Eduardo",
+ nome_completo="Eduardo",
+ sexo="M",
+ ativo=True,
+ )
+ baker.make(Filiacao, data="2016-03-22", parlamentar=parlamentar, partido=partido)
return Filiacao.objects.first()
@pytest.mark.django_db(transaction=False)
def test_tipo_comissao_model():
- baker.make(TipoComissao,
- nome='Teste_Nome_Tipo_Comissao',
- natureza='T',
- sigla='TSTC')
+ baker.make(
+ TipoComissao, nome="Teste_Nome_Tipo_Comissao", natureza="T", sigla="TSTC"
+ )
tipo_comissao = TipoComissao.objects.first()
- assert tipo_comissao.nome == 'Teste_Nome_Tipo_Comissao'
- assert tipo_comissao.natureza == 'T'
- assert tipo_comissao.sigla == 'TSTC'
+ assert tipo_comissao.nome == "Teste_Nome_Tipo_Comissao"
+ assert tipo_comissao.natureza == "T"
+ assert tipo_comissao.sigla == "TSTC"
@pytest.mark.django_db(transaction=False)
@@ -65,67 +59,72 @@ def test_incluir_parlamentar_errors(admin_client):
comissao = make_comissao()
composicao = make_composicao(comissao)
- response = admin_client.post(reverse('sapl.comissoes:participacao_create',
- kwargs={'pk': composicao.pk}),
- {'salvar': 'salvar'},
- follow=True)
+ response = admin_client.post(
+ reverse("sapl.comissoes:participacao_create", kwargs={"pk": composicao.pk}),
+ {"salvar": "salvar"},
+ follow=True,
+ )
- assert (response.context_data['form'].errors['parlamentar'] ==
- ['Este campo é obrigatório.'])
- assert (response.context_data['form'].errors['cargo'] ==
- ['Este campo é obrigatório.'])
- assert (response.context_data['form'].errors['data_designacao'] ==
- ['Este campo é obrigatório.'])
+ assert response.context_data["form"].errors["parlamentar"] == [
+ "Este campo é obrigatório."
+ ]
+ assert response.context_data["form"].errors["cargo"] == [
+ "Este campo é obrigatório."
+ ]
+ assert response.context_data["form"].errors["data_designacao"] == [
+ "Este campo é obrigatório."
+ ]
@pytest.mark.django_db(transaction=False)
def test_incluir_comissao_submit(admin_client):
- tipo = baker.make(TipoComissao,
- sigla='T',
- nome='Teste')
-
- response = admin_client.post(reverse('sapl.comissoes:comissao_create'),
- {'tipo': tipo.pk,
- 'nome': 'Comissão Teste',
- 'sigla': 'CT',
- 'ativa': True,
- 'data_criacao': '2016-03-22',
- 'unidade_deliberativa': True,
- 'salvar': 'salvar'},
- follow=True)
+ tipo = baker.make(TipoComissao, sigla="T", nome="Teste")
+
+ response = admin_client.post(
+ reverse("sapl.comissoes:comissao_create"),
+ {
+ "tipo": tipo.pk,
+ "nome": "Comissão Teste",
+ "sigla": "CT",
+ "ativa": True,
+ "data_criacao": "2016-03-22",
+ "unidade_deliberativa": True,
+ "salvar": "salvar",
+ },
+ follow=True,
+ )
assert response.status_code == 200
-
+
comissao = Comissao.objects.first()
- assert comissao.nome == 'Comissão Teste'
+ assert comissao.nome == "Comissão Teste"
assert comissao.tipo == tipo
@pytest.mark.django_db(transaction=False)
def test_incluir_comissao_errors(admin_client):
+ response = admin_client.post(
+ reverse("sapl.comissoes:comissao_create"), {"salvar": "salvar"}, follow=True
+ )
- response = admin_client.post(reverse('sapl.comissoes:comissao_create'),
- {'salvar': 'salvar'},
- follow=True)
-
- assert (response.context_data['form'].errors['tipo'] ==
- ['Este campo é obrigatório.'])
- assert (response.context_data['form'].errors['nome'] ==
- ['Este campo é obrigatório.'])
- assert (response.context_data['form'].errors['sigla'] ==
- ['Este campo é obrigatório.'])
- assert (response.context_data['form'].errors['data_criacao'] ==
- ['Este campo é obrigatório.'])
+ assert response.context_data["form"].errors["tipo"] == ["Este campo é obrigatório."]
+ assert response.context_data["form"].errors["nome"] == ["Este campo é obrigatório."]
+ assert response.context_data["form"].errors["sigla"] == [
+ "Este campo é obrigatório."
+ ]
+ assert response.context_data["form"].errors["data_criacao"] == [
+ "Este campo é obrigatório."
+ ]
@pytest.mark.django_db(transaction=False)
def test_periodo_invalidas():
-
- form = forms.PeriodoForm(data={'data_inicio': '10/11/2017',
- 'data_fim': '09/11/2017'
- })
+ form = forms.PeriodoForm(
+ data={"data_inicio": "10/11/2017", "data_fim": "09/11/2017"}
+ )
assert not form.is_valid()
- assert form.errors['__all__'] == [_('A Data Final não pode ser menor que '
- 'a Data Inicial')]
+ assert form.errors["__all__"] == [
+ _("A Data Final não pode ser menor que " "a Data Inicial")
+ ]
@pytest.mark.django_db(transaction=False)
@@ -136,7 +135,7 @@ def test_valida_campos_obrigatorios_periodo_form():
errors = form.errors
- assert errors['data_inicio'] == [_('Este campo é obrigatório.')]
+ assert errors["data_inicio"] == [_("Este campo é obrigatório.")]
assert len(errors) == 1
@@ -149,11 +148,11 @@ def test_valida_campos_obrigatorios_reuniao_form():
errors = form.errors
- assert errors['comissao'] == [_('Este campo é obrigatório.')]
- assert errors['periodo'] == [_('Este campo é obrigatório.')]
- assert errors['numero'] == [_('Este campo é obrigatório.')]
- assert errors['nome'] == [_('Este campo é obrigatório.')]
- assert errors['data'] == [_('Este campo é obrigatório.')]
- assert errors['hora_inicio'] == [_('Este campo é obrigatório.')]
+ assert errors["comissao"] == [_("Este campo é obrigatório.")]
+ assert errors["periodo"] == [_("Este campo é obrigatório.")]
+ assert errors["numero"] == [_("Este campo é obrigatório.")]
+ assert errors["nome"] == [_("Este campo é obrigatório.")]
+ assert errors["data"] == [_("Este campo é obrigatório.")]
+ assert errors["hora_inicio"] == [_("Este campo é obrigatório.")]
assert len(errors) == 6
diff --git a/sapl/comissoes/urls.py b/sapl/comissoes/urls.py
index 2bb6bce65..cd1943677 100644
--- a/sapl/comissoes/urls.py
+++ b/sapl/comissoes/urls.py
@@ -1,30 +1,48 @@
from django.urls import include, path, re_path
-from sapl.comissoes.views import (AdicionaPautaView, CargoComissaoCrud, ComissaoCrud,
- ComposicaoCrud, DocumentoAcessorioCrud,
+
+from sapl.comissoes.views import (AdicionaPautaView, CargoComissaoCrud,
+ ComissaoCrud, ComposicaoCrud,
+ DocumentoAcessorioCrud,
MateriasTramitacaoListView, ParticipacaoCrud,
- get_participacoes_comissao, PeriodoComposicaoCrud,
- RemovePautaView, ReuniaoCrud, TipoComissaoCrud)
+ PeriodoComposicaoCrud, RemovePautaView,
+ ReuniaoCrud, TipoComissaoCrud,
+ get_participacoes_comissao)
from .apps import AppConfig
app_name = AppConfig.name
urlpatterns = [
- path('comissao/', include(ComissaoCrud.get_urls() +
- ComposicaoCrud.get_urls() +
- ReuniaoCrud.get_urls() +
- ParticipacaoCrud.get_urls() +
- DocumentoAcessorioCrud.get_urls())),
-
- path('comissao//materias-em-tramitacao',
- MateriasTramitacaoListView.as_view(), name='materias_em_tramitacao'),
-
- re_path(r'^comissao/(?P\d+)/pauta/add', AdicionaPautaView.as_view(), name='pauta_add'),
- re_path(r'^comissao/(?P\d+)/pauta/remove', RemovePautaView.as_view(), name='pauta_remove'),
-
- path('sistema/comissao/cargo/', include(CargoComissaoCrud.get_urls())),
- path('sistema/comissao/periodo-composicao/',
- include(PeriodoComposicaoCrud.get_urls())),
- path('sistema/comissao/tipo/', include(TipoComissaoCrud.get_urls())),
- re_path(r'^sistema/comissao/recupera-participacoes', get_participacoes_comissao),
+ path(
+ "comissao/",
+ include(
+ ComissaoCrud.get_urls()
+ + ComposicaoCrud.get_urls()
+ + ReuniaoCrud.get_urls()
+ + ParticipacaoCrud.get_urls()
+ + DocumentoAcessorioCrud.get_urls()
+ ),
+ ),
+ path(
+ "comissao//materias-em-tramitacao",
+ MateriasTramitacaoListView.as_view(),
+ name="materias_em_tramitacao",
+ ),
+ re_path(
+ r"^comissao/(?P\d+)/pauta/add",
+ AdicionaPautaView.as_view(),
+ name="pauta_add",
+ ),
+ re_path(
+ r"^comissao/(?P\d+)/pauta/remove",
+ RemovePautaView.as_view(),
+ name="pauta_remove",
+ ),
+ path("sistema/comissao/cargo/", include(CargoComissaoCrud.get_urls())),
+ path(
+ "sistema/comissao/periodo-composicao/",
+ include(PeriodoComposicaoCrud.get_urls()),
+ ),
+ path("sistema/comissao/tipo/", include(TipoComissaoCrud.get_urls())),
+ re_path(r"^sistema/comissao/recupera-participacoes", get_participacoes_comissao),
]
diff --git a/sapl/comissoes/views.py b/sapl/comissoes/views.py
index a53c1c21b..518395b03 100644
--- a/sapl/comissoes/views.py
+++ b/sapl/comissoes/views.py
@@ -2,16 +2,15 @@ import logging
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
-from django.urls import reverse
from django.db.models import F
from django.http.response import HttpResponseRedirect, JsonResponse
+from django.urls import reverse
+from django.utils.translation import gettext_lazy as _
from django.views.decorators.clickjacking import xframe_options_exempt
from django.views.generic import CreateView, DeleteView, FormView, ListView
from django.views.generic.base import RedirectView
from django.views.generic.detail import DetailView
from django.views.generic.edit import FormMixin, UpdateView
-from django.utils.translation import gettext_lazy as _
-
from django_filters.views import FilterView
from sapl.base.models import AppConfig as AppsAppConfig
@@ -19,13 +18,12 @@ from sapl.comissoes.apps import AppConfig
from sapl.comissoes.forms import (ComissaoForm, ComposicaoForm,
DocumentoAcessorioCreateForm,
DocumentoAcessorioEditForm,
- ParticipacaoCreateForm,
- ParticipacaoEditForm,
+ ParticipacaoCreateForm, ParticipacaoEditForm,
PautaReuniaoFilterSet, PautaReuniaoForm,
PeriodoForm, ReuniaoForm)
-from sapl.crud.base import (Crud, CrudAux, MasterDetailCrud,
- PermissionRequiredForAppCrudMixin, RP_DETAIL,
- RP_LIST)
+from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux,
+ MasterDetailCrud,
+ PermissionRequiredForAppCrudMixin)
from sapl.materia.models import (MateriaEmTramitacao, MateriaLegislativa,
PautaReuniao, Tramitacao)
from sapl.utils import show_results_filter_set
@@ -37,24 +35,26 @@ from .models import (CargoComissao, Comissao, Composicao, DocumentoAcessorio,
def pegar_url_composicao(pk):
participacao = Participacao.objects.get(id=pk)
comp_pk = participacao.composicao.pk
- url = reverse('sapl.comissoes:composicao_detail', kwargs={'pk': comp_pk})
+ url = reverse("sapl.comissoes:composicao_detail", kwargs={"pk": comp_pk})
return url
def pegar_url_reuniao(pk):
documentoacessorio = DocumentoAcessorio.objects.get(id=pk)
r_pk = documentoacessorio.reuniao.pk
- url = reverse('sapl.comissoes:reuniao_detail', kwargs={'pk': r_pk})
+ url = reverse("sapl.comissoes:reuniao_detail", kwargs={"pk": r_pk})
return url
+
CargoComissaoCrud = CrudAux.build(
- CargoComissao, 'cargo_comissao',
- list_field_names=['nome', 'id_ordenacao', 'unico']
+ CargoComissao, "cargo_comissao", list_field_names=["nome", "id_ordenacao", "unico"]
)
TipoComissaoCrud = CrudAux.build(
- TipoComissao, 'tipo_comissao', list_field_names=[
- 'sigla', 'nome', 'natureza', 'dispositivo_regimental'])
+ TipoComissao,
+ "tipo_comissao",
+ list_field_names=["sigla", "nome", "natureza", "dispositivo_regimental"],
+)
class PeriodoComposicaoCrud(CrudAux):
@@ -71,48 +71,55 @@ class PeriodoComposicaoCrud(CrudAux):
class ParticipacaoCrud(MasterDetailCrud):
model = Participacao
- parent_field = 'composicao__comissao'
- public = [RP_DETAIL, ]
+ parent_field = "composicao__comissao"
+ public = [
+ RP_DETAIL,
+ ]
ListView = None
link_return_to_parent_field = True
class BaseMixin(MasterDetailCrud.BaseMixin):
- list_field_names = ['composicao', 'parlamentar', 'cargo']
+ list_field_names = ["composicao", "parlamentar", "cargo"]
class CreateView(MasterDetailCrud.CreateView):
form_class = ParticipacaoCreateForm
def get_initial(self):
initial = super().get_initial()
- initial['parent_pk'] = self.kwargs['pk']
+ initial["parent_pk"] = self.kwargs["pk"]
return initial
class UpdateView(MasterDetailCrud.UpdateView):
- layout_key = 'ParticipacaoEdit'
+ layout_key = "ParticipacaoEdit"
form_class = ParticipacaoEditForm
class DeleteView(MasterDetailCrud.DeleteView):
-
def get_success_url(self):
composicao_comissao_pk = self.object.composicao.comissao.pk
composicao_pk = self.object.composicao.pk
- return '{}?pk={}'.format(reverse('sapl.comissoes:composicao_list',
- args=[composicao_comissao_pk]),
- composicao_pk)
+ return "{}?pk={}".format(
+ reverse(
+ "sapl.comissoes:composicao_list", args=[composicao_comissao_pk]
+ ),
+ composicao_pk,
+ )
class ComposicaoCrud(MasterDetailCrud):
model = Composicao
- parent_field = 'comissao'
- model_set = 'participacao_set'
- public = [RP_LIST, RP_DETAIL, ]
+ parent_field = "comissao"
+ model_set = "participacao_set"
+ public = [
+ RP_LIST,
+ RP_DETAIL,
+ ]
class CreateView(MasterDetailCrud.CreateView):
form_class = ComposicaoForm
def get_initial(self):
- comissao = Comissao.objects.get(id=self.kwargs['pk'])
- return {'comissao': comissao}
+ comissao = Comissao.objects.get(id=self.kwargs["pk"])
+ return {"comissao": comissao}
class ListView(MasterDetailCrud.ListView):
logger = logging.getLogger(__name__)
@@ -120,13 +127,19 @@ class ComposicaoCrud(MasterDetailCrud):
paginate_by = None
def take_composicao_pk(self):
-
username = self.request.user.username
try:
- self.logger.debug('user=' + username + '. Tentando obter pk da composição.')
- return int(self.request.GET['pk'])
+ self.logger.debug(
+ "user=" + username + ". Tentando obter pk da composição."
+ )
+ return int(self.request.GET["pk"])
except Exception as e:
- self.logger.error('user=' + username + '. Erro ao obter pk da composição. Retornado 0. ' + str(e))
+ self.logger.error(
+ "user="
+ + username
+ + ". Erro ao obter pk da composição. Retornado 0. "
+ + str(e)
+ )
return 0
def get_context_data(self, **kwargs):
@@ -137,17 +150,17 @@ class ComposicaoCrud(MasterDetailCrud):
if composicao_pk == 0:
# Composicao eh ordenada por Periodo, que por sua vez esta em
# ordem descrescente de data de inicio (issue #1920)
- ultima_composicao = context['composicao_list'].first()
+ ultima_composicao = context["composicao_list"].first()
if ultima_composicao:
- context['composicao_pk'] = ultima_composicao.pk
+ context["composicao_pk"] = ultima_composicao.pk
else:
- context['composicao_pk'] = 0
+ context["composicao_pk"] = 0
else:
- context['composicao_pk'] = composicao_pk
+ context["composicao_pk"] = composicao_pk
- context['participacao_set'] = Participacao.objects.filter(
- composicao__pk=context['composicao_pk']
- ).order_by('-titular', 'cargo__id_ordenacao', 'id')
+ context["participacao_set"] = Participacao.objects.filter(
+ composicao__pk=context["composicao_pk"]
+ ).order_by("-titular", "cargo__id_ordenacao", "id")
return context
class DeleteView(MasterDetailCrud.DeleteView):
@@ -155,18 +168,31 @@ class ComposicaoCrud(MasterDetailCrud):
composicao = self.get_object()
composicao.delete()
return HttpResponseRedirect(
- reverse('sapl.comissoes:composicao_list', kwargs={'pk': composicao.comissao.pk}))
+ reverse(
+ "sapl.comissoes:composicao_list",
+ kwargs={"pk": composicao.comissao.pk},
+ )
+ )
class ComissaoCrud(Crud):
model = Comissao
- help_topic = 'modulo_comissoes'
- public = [RP_LIST, RP_DETAIL, ]
+ help_topic = "modulo_comissoes"
+ public = [
+ RP_LIST,
+ RP_DETAIL,
+ ]
class BaseMixin(Crud.BaseMixin):
- list_field_names = ['nome', 'sigla', 'tipo',
- 'data_criacao', 'data_extincao', 'ativa']
- ordering = '-ativa', 'sigla'
+ list_field_names = [
+ "nome",
+ "sigla",
+ "tipo",
+ "data_criacao",
+ "data_extincao",
+ "ativa",
+ ]
+ ordering = "-ativa", "sigla"
class CreateView(Crud.CreateView):
form_class = ComissaoForm
@@ -185,8 +211,8 @@ class ComissaoCrud(Crud):
def lista_materias_comissao(comissao_pk):
materias = MateriaEmTramitacao.objects.filter(
tramitacao__unidade_tramitacao_destino__comissao=comissao_pk
- ).order_by('materia__tipo', '-materia__ano', '-materia__numero')
-
+ ).order_by("materia__tipo", "-materia__ano", "-materia__numero")
+
return materias
@@ -195,23 +221,25 @@ class MateriasTramitacaoListView(ListView):
paginate_by = 10
def get_queryset(self):
- return list(lista_materias_comissao(self.kwargs['pk']))
+ return list(lista_materias_comissao(self.kwargs["pk"]))
def get_context_data(self, **kwargs):
- context = super(
- MateriasTramitacaoListView, self).get_context_data(**kwargs)
- context['object'] = Comissao.objects.get(id=self.kwargs['pk'])
- context['qtde'] = len(self.object_list)
+ context = super(MateriasTramitacaoListView, self).get_context_data(**kwargs)
+ context["object"] = Comissao.objects.get(id=self.kwargs["pk"])
+ context["qtde"] = len(self.object_list)
return context
class ReuniaoCrud(MasterDetailCrud):
model = Reuniao
- parent_field = 'comissao'
- public = [RP_LIST, RP_DETAIL, ]
+ parent_field = "comissao"
+ public = [
+ RP_LIST,
+ RP_DETAIL,
+ ]
class BaseMixin(MasterDetailCrud.BaseMixin):
- list_field_names = ['data', 'nome', 'tema', 'upload_ata']
+ list_field_names = ["data", "nome", "tema", "upload_ata"]
class DetailView(MasterDetailCrud.DetailView):
template_name = "comissoes/reuniao_detail.html"
@@ -220,23 +248,25 @@ class ReuniaoCrud(MasterDetailCrud):
context = super().get_context_data(**kwargs)
docs = []
- documentos = DocumentoAcessorio.objects.filter(reuniao=self.kwargs['pk']).order_by('nome')
+ documentos = DocumentoAcessorio.objects.filter(
+ reuniao=self.kwargs["pk"]
+ ).order_by("nome")
docs.extend(documentos)
- context['docs'] = docs
- context['num_docs'] = len(docs)
+ context["docs"] = docs
+ context["num_docs"] = len(docs)
mats = []
- materias_pauta = PautaReuniao.objects.filter(reuniao=self.kwargs['pk'])
+ materias_pauta = PautaReuniao.objects.filter(reuniao=self.kwargs["pk"])
materias_pk = [materia_pauta.materia.pk for materia_pauta in materias_pauta]
-
- context['mats'] = MateriaLegislativa.objects.filter(
+
+ context["mats"] = MateriaLegislativa.objects.filter(
pk__in=materias_pk
- ).order_by('tipo', '-ano', 'numero')
- context['num_mats'] = len(context['mats'])
+ ).order_by("tipo", "-ano", "numero")
+ context["num_mats"] = len(context["mats"])
+
+ context["reuniao_pk"] = self.kwargs["pk"]
- context['reuniao_pk'] = self.kwargs['pk']
-
return context
class ListView(MasterDetailCrud.ListView):
@@ -244,13 +274,19 @@ class ReuniaoCrud(MasterDetailCrud):
paginate_by = 10
def take_reuniao_pk(self):
-
username = self.request.user.username
try:
- self.logger.debug('user=' + username + '. Tentando obter pk da reunião.')
- return int(self.request.GET['pk'])
+ self.logger.debug(
+ "user=" + username + ". Tentando obter pk da reunião."
+ )
+ return int(self.request.GET["pk"])
except Exception as e:
- self.logger.error('user=' + username + '. Erro ao obter pk da reunião. Retornado 0. ' + str(e))
+ self.logger.error(
+ "user="
+ + username
+ + ". Erro ao obter pk da reunião. Retornado 0. "
+ + str(e)
+ )
return 0
def get_context_data(self, **kwargs):
@@ -259,176 +295,183 @@ class ReuniaoCrud(MasterDetailCrud):
reuniao_pk = self.take_reuniao_pk()
if reuniao_pk == 0:
- ultima_reuniao = list(context['reuniao_list'])
+ ultima_reuniao = list(context["reuniao_list"])
if len(ultima_reuniao) > 0:
ultimo = ultima_reuniao[-1]
- context['reuniao_pk'] = ultimo.pk
+ context["reuniao_pk"] = ultimo.pk
else:
- context['reuniao_pk'] = 0
+ context["reuniao_pk"] = 0
else:
- context['reuniao_pk'] = reuniao_pk
+ context["reuniao_pk"] = reuniao_pk
- context['documentoacessorio_set'] = DocumentoAcessorio.objects.filter(
- reuniao__pk=context['reuniao_pk']
- ).order_by('id')
+ context["documentoacessorio_set"] = DocumentoAcessorio.objects.filter(
+ reuniao__pk=context["reuniao_pk"]
+ ).order_by("id")
return context
class UpdateView(MasterDetailCrud.UpdateView):
form_class = ReuniaoForm
def get_initial(self):
- return {'comissao': self.object.comissao}
+ return {"comissao": self.object.comissao}
class CreateView(MasterDetailCrud.CreateView):
form_class = ReuniaoForm
def get_initial(self):
- comissao = Comissao.objects.get(id=self.kwargs['pk'])
+ comissao = Comissao.objects.get(id=self.kwargs["pk"])
- return {'comissao': comissao}
+ return {"comissao": comissao}
class RemovePautaView(PermissionRequiredMixin, CreateView):
model = PautaReuniao
form_class = PautaReuniaoForm
- template_name = 'comissoes/pauta.html'
- permission_required = ('comissoes.add_reuniao', )
+ template_name = "comissoes/pauta.html"
+ permission_required = ("comissoes.add_reuniao",)
def get_context_data(self, **kwargs):
- context = super(
- RemovePautaView, self
- ).get_context_data(**kwargs)
+ context = super(RemovePautaView, self).get_context_data(**kwargs)
# Remove = 0; Adiciona = 1
- context['opcao'] = 0
+ context["opcao"] = 0
- context['object'] = Reuniao.objects.get(pk=self.kwargs['pk'])
- context['root_pk'] = context['object'].comissao.pk
+ context["object"] = Reuniao.objects.get(pk=self.kwargs["pk"])
+ context["root_pk"] = context["object"].comissao.pk
- materias_pauta = PautaReuniao.objects.filter(reuniao=context['object'])
+ materias_pauta = PautaReuniao.objects.filter(reuniao=context["object"])
materias_pk = [materia_pauta.materia.pk for materia_pauta in materias_pauta]
-
- context['materias'] = MateriaLegislativa.objects.filter(
+
+ context["materias"] = MateriaLegislativa.objects.filter(
pk__in=materias_pk
- ).order_by('tipo', '-ano', 'numero')
- context['numero_materias'] = len(context['materias'])
+ ).order_by("tipo", "-ano", "numero")
+ context["numero_materias"] = len(context["materias"])
return context
def post(self, request, *args, **kwargs):
- success_url = reverse('sapl.comissoes:reuniao_detail', kwargs={'pk':kwargs['pk']})
- marcadas = request.POST.getlist('materia_id')
+ success_url = reverse(
+ "sapl.comissoes:reuniao_detail", kwargs={"pk": kwargs["pk"]}
+ )
+ marcadas = request.POST.getlist("materia_id")
if not marcadas:
- msg=_('Nenhuma matéria foi selecionada.')
+ msg = _("Nenhuma matéria foi selecionada.")
messages.add_message(request, messages.WARNING, msg)
return HttpResponseRedirect(success_url)
- reuniao = Reuniao.objects.get(pk=kwargs['pk'])
+ reuniao = Reuniao.objects.get(pk=kwargs["pk"])
for materia in MateriaLegislativa.objects.filter(id__in=marcadas):
- PautaReuniao.objects.filter(reuniao=reuniao,materia=materia).delete()
+ PautaReuniao.objects.filter(reuniao=reuniao, materia=materia).delete()
- msg=_('Matéria(s) removida(s) com sucesso!')
+ msg = _("Matéria(s) removida(s) com sucesso!")
messages.add_message(request, messages.SUCCESS, msg)
return HttpResponseRedirect(success_url)
class AdicionaPautaView(PermissionRequiredMixin, FilterView):
filterset_class = PautaReuniaoFilterSet
- template_name = 'comissoes/pauta.html'
- permission_required = ('comissoes.add_reuniao', )
+ template_name = "comissoes/pauta.html"
+ permission_required = ("comissoes.add_reuniao",)
def get_context_data(self, **kwargs):
- context = super(
- AdicionaPautaView, self
- ).get_context_data(**kwargs)
+ context = super(AdicionaPautaView, self).get_context_data(**kwargs)
# Adiciona = 1; Remove = 0
- context['opcao'] = 1
+ context["opcao"] = 1
- context['object'] = Reuniao.objects.get(pk=self.kwargs['pk'])
- context['root_pk'] = context['object'].comissao.pk
+ context["object"] = Reuniao.objects.get(pk=self.kwargs["pk"])
+ context["root_pk"] = context["object"].comissao.pk
qr = self.request.GET.copy()
- materias_pauta = PautaReuniao.objects.filter(reuniao=context['object'])
+ materias_pauta = PautaReuniao.objects.filter(reuniao=context["object"])
nao_listar = [mp.materia.pk for mp in materias_pauta]
if not len(qr):
- context['object_list'] = []
+ context["object_list"] = []
else:
- context['object_list'] = context['object_list'].filter(
- tramitacao__unidade_tramitacao_destino__comissao=context['root_pk']
- ).exclude(materia__pk__in=nao_listar).order_by(
- "materia__tipo", "-materia__ano", "materia__numero"
+ context["object_list"] = (
+ context["object_list"]
+ .filter(
+ tramitacao__unidade_tramitacao_destino__comissao=context["root_pk"]
+ )
+ .exclude(materia__pk__in=nao_listar)
+ .order_by("materia__tipo", "-materia__ano", "materia__numero")
)
- context['numero_resultados'] = len(context['object_list'])
- context['show_results'] = show_results_filter_set(qr)
+ context["numero_resultados"] = len(context["object_list"])
+ context["show_results"] = show_results_filter_set(qr)
return context
-
+
def post(self, request, *args, **kwargs):
- success_url = reverse('sapl.comissoes:reuniao_detail', kwargs={'pk':kwargs['pk']})
- marcadas = request.POST.getlist('materia_id')
+ success_url = reverse(
+ "sapl.comissoes:reuniao_detail", kwargs={"pk": kwargs["pk"]}
+ )
+ marcadas = request.POST.getlist("materia_id")
if not marcadas:
- msg = _('Nenhuma máteria foi selecionada.')
+ msg = _("Nenhuma máteria foi selecionada.")
messages.add_message(request, messages.WARNING, msg)
return HttpResponseRedirect(success_url)
-
- reuniao = Reuniao.objects.get(pk=kwargs['pk'])
+
+ reuniao = Reuniao.objects.get(pk=kwargs["pk"])
pautas = []
for materia in MateriaLegislativa.objects.filter(id__in=marcadas):
- pauta = PautaReuniao()
- pauta.reuniao = reuniao
- pauta.materia = materia
- pautas.append(pauta)
+ pauta = PautaReuniao()
+ pauta.reuniao = reuniao
+ pauta.materia = materia
+ pautas.append(pauta)
PautaReuniao.objects.bulk_create(pautas)
-
- msg = _('Matéria(s) adicionada(s) com sucesso!')
+
+ msg = _("Matéria(s) adicionada(s) com sucesso!")
messages.add_message(request, messages.SUCCESS, msg)
return HttpResponseRedirect(success_url)
class DocumentoAcessorioCrud(MasterDetailCrud):
model = DocumentoAcessorio
- parent_field = 'reuniao__comissao'
- public = [RP_DETAIL, ]
+ parent_field = "reuniao__comissao"
+ public = [
+ RP_DETAIL,
+ ]
ListView = None
link_return_to_parent_field = True
class BaseMixin(MasterDetailCrud.BaseMixin):
- list_field_names = ['nome', 'tipo', 'data', 'autor', 'arquivo']
+ list_field_names = ["nome", "tipo", "data", "autor", "arquivo"]
class CreateView(MasterDetailCrud.CreateView):
form_class = DocumentoAcessorioCreateForm
def get_initial(self):
initial = super().get_initial()
- initial['parent_pk'] = self.kwargs['pk']
+ initial["parent_pk"] = self.kwargs["pk"]
return initial
class UpdateView(MasterDetailCrud.UpdateView):
- layout_key = 'DocumentoAcessorioEdit'
+ layout_key = "DocumentoAcessorioEdit"
form_class = DocumentoAcessorioEditForm
class DeleteView(MasterDetailCrud.DeleteView):
-
def delete(self, *args, **kwargs):
obj = self.get_object()
obj.delete()
return HttpResponseRedirect(
- reverse('sapl.comissoes:reuniao_detail',
- kwargs={'pk': obj.reuniao.pk}))
+ reverse("sapl.comissoes:reuniao_detail", kwargs={"pk": obj.reuniao.pk})
+ )
def get_participacoes_comissao(request):
parlamentares = []
- composicao_id = request.GET.get('composicao_id')
+ composicao_id = request.GET.get("composicao_id")
if composicao_id:
- parlamentares = [{'nome': p.parlamentar.nome_parlamentar, 'id': p.parlamentar.id} for p in
- Participacao.objects.filter(composicao_id=composicao_id).order_by(
- 'parlamentar__nome_parlamentar')]
+ parlamentares = [
+ {"nome": p.parlamentar.nome_parlamentar, "id": p.parlamentar.id}
+ for p in Participacao.objects.filter(composicao_id=composicao_id).order_by(
+ "parlamentar__nome_parlamentar"
+ )
+ ]
return JsonResponse(parlamentares, safe=False)
diff --git a/sapl/compilacao/admin.py b/sapl/compilacao/admin.py
index 6f1ffbd5a..512e4eb0b 100644
--- a/sapl/compilacao/admin.py
+++ b/sapl/compilacao/admin.py
@@ -1,4 +1,5 @@
from django.contrib import admin
+
from sapl.compilacao.models import TipoDispositivo
from sapl.utils import register_all_models_in_admin
@@ -8,5 +9,8 @@ admin.site.unregister(TipoDispositivo)
@admin.register(TipoDispositivo)
class TipoDispositivoAdmin(admin.ModelAdmin):
- readonly_fields = ("rotulo_prefixo_texto", "rotulo_sufixo_texto",)
- list_display = [f.name for f in TipoDispositivo._meta.fields if f.name != 'id']
+ readonly_fields = (
+ "rotulo_prefixo_texto",
+ "rotulo_sufixo_texto",
+ )
+ list_display = [f.name for f in TipoDispositivo._meta.fields if f.name != "id"]
diff --git a/sapl/compilacao/apps.py b/sapl/compilacao/apps.py
index f786fb36b..fda4ef482 100644
--- a/sapl/compilacao/apps.py
+++ b/sapl/compilacao/apps.py
@@ -1,4 +1,3 @@
-
from django import apps
from django.conf import settings
from django.db import connection, models
@@ -7,36 +6,39 @@ from django.utils.translation import gettext_lazy as _
class AppConfig(apps.AppConfig):
- name = 'sapl.compilacao'
- label = 'compilacao'
- verbose_name = _('Compilação')
+ name = "sapl.compilacao"
+ label = "compilacao"
+ verbose_name = _("Compilação")
@staticmethod
def import_pattern():
+ from django.contrib.contenttypes.models import ContentType
+ from unipath import Path
from sapl.compilacao.models import TipoTextoArticulado
from sapl.compilacao.utils import get_integrations_view_names
- from django.contrib.contenttypes.models import ContentType
- from unipath import Path
-
compilacao_app = Path(__file__).ancestor(1)
# print(compilacao_app)
- with open(compilacao_app + '/compilacao_data_tables.sql', 'r') as f:
+ with open(compilacao_app + "/compilacao_data_tables.sql", "r") as f:
lines = f.readlines()
- lines = [line.rstrip('\n') for line in lines]
+ lines = [line.rstrip("\n") for line in lines]
with connection.cursor() as cursor:
for line in lines:
line = line.strip()
- if not line or line.startswith('#'):
+ if not line or line.startswith("#"):
continue
try:
cursor.execute(line)
except IntegrityError as e:
if not settings.DEBUG:
- print("{} {} {}".format(_('Ocorreu erro na importação:'), line, str(e)))
+ print(
+ "{} {} {}".format(
+ _("Ocorreu erro na importação:"), line, str(e)
+ )
+ )
except Exception as ee:
print(ee)
@@ -46,12 +48,12 @@ class AppConfig(apps.AppConfig):
verbose_name = verbose_name.upper().split()
if len(verbose_name) == 1:
verbose_name = verbose_name[0]
- sigla = ''
+ sigla = ""
for letra in verbose_name:
- if letra in 'BCDFGHJKLMNPQRSTVWXYZ':
+ if letra in "BCDFGHJKLMNPQRSTVWXYZ":
sigla += letra
else:
- sigla = ''.join([palavra[0] for palavra in verbose_name])
+ sigla = "".join([palavra[0] for palavra in verbose_name])
return sigla[:3]
for view in integrations_view_names:
@@ -60,28 +62,31 @@ class AppConfig(apps.AppConfig):
tipo.sigla = cria_sigla(
view.model._meta.verbose_name
if view.model._meta.verbose_name
- else view.model._meta.model_name)
+ else view.model._meta.model_name
+ )
tipo.descricao = view.model._meta.verbose_name
tipo.content_type = ContentType.objects.get_by_natural_key(
- view.model._meta.app_label, view.model._meta.model_name)
+ view.model._meta.app_label, view.model._meta.model_name
+ )
tipo.save()
except IntegrityError as e:
if not settings.DEBUG:
- print("{} {}".format(_('Ocorreu erro na criação tipo de ta:'), str(e)))
-
+ print(
+ "{} {}".format(_("Ocorreu erro na criação tipo de ta:"), str(e))
+ )
-def init_compilacao_base(app_config, verbosity=2, interactive=True,
- using=DEFAULT_DB_ALIAS, **kwargs):
+def init_compilacao_base(
+ app_config, verbosity=2, interactive=True, using=DEFAULT_DB_ALIAS, **kwargs
+):
if app_config != AppConfig and not isinstance(app_config, AppConfig):
return
from sapl.compilacao.models import TipoDispositivo
- if not TipoDispositivo.objects.exists():
- print('')
- print("\033[93m\033[1m{}\033[0m".format(_('Iniciando Textos Articulados...')))
+ if not TipoDispositivo.objects.exists():
+ print("")
+ print("\033[93m\033[1m{}\033[0m".format(_("Iniciando Textos Articulados...")))
AppConfig.import_pattern()
-models.signals.post_migrate.connect(
- receiver=init_compilacao_base)
+models.signals.post_migrate.connect(receiver=init_compilacao_base)
diff --git a/sapl/compilacao/forms.py b/sapl/compilacao/forms.py
index 390107fb5..99fdbf4b5 100644
--- a/sapl/compilacao/forms.py
+++ b/sapl/compilacao/forms.py
@@ -24,8 +24,8 @@ from sapl.compilacao.models import (NOTAS_PUBLICIDADE_CHOICES,
TipoTextoArticulado, TipoVide,
VeiculoPublicacao, Vide)
from sapl.compilacao.utils import DISPOSITIVO_SELECT_RELATED
-from sapl.crispy_layout_mixin import SaplFormHelper
-from sapl.crispy_layout_mixin import SaplFormLayout, to_column, to_row
+from sapl.crispy_layout_mixin import (SaplFormHelper, SaplFormLayout,
+ to_column, to_row)
from sapl.utils import YES_NO_CHOICES, FileFieldCheckMixin
@@ -35,90 +35,96 @@ class CustomImageCropWidget(ImageCropWidget):
We use this trick, and place it right under the CropWidget so that
it looks like the user is seeing the image and clearing the image.
"""
+
template_with_initial = (
# '%(initial_text)s: %(initial)s '
- '%(clear_template)s %(input_text)s: %(input)s'
+ "%(clear_template)s %(input_text)s: %(input)s"
)
error_messages = {
- 'required': _('Este campo é obrigatório'),
- 'invalid': _('URL inválida.')
+ "required": _("Este campo é obrigatório"),
+ "invalid": _("URL inválida."),
}
ta_error_messages = {
- 'required': _('Este campo é obrigatório'),
+ "required": _("Este campo é obrigatório"),
}
class TipoTaForm(ModelForm):
sigla = forms.CharField(
- label=TipoTextoArticulado._meta.get_field(
- 'sigla').verbose_name)
+ label=TipoTextoArticulado._meta.get_field("sigla").verbose_name
+ )
descricao = forms.CharField(
- label=TipoTextoArticulado._meta.get_field(
- 'descricao').verbose_name)
+ label=TipoTextoArticulado._meta.get_field("descricao").verbose_name
+ )
participacao_social = forms.ChoiceField(
- label=TipoTextoArticulado._meta.get_field(
- 'participacao_social').verbose_name,
+ label=TipoTextoArticulado._meta.get_field("participacao_social").verbose_name,
choices=YES_NO_CHOICES,
widget=forms.RadioSelect(),
- required=True)
+ required=True,
+ )
publicacao_func = forms.ChoiceField(
- label=TipoTextoArticulado._meta.get_field(
- 'publicacao_func').verbose_name,
+ label=TipoTextoArticulado._meta.get_field("publicacao_func").verbose_name,
choices=YES_NO_CHOICES,
widget=forms.RadioSelect(),
- required=True)
+ required=True,
+ )
rodape_global = forms.CharField(
- label=TipoTextoArticulado._meta.get_field(
- 'rodape_global').verbose_name,
- widget=forms.Textarea(attrs={'id': 'texto-rico'}),
- required=False
+ label=TipoTextoArticulado._meta.get_field("rodape_global").verbose_name,
+ widget=forms.Textarea(attrs={"id": "texto-rico"}),
+ required=False,
)
class Meta:
model = TipoTextoArticulado
- fields = ['sigla',
- 'descricao',
- 'content_type',
- 'participacao_social',
- 'publicacao_func',
- 'perfis',
- 'rodape_global'
- ]
-
- widgets = {'perfis': widgets.CheckboxSelectMultiple(),
- 'rodape_global': forms.Textarea}
+ fields = [
+ "sigla",
+ "descricao",
+ "content_type",
+ "participacao_social",
+ "publicacao_func",
+ "perfis",
+ "rodape_global",
+ ]
+
+ widgets = {
+ "perfis": widgets.CheckboxSelectMultiple(),
+ "rodape_global": forms.Textarea,
+ }
def __init__(self, *args, **kwargs):
+ row1 = to_row(
+ [
+ ("sigla", 3),
+ ("descricao", 5),
+ ("content_type", 4),
+ ]
+ )
+ row2 = to_row(
+ [
+ (InlineRadios("participacao_social"), 3),
+ (InlineRadios("publicacao_func"), 3),
+ ("perfis", 12),
+ ]
+ )
- row1 = to_row([
- ('sigla', 3),
- ('descricao', 5),
- ('content_type', 4),
- ])
- row2 = to_row([
- (InlineRadios('participacao_social'), 3),
- (InlineRadios('publicacao_func'), 3),
- ('perfis', 12),
- ])
-
- row3 = to_row([
- ('rodape_global', 12),
- ])
+ row3 = to_row(
+ [
+ ("rodape_global", 12),
+ ]
+ )
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- Fieldset(_('Identificação Básica'),
- row1, css_class="col-md-12"),
- Fieldset(_('Funcionalidades'),
- row2, css_class="col-md-12"),
- Fieldset(_('Nota de Rodapé Global'),
- row3, css_class="col-md-12"))
+ Fieldset(_("Identificação Básica"), row1, css_class="col-md-12"),
+ Fieldset(_("Funcionalidades"), row2, css_class="col-md-12"),
+ Fieldset(_("Nota de Rodapé Global"), row3, css_class="col-md-12"),
+ )
super(TipoTaForm, self).__init__(*args, **kwargs)
@@ -127,194 +133,206 @@ class TaForm(ModelForm):
label=TipoTextoArticulado._meta.verbose_name,
queryset=TipoTextoArticulado.objects.all(),
required=True,
- empty_label=None)
+ empty_label=None,
+ )
numero = forms.CharField(
- label=TextoArticulado._meta.get_field(
- 'numero').verbose_name,
- required=True)
+ label=TextoArticulado._meta.get_field("numero").verbose_name, required=True
+ )
ano = forms.IntegerField(
- label=TextoArticulado._meta.get_field(
- 'ano').verbose_name,
- required=True)
+ label=TextoArticulado._meta.get_field("ano").verbose_name, required=True
+ )
data = forms.DateField(
- label=TextoArticulado._meta.get_field(
- 'data').verbose_name,
- input_formats=['%d/%m/%Y'],
+ label=TextoArticulado._meta.get_field("data").verbose_name,
+ input_formats=["%d/%m/%Y"],
required=True,
- widget=forms.DateInput(
- format='%d/%m/%Y'),
- error_messages=ta_error_messages
+ widget=forms.DateInput(format="%d/%m/%Y"),
+ error_messages=ta_error_messages,
)
ementa = forms.CharField(
- label='',
- widget=forms.Textarea,
- error_messages=ta_error_messages)
+ label="", widget=forms.Textarea, error_messages=ta_error_messages
+ )
observacao = forms.CharField(
- label='',
+ label="",
widget=forms.Textarea,
error_messages=ta_error_messages,
- required=False)
+ required=False,
+ )
participacao_social = forms.NullBooleanField(
- label=TextoArticulado._meta.get_field(
- 'participacao_social').verbose_name,
+ label=TextoArticulado._meta.get_field("participacao_social").verbose_name,
widget=forms.Select(choices=PARTICIPACAO_SOCIAL_CHOICES),
- required=False)
+ required=False,
+ )
class Meta:
model = TextoArticulado
- fields = ['tipo_ta',
- 'numero',
- 'ano',
- 'data',
- 'ementa',
- 'observacao',
- 'participacao_social',
- ]
+ fields = [
+ "tipo_ta",
+ "numero",
+ "ano",
+ "data",
+ "ementa",
+ "observacao",
+ "participacao_social",
+ ]
def __init__(self, *args, **kwargs):
-
- row1 = to_row([
- ('tipo_ta', 3),
- ('numero', 2),
- ('ano', 2),
- ('data', 2),
- ('participacao_social', 3),
- ])
+ row1 = to_row(
+ [
+ ("tipo_ta", 3),
+ ("numero", 2),
+ ("ano", 2),
+ ("data", 2),
+ ("participacao_social", 3),
+ ]
+ )
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- Fieldset(_('Identificação Básica'), row1, css_class="col-md-12"),
+ Fieldset(_("Identificação Básica"), row1, css_class="col-md-12"),
Fieldset(
- TextoArticulado._meta.get_field('ementa').verbose_name,
- Column('ementa'), css_class="col-md-12"),
+ TextoArticulado._meta.get_field("ementa").verbose_name,
+ Column("ementa"),
+ css_class="col-md-12",
+ ),
Fieldset(
- TextoArticulado._meta.get_field('observacao').verbose_name,
- Column('observacao'), css_class="col-md-12"),
-
+ TextoArticulado._meta.get_field("observacao").verbose_name,
+ Column("observacao"),
+ css_class="col-md-12",
+ ),
)
super(TaForm, self).__init__(*args, **kwargs)
- instance = getattr(self, 'instance', None)
+ instance = getattr(self, "instance", None)
if instance and instance.pk:
- self.fields['tipo_ta'].widget.attrs['disabled'] = True
- self.fields['tipo_ta'].required = False
+ self.fields["tipo_ta"].widget.attrs["disabled"] = True
+ self.fields["tipo_ta"].required = False
def clean_tipo_ta(self):
- instance = getattr(self, 'instance', None)
+ instance = getattr(self, "instance", None)
if instance and instance.pk:
return instance.tipo_ta
else:
- return self.cleaned_data['tipo_ta']
+ return self.cleaned_data["tipo_ta"]
class NotaForm(ModelForm):
-
titulo = forms.CharField(
- label=Nota._meta.get_field('titulo').verbose_name, required=False)
+ label=Nota._meta.get_field("titulo").verbose_name, required=False
+ )
texto = forms.CharField(
- label=Nota._meta.get_field('texto').verbose_name,
+ label=Nota._meta.get_field("texto").verbose_name,
widget=forms.Textarea,
- error_messages=error_messages)
+ error_messages=error_messages,
+ )
url_externa = forms.URLField(
- label=Nota._meta.get_field('url_externa').verbose_name,
+ label=Nota._meta.get_field("url_externa").verbose_name,
required=False,
- error_messages=error_messages)
+ error_messages=error_messages,
+ )
publicidade = forms.ChoiceField(
required=True,
- label=Nota._meta.get_field('publicidade').verbose_name,
+ label=Nota._meta.get_field("publicidade").verbose_name,
choices=NOTAS_PUBLICIDADE_CHOICES,
- widget=forms.Select(attrs={'class': 'selector'}))
+ widget=forms.Select(attrs={"class": "selector"}),
+ )
tipo = forms.ModelChoiceField(
- label=Nota._meta.get_field('tipo').verbose_name,
+ label=Nota._meta.get_field("tipo").verbose_name,
queryset=TipoNota.objects.all(),
- empty_label=None)
+ empty_label=None,
+ )
publicacao = forms.DateField(
- label=Nota._meta.get_field('publicacao').verbose_name,
- input_formats=['%d/%m/%Y', '%d%m%Y'],
+ label=Nota._meta.get_field("publicacao").verbose_name,
+ input_formats=["%d/%m/%Y", "%d%m%Y"],
required=True,
- widget=forms.DateInput(
- format='%d/%m/%Y'),
- error_messages=error_messages
+ widget=forms.DateInput(format="%d/%m/%Y"),
+ error_messages=error_messages,
)
efetividade = forms.DateField(
- label=Nota._meta.get_field('efetividade').verbose_name,
- input_formats=['%d/%m/%Y', '%d%m%Y'],
+ label=Nota._meta.get_field("efetividade").verbose_name,
+ input_formats=["%d/%m/%Y", "%d%m%Y"],
required=True,
- widget=forms.DateInput(
- format='%d/%m/%Y'),
- error_messages=error_messages)
- dispositivo = forms.ModelChoiceField(queryset=Dispositivo.objects.all(),
- widget=forms.HiddenInput())
- pk = forms.IntegerField(widget=forms.HiddenInput(),
- required=False)
+ widget=forms.DateInput(format="%d/%m/%Y"),
+ error_messages=error_messages,
+ )
+ dispositivo = forms.ModelChoiceField(
+ queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()
+ )
+ pk = forms.IntegerField(widget=forms.HiddenInput(), required=False)
class Meta:
model = Nota
- fields = ['titulo',
- 'texto',
- 'url_externa',
- 'publicidade',
- 'publicacao',
- 'efetividade',
- 'tipo',
- 'dispositivo',
- 'pk'
- ]
+ fields = [
+ "titulo",
+ "texto",
+ "url_externa",
+ "publicidade",
+ "publicacao",
+ "efetividade",
+ "tipo",
+ "dispositivo",
+ "pk",
+ ]
def __init__(self, *args, **kwargs):
-
- row1 = to_row([
- ('tipo', 4),
- ])
+ row1 = to_row(
+ [
+ ("tipo", 4),
+ ]
+ )
row1.append(
Column(
- Field(
- 'titulo',
- placeholder=_('Título da Nota (opcional)')
- ),
- css_class='col-md-8'))
+ Field("titulo", placeholder=_("Título da Nota (opcional)")),
+ css_class="col-md-8",
+ )
+ )
- row3 = to_row([
- ('publicidade', 6),
- ('publicacao', 3),
- ('efetividade', 3),
- ('dispositivo', 0),
- ('pk', 0),
- ])
+ row3 = to_row(
+ [
+ ("publicidade", 6),
+ ("publicacao", 3),
+ ("efetividade", 3),
+ ("dispositivo", 0),
+ ("pk", 0),
+ ]
+ )
buttons = FormActions(
*[
- HTML('%s' % _('Cancelar'))
+ HTML(
+ '%s' % _("Cancelar")
+ )
],
- Button(
- 'submit-form',
- 'Salvar',
- css_class='btn btn-primary float-right'),
- css_class='form-group row justify-content-between mr-1 ml-1'
+ Button("submit-form", "Salvar", css_class="btn btn-primary float-right"),
+ css_class="form-group row justify-content-between mr-1 ml-1"
)
self.helper = SaplFormHelper()
self.helper.layout = Layout(
-
Div(
- Div(HTML(_('Notas')), css_class='card-header bg-light'),
+ Div(HTML(_("Notas")), css_class="card-header bg-light"),
Div(
row1,
- to_row([(Field(
- 'texto',
- placeholder=_('Adicionar Nota')), 12)]),
- to_row([(Field(
- 'url_externa',
- placeholder=_('URL Externa (opcional)')), 12)]),
+ to_row([(Field("texto", placeholder=_("Adicionar Nota")), 12)]),
+ to_row(
+ [
+ (
+ Field(
+ "url_externa",
+ placeholder=_("URL Externa (opcional)"),
+ ),
+ 12,
+ )
+ ]
+ ),
row3,
to_row([(buttons, 12)]),
- css_class="card-body"
+ css_class="card-body",
),
- css_class="card"
+ css_class="card",
)
)
@@ -323,333 +341,353 @@ class NotaForm(ModelForm):
class VideForm(ModelForm):
dispositivo_base = forms.ModelChoiceField(
- queryset=Dispositivo.objects.all(),
- widget=forms.HiddenInput())
+ queryset=Dispositivo.objects.all(), widget=forms.HiddenInput()
+ )
dispositivo_ref = forms.ModelChoiceField(
- label=Vide._meta.get_field(
- 'dispositivo_ref').verbose_name,
- queryset=Dispositivo.objects.all())
+ label=Vide._meta.get_field("dispositivo_ref").verbose_name,
+ queryset=Dispositivo.objects.all(),
+ )
tipo = forms.ModelChoiceField(
label=TipoVide._meta.verbose_name,
queryset=TipoVide.objects.all(),
required=True,
- error_messages=error_messages)
+ error_messages=error_messages,
+ )
texto = forms.CharField(
required=False,
- label=Vide._meta.get_field(
- 'texto').verbose_name,
- widget=forms.Textarea())
+ label=Vide._meta.get_field("texto").verbose_name,
+ widget=forms.Textarea(),
+ )
pk = forms.IntegerField(widget=forms.HiddenInput(), required=False)
class Meta:
model = Vide
- fields = ['dispositivo_base',
- 'dispositivo_ref',
- 'texto',
- 'tipo',
- 'pk']
+ fields = ["dispositivo_base", "dispositivo_ref", "texto", "tipo", "pk"]
error_messages = {
NON_FIELD_ERRORS: {
- 'unique_together':
- _("Ja existe um Vide deste tipo para o Dispositivo Referido "),
+ "unique_together": _(
+ "Ja existe um Vide deste tipo para o Dispositivo Referido "
+ ),
}
}
def __init__(self, *args, **kwargs):
-
buttons = FormActions(
*[
- HTML('%s' % _('Cancelar'))
+ HTML(
+ '%s' % _("Cancelar")
+ )
],
- Button(
- 'submit-form',
- 'Salvar',
- css_class='btn btn-primary float-right'),
- css_class='form-group row justify-content-between mr-1 ml-1'
+ Button("submit-form", "Salvar", css_class="btn btn-primary float-right"),
+ css_class="form-group row justify-content-between mr-1 ml-1"
)
dispositivo_ref = Field(
- 'dispositivo_ref',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_ref',
- data_type_selection='radio',
- template="compilacao/layout/dispositivo_radio.html")
+ "dispositivo_ref",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_ref",
+ data_type_selection="radio",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
fields_form = []
- fields_form.append(Div(
- Row(to_column((Field(
- 'tipo',
- placeholder=_('Selecione um Tipo de Vide')), 12))),
- Row(to_column((dispositivo_ref, 12))),
- Row(to_column((buttons, 12)))))
-
- fields_form.append(Div(
- Row(to_column((Field(
- 'texto',
- placeholder=_('Texto Adicional ao Vide')), 12)))))
+ fields_form.append(
+ Div(
+ Row(
+ to_column(
+ (Field("tipo", placeholder=_("Selecione um Tipo de Vide")), 12)
+ )
+ ),
+ Row(to_column((dispositivo_ref, 12))),
+ Row(to_column((buttons, 12))),
+ )
+ )
+
+ fields_form.append(
+ Div(
+ Row(
+ to_column(
+ (Field("texto", placeholder=_("Texto Adicional ao Vide")), 12)
+ )
+ )
+ )
+ )
self.helper = SaplFormHelper()
self.helper.layout = Layout(
Div(
- Div(HTML(_('Vides')), css_class='card-header bg-light'),
+ Div(HTML(_("Vides")), css_class="card-header bg-light"),
Div(
to_column((fields_form[0], 6)),
to_column((fields_form[1], 6)),
- to_column(('dispositivo_base', 0)),
- to_column(('pk', 0)),
- css_class="card-body row"
+ to_column(("dispositivo_base", 0)),
+ to_column(("pk", 0)),
+ css_class="card-body row",
),
- css_class="card"
+ css_class="card",
)
)
super(VideForm, self).__init__(*args, **kwargs)
- self.fields['dispositivo_ref'].choices = []
+ self.fields["dispositivo_ref"].choices = []
if self.instance and self.instance.dispositivo_ref_id:
- self.fields['dispositivo_ref'].choices = [
- (self.instance.dispositivo_ref.pk,
- self.instance.dispositivo_ref)]
+ self.fields["dispositivo_ref"].choices = [
+ (self.instance.dispositivo_ref.pk, self.instance.dispositivo_ref)
+ ]
class PublicacaoForm(ModelForm):
-
tipo_publicacao = forms.ModelChoiceField(
- label=TipoPublicacao._meta.verbose_name,
- queryset=TipoPublicacao.objects.all())
+ label=TipoPublicacao._meta.verbose_name, queryset=TipoPublicacao.objects.all()
+ )
veiculo_publicacao = forms.ModelChoiceField(
label=VeiculoPublicacao._meta.verbose_name,
- queryset=VeiculoPublicacao.objects.all())
+ queryset=VeiculoPublicacao.objects.all(),
+ )
url_externa = forms.CharField(
- label=Publicacao._meta.get_field('url_externa').verbose_name,
- required=False)
+ label=Publicacao._meta.get_field("url_externa").verbose_name, required=False
+ )
data = forms.DateField(
- label=Publicacao._meta.get_field('data').verbose_name,
- input_formats=['%d/%m/%Y'],
+ label=Publicacao._meta.get_field("data").verbose_name,
+ input_formats=["%d/%m/%Y"],
required=True,
- widget=forms.DateInput(
- format='%d/%m/%Y'),
- error_messages=error_messages
+ widget=forms.DateInput(format="%d/%m/%Y"),
+ error_messages=error_messages,
)
hora = forms.TimeField(
- label=Publicacao._meta.get_field('hora').verbose_name,
+ label=Publicacao._meta.get_field("hora").verbose_name,
required=False,
- widget=forms.TextInput(
- attrs={'class': 'hora_hms'}))
+ widget=forms.TextInput(attrs={"class": "hora_hms"}),
+ )
numero = forms.IntegerField(
- label=Publicacao._meta.get_field(
- 'numero').verbose_name,
- required=False)
- ano = forms.IntegerField(
- label=Publicacao._meta.get_field(
- 'ano').verbose_name)
+ label=Publicacao._meta.get_field("numero").verbose_name, required=False
+ )
+ ano = forms.IntegerField(label=Publicacao._meta.get_field("ano").verbose_name)
edicao = forms.IntegerField(
- label=Publicacao._meta.get_field(
- 'edicao').verbose_name,
- required=False)
+ label=Publicacao._meta.get_field("edicao").verbose_name, required=False
+ )
pagina_inicio = forms.IntegerField(
- label=Publicacao._meta.get_field(
- 'pagina_inicio').verbose_name,
- required=False)
+ label=Publicacao._meta.get_field("pagina_inicio").verbose_name, required=False
+ )
pagina_fim = forms.IntegerField(
- label=Publicacao._meta.get_field(
- 'pagina_fim').verbose_name,
- required=False)
- ta = forms.ModelChoiceField(queryset=TextoArticulado.objects.all(),
- widget=forms.HiddenInput())
+ label=Publicacao._meta.get_field("pagina_fim").verbose_name, required=False
+ )
+ ta = forms.ModelChoiceField(
+ queryset=TextoArticulado.objects.all(), widget=forms.HiddenInput()
+ )
class Meta:
model = Publicacao
- fields = ['tipo_publicacao',
- 'veiculo_publicacao',
- 'url_externa',
- 'data',
- 'hora',
- 'numero',
- 'ano',
- 'edicao',
- 'pagina_inicio',
- 'pagina_fim',
- 'ta']
+ fields = [
+ "tipo_publicacao",
+ "veiculo_publicacao",
+ "url_externa",
+ "data",
+ "hora",
+ "numero",
+ "ano",
+ "edicao",
+ "pagina_inicio",
+ "pagina_fim",
+ "ta",
+ ]
def __init__(self, *args, **kwargs):
+ row1 = to_row(
+ [
+ ("tipo_publicacao", 4),
+ ("veiculo_publicacao", 6),
+ ("ano", 2),
+ ]
+ )
- row1 = to_row([
- ('tipo_publicacao', 4),
- ('veiculo_publicacao', 6),
- ('ano', 2),
- ])
-
- row2 = to_row([
- ('data', 4),
- ('hora', 4),
- ('numero', 2),
- ('edicao', 2),
- ])
-
- row3 = to_row([
- ('pagina_inicio', 2),
- ('pagina_fim', 2),
- ('url_externa', 8),
- ])
+ row2 = to_row(
+ [
+ ("data", 4),
+ ("hora", 4),
+ ("numero", 2),
+ ("edicao", 2),
+ ]
+ )
+
+ row3 = to_row(
+ [
+ ("pagina_inicio", 2),
+ ("pagina_fim", 2),
+ ("url_externa", 8),
+ ]
+ )
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- Fieldset(Publicacao._meta.verbose_name,
- row1, row2, row3, css_class="col-md-12"))
+ Fieldset(
+ Publicacao._meta.verbose_name, row1, row2, row3, css_class="col-md-12"
+ )
+ )
super(PublicacaoForm, self).__init__(*args, **kwargs)
pass
class DispositivoIntegerField(forms.IntegerField):
-
def __init__(self, field_name=None, *args, **kwargs):
-
- if 'required' not in kwargs:
- kwargs.setdefault('required', False)
+ if "required" not in kwargs:
+ kwargs.setdefault("required", False)
self.widget = forms.NumberInput(
- attrs={'title': Dispositivo._meta.get_field(
- field_name).verbose_name,
- 'onchange': 'atualizaRotulo()'})
+ attrs={
+ "title": Dispositivo._meta.get_field(field_name).verbose_name,
+ "onchange": "atualizaRotulo()",
+ }
+ )
- super(DispositivoIntegerField, self).__init__(
- min_value=0, *args, **kwargs)
+ super(DispositivoIntegerField, self).__init__(min_value=0, *args, **kwargs)
class DispositivoEdicaoBasicaForm(FileFieldCheckMixin, ModelForm):
-
class Meta:
model = Dispositivo
- fields = ['imagem', 'imagem_cropping']
+ fields = ["imagem", "imagem_cropping"]
widgets = {
- 'imagem': CustomImageCropWidget(),
- 'imagem_cropping': CropWidget(),
+ "imagem": CustomImageCropWidget(),
+ "imagem_cropping": CropWidget(),
}
error_messages = {
NON_FIELD_ERRORS: {
- 'unique_together':
- _("Já existe um Dispositivo com características idênticas."),
+ "unique_together": _(
+ "Já existe um Dispositivo com características idênticas."
+ ),
}
}
def __init__(self, *args, **kwargs):
-
layout = []
- inst = kwargs['instance'] if 'instance' in kwargs else None
- texto_articulado_do_editor = kwargs['initial'][
- 'texto_articulado_do_editor'] if\
- 'texto_articulado_do_editor' in kwargs['initial'] else None
+ inst = kwargs["instance"] if "instance" in kwargs else None
+ texto_articulado_do_editor = (
+ kwargs["initial"]["texto_articulado_do_editor"]
+ if "texto_articulado_do_editor" in kwargs["initial"]
+ else None
+ )
- editor_type = kwargs['initial']['editor_type']\
- if'editor_type' in kwargs['initial'] else ''
+ editor_type = (
+ kwargs["initial"]["editor_type"]
+ if "editor_type" in kwargs["initial"]
+ else ""
+ )
if inst and inst.tipo_dispositivo.formato_variacao0 in [
- TipoDispositivo.FNC8, TipoDispositivo.FNCN]:
+ TipoDispositivo.FNC8,
+ TipoDispositivo.FNCN,
+ ]:
# remove edição do rótulo se o tipo de disp. for não numerável
- if 'rotulo' in DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.remove('rotulo')
+ if "rotulo" in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("rotulo")
for i in range(6):
- DispositivoEdicaoBasicaForm.Meta.fields.remove(
- 'dispositivo%s' % i)
- elif editor_type == 'get_form_base':
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("dispositivo%s" % i)
+ elif editor_type == "get_form_base":
# remove edição do rótulo se a req do form vier do editor dinamico
- if 'rotulo' in DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.remove('rotulo')
+ if "rotulo" in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("rotulo")
for i in range(6):
- DispositivoEdicaoBasicaForm.Meta.fields.remove(
- 'dispositivo%s' % i)
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("dispositivo%s" % i)
else:
# adiciona campos de rótulo no formulário
- if 'rotulo' not in DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.append('rotulo')
+ if "rotulo" not in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.append("rotulo")
for i in range(6):
- DispositivoEdicaoBasicaForm.Meta.fields.append(
- 'dispositivo%s' % i)
+ DispositivoEdicaoBasicaForm.Meta.fields.append("dispositivo%s" % i)
self.dispositivo0 = forms.IntegerField(
min_value=0,
- label=Dispositivo._meta.get_field('dispositivo0').verbose_name,
+ label=Dispositivo._meta.get_field("dispositivo0").verbose_name,
widget=forms.NumberInput(
- attrs={'title': _('Valor 0(zero) é permitido apenas para '
- 'Dispositivos com tipos variáveis.'),
- 'onchange': 'atualizaRotulo()'}))
+ attrs={
+ "title": _(
+ "Valor 0(zero) é permitido apenas para "
+ "Dispositivos com tipos variáveis."
+ ),
+ "onchange": "atualizaRotulo()",
+ }
+ ),
+ )
self.dispositivo1 = DispositivoIntegerField(
- label=('1ª %s' % _('Variação')),
- field_name='dispositivo1')
+ label=("1ª %s" % _("Variação")), field_name="dispositivo1"
+ )
self.dispositivo2 = DispositivoIntegerField(
- label=('2ª'),
- field_name='dispositivo2')
+ label=("2ª"), field_name="dispositivo2"
+ )
self.dispositivo3 = DispositivoIntegerField(
- label=('3ª'),
- field_name='dispositivo3')
+ label=("3ª"), field_name="dispositivo3"
+ )
self.dispositivo4 = DispositivoIntegerField(
- label=('4ª'),
- field_name='dispositivo4')
+ label=("4ª"), field_name="dispositivo4"
+ )
self.dispositivo5 = DispositivoIntegerField(
- label=('5ª'),
- field_name='dispositivo5')
-
- self.rotulo = forms.CharField(
- required=False, label=_('Rótulo Resultante'))
+ label=("5ª"), field_name="dispositivo5"
+ )
- rotulo_fieldset = to_row([
- ('dispositivo0', 3),
- ('dispositivo1', 2),
- ('dispositivo2', 1),
- ('dispositivo3', 1),
- ('dispositivo4', 1),
- ('dispositivo5', 1),
- ('rotulo', 3)])
+ self.rotulo = forms.CharField(required=False, label=_("Rótulo Resultante"))
+
+ rotulo_fieldset = to_row(
+ [
+ ("dispositivo0", 3),
+ ("dispositivo1", 2),
+ ("dispositivo2", 1),
+ ("dispositivo3", 1),
+ ("dispositivo4", 1),
+ ("dispositivo5", 1),
+ ("rotulo", 3),
+ ]
+ )
- layout.append(Fieldset(_('Construção do Rótulo'), rotulo_fieldset,
- css_class="col-md-12"))
+ layout.append(
+ Fieldset(
+ _("Construção do Rótulo"), rotulo_fieldset, css_class="col-md-12"
+ )
+ )
if inst and inst.tipo_dispositivo.dispositivo_de_articulacao:
- if 'texto' in DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.remove('texto')
+ if "texto" in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("texto")
else:
- if 'texto' not in DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.append('texto')
+ if "texto" not in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.append("texto")
- self.texto = forms.CharField(required=False,
- label='',
- widget=forms.Textarea())
- row_texto = to_row([('texto', 12)])
+ self.texto = forms.CharField(
+ required=False, label="", widget=forms.Textarea()
+ )
+ row_texto = to_row([("texto", 12)])
layout.append(
- Fieldset(Dispositivo._meta.get_field('texto').verbose_name,
- row_texto,
- css_class="col-md-12"))
+ Fieldset(
+ Dispositivo._meta.get_field("texto").verbose_name,
+ row_texto,
+ css_class="col-md-12",
+ )
+ )
- if editor_type == 'get_form_base' and inst.dispositivo_atualizador_id:
+ if editor_type == "get_form_base" and inst.dispositivo_atualizador_id:
if inst and inst.tipo_dispositivo.dispositivo_de_articulacao:
- if 'texto_atualizador' in\
- DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.remove(
- 'texto_atualizador')
- DispositivoEdicaoBasicaForm.Meta.fields.remove(
- 'visibilidade')
+ if "texto_atualizador" in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("texto_atualizador")
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("visibilidade")
else:
- if 'texto_atualizador' not in\
- DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.append(
- 'texto_atualizador')
- DispositivoEdicaoBasicaForm.Meta.fields.append(
- 'visibilidade')
+ if "texto_atualizador" not in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.append("texto_atualizador")
+ DispositivoEdicaoBasicaForm.Meta.fields.append("visibilidade")
self.texto_atualizador = forms.CharField(
required=False,
- label='',
+ label="",
widget=forms.Textarea(),
help_text=_(
"""%s é um campo para ser informado apenas
@@ -661,341 +699,409 @@ class DispositivoEdicaoBasicaForm(FileFieldCheckMixin, ModelForm):
uma expressão terminou com um (.) ponto final
mas faz mais sentido que no documento anterior
seja colocado com (;) um ponto e virgula.
- """ % (
+ """
+ % (
Dispositivo._meta.get_field(
- 'texto_atualizador').verbose_name,
+ "texto_atualizador"
+ ).verbose_name,
inst.ta_publicado,
- inst.ta
- )))
+ inst.ta,
+ )
+ ),
+ )
self.visibilidade = forms.ChoiceField(
- label=Dispositivo._meta.get_field(
- 'visibilidade').verbose_name,
+ label=Dispositivo._meta.get_field("visibilidade").verbose_name,
choices=utils.YES_NO_CHOICES,
- widget=forms.RadioSelect())
+ widget=forms.RadioSelect(),
+ )
layout.append(
- Fieldset(Dispositivo._meta.get_field(
- 'texto_atualizador').verbose_name,
- to_row([(InlineRadios('visibilidade'), 12)]),
- to_row([('texto_atualizador', 12)]),
- css_class="col-md-12"))
+ Fieldset(
+ Dispositivo._meta.get_field("texto_atualizador").verbose_name,
+ to_row([(InlineRadios("visibilidade"), 12)]),
+ to_row([("texto_atualizador", 12)]),
+ css_class="col-md-12",
+ )
+ )
else:
- if 'texto_atualizador' in\
- DispositivoEdicaoBasicaForm.Meta.fields:
- DispositivoEdicaoBasicaForm.Meta.fields.remove(
- 'texto_atualizador')
- DispositivoEdicaoBasicaForm.Meta.fields.remove(
- 'visibilidade')
-
- if 'texto' in DispositivoEdicaoBasicaForm.Meta.fields and\
- not editor_type:
+ if "texto_atualizador" in DispositivoEdicaoBasicaForm.Meta.fields:
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("texto_atualizador")
+ DispositivoEdicaoBasicaForm.Meta.fields.remove("visibilidade")
+
+ if "texto" in DispositivoEdicaoBasicaForm.Meta.fields and not editor_type:
layout.append(
- Fieldset('Anexar Imagem',
- to_row([('imagem', 7), ('imagem_cropping', 5), ]),
- css_class="col-md-12"))
- DispositivoEdicaoBasicaForm.Meta.fields.append('imagem')
- DispositivoEdicaoBasicaForm.Meta.fields.append('imagem_cropping')
+ Fieldset(
+ "Anexar Imagem",
+ to_row(
+ [
+ ("imagem", 7),
+ ("imagem_cropping", 5),
+ ]
+ ),
+ css_class="col-md-12",
+ )
+ )
+ DispositivoEdicaoBasicaForm.Meta.fields.append("imagem")
+ DispositivoEdicaoBasicaForm.Meta.fields.append("imagem_cropping")
for f in DispositivoEdicaoBasicaForm.Meta.fields:
if hasattr(self, f):
self.base_fields.update({f: getattr(self, f)})
- for f in set(self.base_fields.keys()) - set(DispositivoEdicaoBasicaForm.Meta.fields):
+ for f in set(self.base_fields.keys()) - set(
+ DispositivoEdicaoBasicaForm.Meta.fields
+ ):
self.base_fields.pop(f)
self.helper = SaplFormHelper()
self.helper.include_media = False
if not editor_type:
- cancel_label = _('Ir para o Editor Sequencial')
- self.helper.layout = SaplFormLayout(
- *layout, cancel_label=cancel_label)
+ cancel_label = _("Ir para o Editor Sequencial")
+ self.helper.layout = SaplFormLayout(*layout, cancel_label=cancel_label)
elif editor_type == "get_form_base":
getattr(self, "actions_" + editor_type)(
- layout, inst, texto_articulado_do_editor)
+ layout, inst, texto_articulado_do_editor
+ )
super(DispositivoEdicaoBasicaForm, self).__init__(*args, **kwargs)
- #imagem = self.fields['imagem'].widget
+ # imagem = self.fields['imagem'].widget
# imagem.attrs.update(
# get_attrs(self.instance.imagem, 'imagem')
- #)
+ # )
# if 'class' in imagem.attrs:
# imagem.attrs.pop('class')
- def actions_get_form_base(self, layout,
- inst,
- texto_articulado_do_editor=None):
- cancel_label = _('Fechar')
+ def actions_get_form_base(self, layout, inst, texto_articulado_do_editor=None):
+ cancel_label = _("Fechar")
more = [
- HTML('%s' %
- cancel_label),
+ HTML('%s' % cancel_label),
]
btns_excluir = []
- if not (inst.tipo_dispositivo.dispositivo_de_alteracao and
- inst.tipo_dispositivo.dispositivo_de_articulacao):
+ if not (
+ inst.tipo_dispositivo.dispositivo_de_alteracao
+ and inst.tipo_dispositivo.dispositivo_de_articulacao
+ ):
btns_excluir = [
- HTML('%s' % (_('Excluir apenas este dispositivo.'),
- inst.pk,
- _('Excluir Dispositivo')))]
-
- if (inst.dispositivos_filhos_set.filter(
- auto_inserido=False).exists() or (
- inst.tipo_dispositivo.dispositivo_de_alteracao and
- inst.tipo_dispositivo.dispositivo_de_articulacao)) and (
- inst.ta_id == int(texto_articulado_do_editor)
- if texto_articulado_do_editor else 0):
+ HTML(
+ '%s"
+ % (
+ _("Excluir apenas este dispositivo."),
+ inst.pk,
+ _("Excluir Dispositivo"),
+ )
+ )
+ ]
+
+ if (
+ inst.dispositivos_filhos_set.filter(auto_inserido=False).exists()
+ or (
+ inst.tipo_dispositivo.dispositivo_de_alteracao
+ and inst.tipo_dispositivo.dispositivo_de_articulacao
+ )
+ ) and (
+ inst.ta_id == int(texto_articulado_do_editor)
+ if texto_articulado_do_editor
+ else 0
+ ):
btns_excluir.append(
HTML(
'%s' % (_('Excluir este dispositivo '
- 'e toda sua estrutura.'),
- inst.pk,
- _('Excluir Bloco Completo.'))))
+ ">%s"
+ % (
+ _("Excluir este dispositivo " "e toda sua estrutura."),
+ inst.pk,
+ _("Excluir Bloco Completo."),
+ )
+ )
+ )
if btns_excluir and (not inst.auto_inserido or inst.ta_publicado):
- css_class = 'btn-group float-right btns-excluir'
+ css_class = "btn-group float-right btns-excluir"
more.append(Div(*btns_excluir, css_class=css_class))
if not inst.tipo_dispositivo.dispositivo_de_articulacao:
- more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
+ more.append(Submit("salvar", _("Salvar"), css_class="float-right"))
- buttons = FormActions(*more, css_class='form-group')
+ buttons = FormActions(*more, css_class="form-group")
- _fields = [Div(*layout, css_class="row")] + \
- [to_row([(buttons, 12)])]
+ _fields = [Div(*layout, css_class="row")] + [to_row([(buttons, 12)])]
self.helper.layout = Layout(*_fields)
class DispositivoSearchModalForm(Form):
-
TIPO_RESULTADO_CHOICES = Choices(
- ('C', 'coincidentes', _('Apenas Coincidentes')),
- ('I', 'internos', _('Incluir Internos')),
- ('S', 'coin_sequentes', _('Coincidentes e seus sequentes')),
+ ("C", "coincidentes", _("Apenas Coincidentes")),
+ ("I", "internos", _("Incluir Internos")),
+ ("S", "coin_sequentes", _("Coincidentes e seus sequentes")),
)
tipo_ta = forms.ModelChoiceField(
- label=_('Tipo do Texto Articulado'),
+ label=_("Tipo do Texto Articulado"),
queryset=TipoTextoArticulado.objects.all(),
- required=False)
+ required=False,
+ )
- tipo_model = forms.ChoiceField(
- choices=[],
- label=_('Tipos de...'), required=False)
+ tipo_model = forms.ChoiceField(choices=[], label=_("Tipos de..."), required=False)
- num_ta = forms.IntegerField(
- label=_('Número do Documento'), required=False)
- ano_ta = forms.IntegerField(
- label=_('Ano do Documento'), required=False)
+ num_ta = forms.IntegerField(label=_("Número do Documento"), required=False)
+ ano_ta = forms.IntegerField(label=_("Ano do Documento"), required=False)
tipo_resultado = forms.ChoiceField(
- label=_('Tipo do Resultado?'),
+ label=_("Tipo do Resultado?"),
choices=TIPO_RESULTADO_CHOICES,
widget=forms.RadioSelect(),
- required=False)
+ required=False,
+ )
max_results = forms.ChoiceField(
- label=_('Limite de Listagem'),
- choices=[(10, _('Dez Dispositivos')),
- (30, _('Trinta Dispositivos')),
- (50, _('Cinquenta Dispositivos')),
- (100, _('Cem Dispositivos'))],
+ label=_("Limite de Listagem"),
+ choices=[
+ (10, _("Dez Dispositivos")),
+ (30, _("Trinta Dispositivos")),
+ (50, _("Cinquenta Dispositivos")),
+ (100, _("Cem Dispositivos")),
+ ],
widget=forms.Select(),
- required=False)
+ required=False,
+ )
- rotulo_dispositivo = forms.CharField(
- label=_('Rótulo'),
- required=False)
+ rotulo_dispositivo = forms.CharField(label=_("Rótulo"), required=False)
- texto_dispositivo = forms.CharField(
- label=_('Pesquisa Textual'),
- required=False)
+ texto_dispositivo = forms.CharField(label=_("Pesquisa Textual"), required=False)
def __init__(self, *args, **kwargs):
-
fields_search = Fieldset(
- _('Busca por um Dispositivo'),
+ _("Busca por um Dispositivo"),
Row(
- to_column(('num_ta', 4)),
- to_column(('ano_ta', 4)),
- to_column(('max_results', 4))),
-
+ to_column(("num_ta", 4)),
+ to_column(("ano_ta", 4)),
+ to_column(("max_results", 4)),
+ ),
Row(
- to_column(('tipo_resultado', 3)),
+ to_column(("tipo_resultado", 3)),
to_column(
(
Div(
Row(
- to_column(('tipo_ta', 6)),
- to_column(('tipo_model', 6))),
+ to_column(("tipo_ta", 6)), to_column(("tipo_model", 6))
+ ),
Row(
- to_column(('rotulo_dispositivo', 4)),
+ to_column(("rotulo_dispositivo", 4)),
to_column(
(
FieldWithButtons(
Field(
- 'texto_dispositivo',
- placeholder=_('Digite palavras, letras, '
- 'números ou algo'
- ' que estejam no texto.')),
+ "texto_dispositivo",
+ placeholder=_(
+ "Digite palavras, letras, "
+ "números ou algo"
+ " que estejam no texto."
+ ),
+ ),
StrictButton(
- _('Buscar'),
- css_class='btn-busca btn-primary')), 8))
- )
- ), 9
+ _("Buscar"),
+ css_class="btn-busca btn-primary",
+ ),
+ ),
+ 8,
+ )
+ ),
+ ),
+ ),
+ 9,
)
- )
- ))
+ ),
+ ),
+ )
self.helper = SaplFormHelper()
self.helper.layout = Layout(
fields_search,
- Row(to_column((Div(css_class='result-busca-dispositivo'), 12))))
-
- if 'choice_model_type_foreignkey_in_extenal_views' in kwargs:
- ch = kwargs.pop('choice_model_type_foreignkey_in_extenal_views')
- if 'data' in kwargs:
- choice = ch(kwargs['data']['tipo_ta'])
- self.base_fields['tipo_model'].choices = choice
- elif 'instance' in kwargs and\
- isinstance(kwargs['instance'], Dispositivo):
- choice = ch(kwargs['instance'].ta.tipo_ta_id)
- self.base_fields['tipo_model'].choices = choice
-
- kwargs['initial'].update({'tipo_resultado': 'C'})
+ Row(to_column((Div(css_class="result-busca-dispositivo"), 12))),
+ )
+
+ if "choice_model_type_foreignkey_in_extenal_views" in kwargs:
+ ch = kwargs.pop("choice_model_type_foreignkey_in_extenal_views")
+ if "data" in kwargs:
+ choice = ch(kwargs["data"]["tipo_ta"])
+ self.base_fields["tipo_model"].choices = choice
+ elif "instance" in kwargs and isinstance(kwargs["instance"], Dispositivo):
+ choice = ch(kwargs["instance"].ta.tipo_ta_id)
+ self.base_fields["tipo_model"].choices = choice
+
+ kwargs["initial"].update({"tipo_resultado": "C"})
super(DispositivoSearchModalForm, self).__init__(*args, **kwargs)
class DispositivoEdicaoVigenciaForm(ModelForm):
inconstitucionalidade = forms.ChoiceField(
- label=Dispositivo._meta.get_field(
- 'inconstitucionalidade').verbose_name,
+ label=Dispositivo._meta.get_field("inconstitucionalidade").verbose_name,
choices=utils.YES_NO_CHOICES,
- widget=forms.RadioSelect())
+ widget=forms.RadioSelect(),
+ )
dispositivo_vigencia = forms.ModelChoiceField(
- label=Dispositivo._meta.get_field(
- 'dispositivo_vigencia').verbose_name,
+ label=Dispositivo._meta.get_field("dispositivo_vigencia").verbose_name,
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
extensao = forms.ChoiceField(
- label=_('Extender a seleção abaixo como Dispositivo de Vigência '
- 'para todos dependentes originais '
- 'deste Dispositivo em edição?'),
+ label=_(
+ "Extender a seleção abaixo como Dispositivo de Vigência "
+ "para todos dependentes originais "
+ "deste Dispositivo em edição?"
+ ),
choices=utils.YES_NO_CHOICES,
widget=forms.RadioSelect(),
- required=False)
+ required=False,
+ )
class Meta:
model = Dispositivo
- fields = ['inicio_vigencia',
- 'fim_vigencia',
- 'inicio_eficacia',
- 'fim_eficacia',
- 'publicacao',
- 'inconstitucionalidade',
- 'dispositivo_vigencia'
- ]
+ fields = [
+ "inicio_vigencia",
+ "fim_vigencia",
+ "inicio_eficacia",
+ "fim_eficacia",
+ "publicacao",
+ "inconstitucionalidade",
+ "dispositivo_vigencia",
+ ]
error_messages = {
NON_FIELD_ERRORS: {
- 'unique_together':
- _("Já existe um Dispositivo com características idênticas."),
+ "unique_together": _(
+ "Já existe um Dispositivo com características idênticas."
+ ),
}
}
def __init__(self, *args, **kwargs):
-
layout = []
- row_publicacao = to_row([
- ('publicacao', 6),
- (InlineRadios('inconstitucionalidade'), 3), ])
+ row_publicacao = to_row(
+ [
+ ("publicacao", 6),
+ (InlineRadios("inconstitucionalidade"), 3),
+ ]
+ )
row_publicacao.fields.append(
Alert(
- css_class='alert-info col-md-3',
- content='%s %s' % (
- _('Dica!'), _('Inclua uma Nota de Dispositivo informando '
- 'sobre a Inconstitucionalidade.'))))
+ css_class="alert-info col-md-3",
+ content="%s %s"
+ % (
+ _("Dica!"),
+ _(
+ "Inclua uma Nota de Dispositivo informando "
+ "sobre a Inconstitucionalidade."
+ ),
+ ),
+ )
+ )
layout.append(
- Fieldset(_('Registro de Publicação e Validade'),
- row_publicacao,
- css_class="col-md-12"))
+ Fieldset(
+ _("Registro de Publicação e Validade"),
+ row_publicacao,
+ css_class="col-md-12",
+ )
+ )
- row_datas = to_row([
- ('inicio_vigencia', 3),
- ('fim_vigencia', 3),
- ('inicio_eficacia', 3),
- ('fim_eficacia', 3), ])
+ row_datas = to_row(
+ [
+ ("inicio_vigencia", 3),
+ ("fim_vigencia", 3),
+ ("inicio_eficacia", 3),
+ ("fim_eficacia", 3),
+ ]
+ )
- inst = kwargs['instance']
+ inst = kwargs["instance"]
while inst.auto_inserido and inst.dispositivo_pai:
inst = inst.dispositivo_pai
- if (inst.dispositivos_vigencias_set.exists()):
+ if inst.dispositivos_vigencias_set.exists():
row_datas.fields.append(
Alert(
- css_class='alert-info col-md-12',
- content='%s %s' % (
- _('Atenção!'),
- _('O Dispositivo em edição define vigência de outros '
- 'dispositivos. Alterar as datas de vigência '
- 'alterará as datas de vigência dos dispositivos '
- 'vigêntes por este em edição.'))))
+ css_class="alert-info col-md-12",
+ content="%s %s"
+ % (
+ _("Atenção!"),
+ _(
+ "O Dispositivo em edição define vigência de outros "
+ "dispositivos. Alterar as datas de vigência "
+ "alterará as datas de vigência dos dispositivos "
+ "vigêntes por este em edição."
+ ),
+ ),
+ )
+ )
layout.append(
- Fieldset(_('Datas de Controle de Vigência'),
- row_datas,
- css_class="col-md-12"))
+ Fieldset(
+ _("Datas de Controle de Vigência"), row_datas, css_class="col-md-12"
+ )
+ )
row_vigencia = Field(
- 'dispositivo_vigencia',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_vigencia',
- data_type_selection='radio',
- template="compilacao/layout/dispositivo_radio.html")
+ "dispositivo_vigencia",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_vigencia",
+ data_type_selection="radio",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
layout.append(
- Fieldset(_('Dispositivo de Vigência'),
- to_row([(InlineRadios('extensao'), 12)]),
- row_vigencia,
- css_class="col-md-12"))
+ Fieldset(
+ _("Dispositivo de Vigência"),
+ to_row([(InlineRadios("extensao"), 12)]),
+ row_vigencia,
+ css_class="col-md-12",
+ )
+ )
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- *layout,
- cancel_label=_('Ir para o Editor Sequencial'))
+ *layout, cancel_label=_("Ir para o Editor Sequencial")
+ )
super(DispositivoEdicaoVigenciaForm, self).__init__(*args, **kwargs)
- pubs = Publicacao.objects.order_by(
- '-data', '-hora').filter(Q(ta=self.instance.ta) |
- Q(ta=self.instance.ta_publicado))
- self.fields['publicacao'].choices = [("", "---------")] + [(
- p.pk, _('%s realizada em %s. %s') % (
- p.tipo_publicacao,
- defaultfilters.date(
- p.data, r"d \d\e F \d\e Y"),
- str(p.ta))) for p in pubs]
+ pubs = Publicacao.objects.order_by("-data", "-hora").filter(
+ Q(ta=self.instance.ta) | Q(ta=self.instance.ta_publicado)
+ )
+ self.fields["publicacao"].choices = [("", "---------")] + [
+ (
+ p.pk,
+ _("%s realizada em %s. %s")
+ % (
+ p.tipo_publicacao,
+ defaultfilters.date(p.data, r"d \d\e F \d\e Y"),
+ str(p.ta),
+ ),
+ )
+ for p in pubs
+ ]
- dvs = Dispositivo.objects.order_by('ordem').filter(
- pk=self.instance.dispositivo_vigencia_id)
- self.fields['dispositivo_vigencia'].choices = [(d.pk, d) for d in dvs]
+ dvs = Dispositivo.objects.order_by("ordem").filter(
+ pk=self.instance.dispositivo_vigencia_id
+ )
+ self.fields["dispositivo_vigencia"].choices = [(d.pk, d) for d in dvs]
def clean_dispositivo_vigencia(self):
- dv = self.cleaned_data['dispositivo_vigencia']
+ dv = self.cleaned_data["dispositivo_vigencia"]
if dv and dv.auto_inserido:
dv = dv.dispositivo_pai
@@ -1019,23 +1125,22 @@ class DispositivoEdicaoVigenciaForm(ModelForm):
instance = dp
- dv = data['dispositivo_vigencia']
+ dv = data["dispositivo_vigencia"]
if dv and dv.auto_inserido:
dv = dv.dispositivo_pai
- extensao = 'extensao' in data and data['extensao'] == 'True'
+ extensao = "extensao" in data and data["extensao"] == "True"
if extensao:
dv_pk = dv.pk if dv else None
def extenderPara(dpt_pk):
-
Dispositivo.objects.filter(
- dispositivo_pai_id=dpt_pk,
- ta_publicado__isnull=True).update(
- dispositivo_vigencia_id=dv_pk)
+ dispositivo_pai_id=dpt_pk, ta_publicado__isnull=True
+ ).update(dispositivo_vigencia_id=dv_pk)
filhos = Dispositivo.objects.filter(
- dispositivo_pai_id=dpt_pk).values_list('pk', flat=True)
+ dispositivo_pai_id=dpt_pk
+ ).values_list("pk", flat=True)
for d in filhos:
extenderPara(d)
@@ -1046,184 +1151,191 @@ class DispositivoEdicaoVigenciaForm(ModelForm):
while instance.auto_inserido and instance.dispositivo_pai:
instance = instance.dispositivo_pai
- inst.dispositivos_vigencias_set.filter(
- ta_publicado__isnull=True).update(
- inicio_vigencia=inst.inicio_vigencia,
- inicio_eficacia=inst.inicio_eficacia,
- fim_vigencia=inst.fim_vigencia,
- fim_eficacia=inst.fim_eficacia)
+ inst.dispositivos_vigencias_set.filter(ta_publicado__isnull=True).update(
+ inicio_vigencia=inst.inicio_vigencia,
+ inicio_eficacia=inst.inicio_eficacia,
+ fim_vigencia=inst.fim_vigencia,
+ fim_eficacia=inst.fim_eficacia,
+ )
- inst.dispositivos_vigencias_set.filter(
- ta_publicado__isnull=False).update(
- inicio_vigencia=inst.inicio_eficacia,
- inicio_eficacia=inst.inicio_eficacia,
- fim_vigencia=inst.fim_eficacia,
- fim_eficacia=inst.fim_eficacia)
+ inst.dispositivos_vigencias_set.filter(ta_publicado__isnull=False).update(
+ inicio_vigencia=inst.inicio_eficacia,
+ inicio_eficacia=inst.inicio_eficacia,
+ fim_vigencia=inst.fim_eficacia,
+ fim_eficacia=inst.fim_eficacia,
+ )
return inst
class MultipleChoiceWithoutValidationField(forms.MultipleChoiceField):
-
def validate(self, value):
if self.required and not value:
- raise ValidationError(
- self.error_messages['required'], code='required')
+ raise ValidationError(self.error_messages["required"], code="required")
class DispositivoDefinidorVigenciaForm(Form):
-
dispositivo_vigencia = MultipleChoiceWithoutValidationField(
- label=Dispositivo._meta.get_field(
- 'dispositivo_vigencia').verbose_name,
- required=False)
+ label=Dispositivo._meta.get_field("dispositivo_vigencia").verbose_name,
+ required=False,
+ )
def __init__(self, *args, **kwargs):
-
layout = []
row_vigencia = Field(
- 'dispositivo_vigencia',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_vigencia',
- data_type_selection='checkbox',
- template="compilacao/layout/dispositivo_checkbox.html")
+ "dispositivo_vigencia",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_vigencia",
+ data_type_selection="checkbox",
+ template="compilacao/layout/dispositivo_checkbox.html",
+ )
layout.append(
- Fieldset(_('Definidor de Vigência dos Dispositívos abaixo'),
- row_vigencia,
- css_class="col-md-12"))
+ Fieldset(
+ _("Definidor de Vigência dos Dispositívos abaixo"),
+ row_vigencia,
+ css_class="col-md-12",
+ )
+ )
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- *layout,
- cancel_label=_('Ir para o Editor Sequencial'))
+ *layout, cancel_label=_("Ir para o Editor Sequencial")
+ )
- pk = kwargs.pop('pk')
+ pk = kwargs.pop("pk")
super(DispositivoDefinidorVigenciaForm, self).__init__(*args, **kwargs)
- dvs = Dispositivo.objects.order_by('ta', 'ordem').filter(
- dispositivo_vigencia_id=pk).select_related(
- *DISPOSITIVO_SELECT_RELATED)
- self.initial['dispositivo_vigencia'] = [d.pk for d in dvs]
-
- TA_TA_PUB = 'ta_id', 'ta_publicado_id'
- tas = Dispositivo.objects.order_by(
- *TA_TA_PUB).filter(dispositivo_vigencia_id=pk).distinct(
- *TA_TA_PUB).values_list(
- *TA_TA_PUB)
+ dvs = (
+ Dispositivo.objects.order_by("ta", "ordem")
+ .filter(dispositivo_vigencia_id=pk)
+ .select_related(*DISPOSITIVO_SELECT_RELATED)
+ )
+ self.initial["dispositivo_vigencia"] = [d.pk for d in dvs]
+
+ TA_TA_PUB = "ta_id", "ta_publicado_id"
+ tas = (
+ Dispositivo.objects.order_by(*TA_TA_PUB)
+ .filter(dispositivo_vigencia_id=pk)
+ .distinct(*TA_TA_PUB)
+ .values_list(*TA_TA_PUB)
+ )
tas = list(set().union(*list(map(list, zip(*tas)))))
if not tas:
- tas = Dispositivo.objects.filter(pk=pk).values_list('ta_id')
+ tas = Dispositivo.objects.filter(pk=pk).values_list("ta_id")
- dvs = Dispositivo.objects.order_by(
- '-ta__data', '-ta__ano', '-ta__numero', 'ta', 'ordem').filter(
- ta__in=tas).select_related(*DISPOSITIVO_SELECT_RELATED)
- self.fields['dispositivo_vigencia'].choices = [
- (d.pk, d)
- for d in dvs
- if d.pk in self.initial['dispositivo_vigencia']]
+ dvs = (
+ Dispositivo.objects.order_by(
+ "-ta__data", "-ta__ano", "-ta__numero", "ta", "ordem"
+ )
+ .filter(ta__in=tas)
+ .select_related(*DISPOSITIVO_SELECT_RELATED)
+ )
+ self.fields["dispositivo_vigencia"].choices = [
+ (d.pk, d) for d in dvs if d.pk in self.initial["dispositivo_vigencia"]
+ ]
class DispositivoEdicaoAlteracaoForm(ModelForm):
-
class Meta:
model = Dispositivo
fields = [
- 'dispositivo_atualizador',
- 'dispositivo_substituido',
- 'dispositivo_subsequente',
+ "dispositivo_atualizador",
+ "dispositivo_substituido",
+ "dispositivo_subsequente",
]
error_messages = {
NON_FIELD_ERRORS: {
- 'unique_together':
- _("Já existe um Dispositivo com características idênticas."),
+ "unique_together": _(
+ "Já existe um Dispositivo com características idênticas."
+ ),
}
}
def __init__(self, *args, **kwargs):
-
layout = []
self.dispositivo_substituido = forms.ModelChoiceField(
- label=Dispositivo._meta.get_field(
- 'dispositivo_substituido').verbose_name,
+ label=Dispositivo._meta.get_field("dispositivo_substituido").verbose_name,
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
self.dispositivo_subsequente = forms.ModelChoiceField(
- label=Dispositivo._meta.get_field(
- 'dispositivo_subsequente').verbose_name,
+ label=Dispositivo._meta.get_field("dispositivo_subsequente").verbose_name,
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
self.dispositivo_atualizador = forms.ModelChoiceField(
- label=Dispositivo._meta.get_field(
- 'dispositivo_atualizador').verbose_name,
+ label=Dispositivo._meta.get_field("dispositivo_atualizador").verbose_name,
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
substituido = Field(
- 'dispositivo_substituido',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_substituido',
- data_type_selection='radio',
- template="compilacao/layout/dispositivo_radio.html")
+ "dispositivo_substituido",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_substituido",
+ data_type_selection="radio",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
subsequente = Field(
- 'dispositivo_subsequente',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_subsequente',
- data_type_selection='radio',
- template="compilacao/layout/dispositivo_radio.html")
+ "dispositivo_subsequente",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_subsequente",
+ data_type_selection="radio",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
alterador = Field(
- 'dispositivo_atualizador',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_atualizador',
- data_type_selection='radio',
- data_function='alterador',
- template="compilacao/layout/dispositivo_radio.html")
+ "dispositivo_atualizador",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_atualizador",
+ data_type_selection="radio",
+ data_function="alterador",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
layout.append(
- to_row([
- (Fieldset(_('Dispositivo Subsitituido'), substituido), 6),
- (Fieldset(_('Dispositivo Subsequente'), subsequente), 6)]))
+ to_row(
+ [
+ (Fieldset(_("Dispositivo Subsitituido"), substituido), 6),
+ (Fieldset(_("Dispositivo Subsequente"), subsequente), 6),
+ ]
+ )
+ )
layout.append(
- Fieldset(
- _('Dispositivo Alterador'),
- Div(alterador),
- css_class="col-md-12"))
+ Fieldset(_("Dispositivo Alterador"), Div(alterador), css_class="col-md-12")
+ )
- inst = kwargs['instance'] if 'instance' in kwargs else None
+ inst = kwargs["instance"] if "instance" in kwargs else None
if inst and inst.tipo_dispositivo.dispositivo_de_articulacao:
- if 'texto_atualizador' in\
- DispositivoEdicaoAlteracaoForm.Meta.fields:
- DispositivoEdicaoAlteracaoForm.Meta.fields.remove(
- 'texto_atualizador')
- DispositivoEdicaoAlteracaoForm.Meta.fields.remove(
- 'visibilidade')
+ if "texto_atualizador" in DispositivoEdicaoAlteracaoForm.Meta.fields:
+ DispositivoEdicaoAlteracaoForm.Meta.fields.remove("texto_atualizador")
+ DispositivoEdicaoAlteracaoForm.Meta.fields.remove("visibilidade")
else:
- if 'texto_atualizador' not in\
- DispositivoEdicaoAlteracaoForm.Meta.fields:
- DispositivoEdicaoAlteracaoForm.Meta.fields.append(
- 'texto_atualizador')
- DispositivoEdicaoAlteracaoForm.Meta.fields.append(
- 'visibilidade')
-
- self.texto_atualizador = forms.CharField(required=False,
- label='',
- widget=forms.Textarea())
+ if "texto_atualizador" not in DispositivoEdicaoAlteracaoForm.Meta.fields:
+ DispositivoEdicaoAlteracaoForm.Meta.fields.append("texto_atualizador")
+ DispositivoEdicaoAlteracaoForm.Meta.fields.append("visibilidade")
+
+ self.texto_atualizador = forms.CharField(
+ required=False, label="", widget=forms.Textarea()
+ )
self.visibilidade = forms.ChoiceField(
- label=Dispositivo._meta.get_field(
- 'visibilidade').verbose_name,
+ label=Dispositivo._meta.get_field("visibilidade").verbose_name,
choices=utils.YES_NO_CHOICES,
- widget=forms.RadioSelect())
+ widget=forms.RadioSelect(),
+ )
layout.append(
- Fieldset(Dispositivo._meta.get_field(
- 'texto_atualizador').verbose_name,
- to_row([(InlineRadios('visibilidade'), 12)]),
- to_row([('texto_atualizador', 12)]),
- css_class="col-md-12"))
+ Fieldset(
+ Dispositivo._meta.get_field("texto_atualizador").verbose_name,
+ to_row([(InlineRadios("visibilidade"), 12)]),
+ to_row([("texto_atualizador", 12)]),
+ css_class="col-md-12",
+ )
+ )
fields = DispositivoEdicaoAlteracaoForm.Meta.fields
if fields:
@@ -1234,28 +1346,28 @@ class DispositivoEdicaoAlteracaoForm(ModelForm):
self.helper = SaplFormHelper()
self.helper.layout = SaplFormLayout(
- *layout,
- cancel_label=_('Ir para o Editor Sequencial'))
+ *layout, cancel_label=_("Ir para o Editor Sequencial")
+ )
super(DispositivoEdicaoAlteracaoForm, self).__init__(*args, **kwargs)
- self.fields['dispositivo_substituido'].choices = []
- self.fields['dispositivo_subsequente'].choices = []
- self.fields['dispositivo_atualizador'].choices = []
+ self.fields["dispositivo_substituido"].choices = []
+ self.fields["dispositivo_subsequente"].choices = []
+ self.fields["dispositivo_atualizador"].choices = []
if inst.dispositivo_substituido:
- self.fields['dispositivo_substituido'].choices = [
- (inst.dispositivo_substituido.pk,
- inst.dispositivo_substituido)]
+ self.fields["dispositivo_substituido"].choices = [
+ (inst.dispositivo_substituido.pk, inst.dispositivo_substituido)
+ ]
if inst.dispositivo_subsequente:
- self.fields['dispositivo_subsequente'].choices = [
- (inst.dispositivo_subsequente.pk,
- inst.dispositivo_subsequente)]
+ self.fields["dispositivo_subsequente"].choices = [
+ (inst.dispositivo_subsequente.pk, inst.dispositivo_subsequente)
+ ]
if inst.dispositivo_atualizador:
- self.fields['dispositivo_atualizador'].choices = [
- (inst.dispositivo_atualizador.pk,
- inst.dispositivo_atualizador)]
+ self.fields["dispositivo_atualizador"].choices = [
+ (inst.dispositivo_atualizador.pk, inst.dispositivo_atualizador)
+ ]
def clean(self):
super(DispositivoEdicaoAlteracaoForm, self).clean()
@@ -1268,38 +1380,66 @@ class DispositivoEdicaoAlteracaoForm(ModelForm):
"""
data = self.cleaned_data
- dst = data['dispositivo_substituido']
- dsq = data['dispositivo_subsequente']
- da = data['dispositivo_atualizador']
+ dst = data["dispositivo_substituido"]
+ dsq = data["dispositivo_subsequente"]
+ da = data["dispositivo_atualizador"]
if dst == self.instance:
- raise ValidationError(_('Não é permitido selecionar o próprio '
- 'Dispositivo como seu substituto.'))
+ raise ValidationError(
+ _(
+ "Não é permitido selecionar o próprio "
+ "Dispositivo como seu substituto."
+ )
+ )
if dst and dst.ta != self.instance.ta:
- raise ValidationError(_('Não é permitido selecionar um '
- 'Dispositivo de outro Texto Articulado.'))
+ raise ValidationError(
+ _(
+ "Não é permitido selecionar um "
+ "Dispositivo de outro Texto Articulado."
+ )
+ )
if dst and dst.tipo_dispositivo != self.instance.tipo_dispositivo:
- raise ValidationError(_('Não é permitido selecionar um '
- 'Dispositivo de outro Tipo.'))
+ raise ValidationError(
+ _("Não é permitido selecionar um " "Dispositivo de outro Tipo.")
+ )
if dsq == self.instance:
- raise ValidationError(_('Não é permitido selecionar o próprio '
- 'Dispositivo como seu subsequente.'))
+ raise ValidationError(
+ _(
+ "Não é permitido selecionar o próprio "
+ "Dispositivo como seu subsequente."
+ )
+ )
if dsq and dsq.ta != self.instance.ta:
- raise ValidationError(_('Não é permitido selecionar um '
- 'Dispositivo de outro Texto Articulado.'))
+ raise ValidationError(
+ _(
+ "Não é permitido selecionar um "
+ "Dispositivo de outro Texto Articulado."
+ )
+ )
if dsq and dsq.tipo_dispositivo != self.instance.tipo_dispositivo:
- raise ValidationError(_('Não é permitido selecionar um '
- 'Dispositivo de outro Tipo.'))
+ raise ValidationError(
+ _("Não é permitido selecionar um " "Dispositivo de outro Tipo.")
+ )
- if da and not (da.tipo_dispositivo.dispositivo_de_alteracao and
- da.tipo_dispositivo.dispositivo_de_articulacao):
- raise ValidationError(_('O Dispositivo de Atualização selecionado '
- 'não é um Bloco de Alteração.'))
+ if da and not (
+ da.tipo_dispositivo.dispositivo_de_alteracao
+ and da.tipo_dispositivo.dispositivo_de_articulacao
+ ):
+ raise ValidationError(
+ _(
+ "O Dispositivo de Atualização selecionado "
+ "não é um Bloco de Alteração."
+ )
+ )
if not da and dst:
- raise ValidationError(_('Não é permitido substituir um '
- 'Dispositivo sem haver um '
- 'Dispositivo Alterador.'))
+ raise ValidationError(
+ _(
+ "Não é permitido substituir um "
+ "Dispositivo sem haver um "
+ "Dispositivo Alterador."
+ )
+ )
"""if dst.inicio_vigencia > self.instance.inicio_vigencia:
raise ValidationError(_('Não é permitido substituir um '
@@ -1321,9 +1461,9 @@ class DispositivoEdicaoAlteracaoForm(ModelForm):
od = Dispositivo.objects.get(pk=self.instance.pk)
nd = self.instance
- ndst = data['dispositivo_substituido']
- ndsq = data['dispositivo_subsequente']
- nda = data['dispositivo_atualizador']
+ ndst = data["dispositivo_substituido"]
+ ndsq = data["dispositivo_subsequente"]
+ nda = data["dispositivo_atualizador"]
# Se o dispositivo substituído foi trocado na edição
if ndst != od.dispositivo_substituido:
@@ -1372,31 +1512,43 @@ class DispositivoEdicaoAlteracaoForm(ModelForm):
super(DispositivoEdicaoAlteracaoForm, self).save()
if nd.dispositivo_subsequente:
- nd.fim_vigencia = nd.dispositivo_subsequente.inicio_vigencia - \
- timedelta(days=1)
- nd.fim_eficacia = nd.dispositivo_subsequente.inicio_eficacia - \
- timedelta(days=1)
+ nd.fim_vigencia = nd.dispositivo_subsequente.inicio_vigencia - timedelta(
+ days=1
+ )
+ nd.fim_eficacia = nd.dispositivo_subsequente.inicio_eficacia - timedelta(
+ days=1
+ )
nd.save()
class TextNotificacoesForm(Form):
-
type_notificacoes = forms.MultipleChoiceField(
- label=_('Níveis de Notificações'),
- choices=[('default', _('Dispositivos sem Notificações!')),
- ('success', _('Informações!')),
- ('info', _('Boas Práticas!')),
- ('warning', _('Alertas!')),
- ('danger', _('Erros!'))],
+ label=_("Níveis de Notificações"),
+ choices=[
+ ("default", _("Dispositivos sem Notificações!")),
+ ("success", _("Informações!")),
+ ("info", _("Boas Práticas!")),
+ ("warning", _("Alertas!")),
+ ("danger", _("Erros!")),
+ ],
required=False,
- widget=widgets.CheckboxSelectMultiple())
+ widget=widgets.CheckboxSelectMultiple(),
+ )
def __init__(self, *args, **kwargs):
-
- field_type_notificacoes = to_row([(InlineCheckboxes(
- 'type_notificacoes'), 10),
- (Submit('submit-form', _('Filtrar'),
- css_class='btn btn-primary float-right'), 2)])
+ field_type_notificacoes = to_row(
+ [
+ (InlineCheckboxes("type_notificacoes"), 10),
+ (
+ Submit(
+ "submit-form",
+ _("Filtrar"),
+ css_class="btn btn-primary float-right",
+ ),
+ 2,
+ ),
+ ]
+ )
self.helper = SaplFormHelper()
self.helper.layout = Layout(field_type_notificacoes)
@@ -1405,155 +1557,166 @@ class TextNotificacoesForm(Form):
class DispositivoRegistroAlteracaoForm(Form):
-
dispositivo_alterado = forms.ModelChoiceField(
- label=_('Dispositivo a ser alterado'),
+ label=_("Dispositivo a ser alterado"),
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
- dispositivo_search_form = forms.CharField(widget=forms.HiddenInput(),
- required=False)
+ dispositivo_search_form = forms.CharField(
+ widget=forms.HiddenInput(), required=False
+ )
def __init__(self, *args, **kwargs):
-
layout = []
- kwargs.pop('instance')
- kwargs['initial'].pop('editor_type')
+ kwargs.pop("instance")
+ kwargs["initial"].pop("editor_type")
row_dispositivo = Field(
- 'dispositivo_alterado',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_alterado',
- data_type_selection='checkbox',
- template="compilacao/layout/dispositivo_radio.html")
-
- layout.append(Fieldset(_('Registro de Alteração - '
- 'Seleção do Dispositivo a ser alterado'),
- row_dispositivo,
- css_class="col-md-12"))
- layout.append(Field('dispositivo_search_form'))
+ "dispositivo_alterado",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_alterado",
+ data_type_selection="checkbox",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
+
+ layout.append(
+ Fieldset(
+ _("Registro de Alteração - " "Seleção do Dispositivo a ser alterado"),
+ row_dispositivo,
+ css_class="col-md-12",
+ )
+ )
+ layout.append(Field("dispositivo_search_form"))
more = [
- HTML('%s' %
- _('Cancelar')),
+ HTML('%s' % _("Cancelar")),
]
- more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
+ more.append(Submit("salvar", _("Salvar"), css_class="float-right"))
- buttons = FormActions(*more, css_class='form-group')
+ buttons = FormActions(*more, css_class="form-group")
- _fields = [Div(*layout, css_class="row")] + \
- [to_row([(buttons, 12)])]
+ _fields = [Div(*layout, css_class="row")] + [to_row([(buttons, 12)])]
self.helper = SaplFormHelper()
self.helper.layout = Layout(*_fields)
super(DispositivoRegistroAlteracaoForm, self).__init__(*args, **kwargs)
- self.fields['dispositivo_alterado'].choices = []
+ self.fields["dispositivo_alterado"].choices = []
class DispositivoRegistroRevogacaoForm(Form):
-
dispositivo_revogado = forms.ModelChoiceField(
- label=_('Dispositivo a ser revogado'),
+ label=_("Dispositivo a ser revogado"),
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
revogacao_em_bloco = forms.ChoiceField(
label=_(
- 'Revogar todos os dispositivos internos dos '
- 'dispositivos abaixo selecionados?'),
+ "Revogar todos os dispositivos internos dos "
+ "dispositivos abaixo selecionados?"
+ ),
choices=YES_NO_CHOICES,
widget=forms.RadioSelect(),
- required=True)
+ required=True,
+ )
- dispositivo_search_form = forms.CharField(widget=forms.HiddenInput(),
- required=False)
+ dispositivo_search_form = forms.CharField(
+ widget=forms.HiddenInput(), required=False
+ )
def __init__(self, *args, **kwargs):
-
layout = []
- kwargs.pop('instance')
- kwargs['initial'].pop('editor_type')
+ kwargs.pop("instance")
+ kwargs["initial"].pop("editor_type")
row_dispositivo = Field(
- 'dispositivo_revogado',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_revogado',
- data_type_selection='checkbox',
- template="compilacao/layout/dispositivo_radio.html")
-
- layout.append(Fieldset(_('Registro de Revogação - '
- 'Seleção do Dispositivo a ser Revogado'),
- Field(InlineRadios('revogacao_em_bloco')),
- row_dispositivo,
- css_class="col-md-12"))
- layout.append(Field('dispositivo_search_form'))
+ "dispositivo_revogado",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_revogado",
+ data_type_selection="checkbox",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
+
+ layout.append(
+ Fieldset(
+ _("Registro de Revogação - " "Seleção do Dispositivo a ser Revogado"),
+ Field(InlineRadios("revogacao_em_bloco")),
+ row_dispositivo,
+ css_class="col-md-12",
+ )
+ )
+ layout.append(Field("dispositivo_search_form"))
more = [
- HTML('%s' %
- _('Cancelar')),
+ HTML('%s' % _("Cancelar")),
]
- more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
+ more.append(Submit("salvar", _("Salvar"), css_class="float-right"))
- buttons = FormActions(*more, css_class='form-group')
+ buttons = FormActions(*more, css_class="form-group")
- _fields = [Div(*layout, css_class="row")] + \
- [to_row([(buttons, 12)])]
+ _fields = [Div(*layout, css_class="row")] + [to_row([(buttons, 12)])]
self.helper = SaplFormHelper()
self.helper.layout = Layout(*_fields)
super(DispositivoRegistroRevogacaoForm, self).__init__(*args, **kwargs)
- self.fields['dispositivo_revogado'].choices = []
+ self.fields["dispositivo_revogado"].choices = []
class DispositivoRegistroInclusaoForm(Form):
-
dispositivo_base_para_inclusao = forms.ModelChoiceField(
- label=_('Dispositivo Base para inclusão de novo dispositivo'),
+ label=_("Dispositivo Base para inclusão de novo dispositivo"),
required=False,
- queryset=Dispositivo.objects.all())
+ queryset=Dispositivo.objects.all(),
+ )
- dispositivo_search_form = forms.CharField(widget=forms.HiddenInput(),
- required=False)
+ dispositivo_search_form = forms.CharField(
+ widget=forms.HiddenInput(), required=False
+ )
def __init__(self, *args, **kwargs):
-
layout = []
- kwargs.pop('instance')
- kwargs['initial'].pop('editor_type')
+ kwargs.pop("instance")
+ kwargs["initial"].pop("editor_type")
row_dispositivo = Field(
- 'dispositivo_base_para_inclusao',
- data_sapl_ta='DispositivoSearch',
- data_field='dispositivo_base_para_inclusao',
- data_type_selection='checkbox',
- template="compilacao/layout/dispositivo_radio.html")
-
- layout.append(Fieldset(_('Registro de Inclusão - '
- 'Seleção do Dispositivo Base para inclusão '
- 'de novo dispositivo.'),
- row_dispositivo,
- css_class="col-md-12"))
- layout.append(Field('dispositivo_search_form'))
+ "dispositivo_base_para_inclusao",
+ data_sapl_ta="DispositivoSearch",
+ data_field="dispositivo_base_para_inclusao",
+ data_type_selection="checkbox",
+ template="compilacao/layout/dispositivo_radio.html",
+ )
+
+ layout.append(
+ Fieldset(
+ _(
+ "Registro de Inclusão - "
+ "Seleção do Dispositivo Base para inclusão "
+ "de novo dispositivo."
+ ),
+ row_dispositivo,
+ css_class="col-md-12",
+ )
+ )
+ layout.append(Field("dispositivo_search_form"))
layout.append(Div(css_class="allowed_inserts col-md-12"))
more = [
- HTML('%s' %
- _('Cancelar')),
+ HTML('%s' % _("Cancelar")),
]
# more.append(Submit('salvar', _('Salvar'), css_class='float-right'))
- buttons = FormActions(*more, css_class='form-group')
+ buttons = FormActions(*more, css_class="form-group")
- _fields = [Div(*layout, css_class="row")] + \
- [to_row([(buttons, 12)])]
+ _fields = [Div(*layout, css_class="row")] + [to_row([(buttons, 12)])]
self.helper = SaplFormHelper()
self.helper.layout = Layout(*_fields)
super(DispositivoRegistroInclusaoForm, self).__init__(*args, **kwargs)
- self.fields['dispositivo_base_para_inclusao'].choices = []
+ self.fields["dispositivo_base_para_inclusao"].choices = []
diff --git a/sapl/compilacao/models.py b/sapl/compilacao/models.py
index 42e06cbb1..c179a0b16 100644
--- a/sapl/compilacao/models.py
+++ b/sapl/compilacao/models.py
@@ -15,23 +15,23 @@ from image_cropping.fields import ImageCropField, ImageRatioField
from sapl.compilacao.utils import (get_integrations_view_names, int_to_letter,
int_to_roman)
-from sapl.utils import YES_NO_CHOICES, get_settings_auth_user_model,\
- texto_upload_path, restringe_tipos_de_arquivo_img
+from sapl.utils import (YES_NO_CHOICES, get_settings_auth_user_model,
+ restringe_tipos_de_arquivo_img, texto_upload_path)
class TimestampedMixin(models.Model):
created = models.DateTimeField(
- verbose_name=_('created'),
- editable=False, blank=True, auto_now_add=True)
+ verbose_name=_("created"), editable=False, blank=True, auto_now_add=True
+ )
modified = models.DateTimeField(
- verbose_name=_('modified'), editable=False, blank=True, auto_now=True)
+ verbose_name=_("modified"), editable=False, blank=True, auto_now=True
+ )
class Meta:
abstract = True
class BaseModel(models.Model):
-
class Meta:
abstract = True
@@ -50,28 +50,39 @@ class BaseModel(models.Model):
for field_name in field_tuple:
field_value = getattr(self, field_name)
if getattr(self, field_name) is None:
- unique_filter['%s__isnull' % field_name] = True
+ unique_filter["%s__isnull" % field_name] = True
null_found = True
else:
- unique_filter['%s' % field_name] = field_value
+ unique_filter["%s" % field_name] = field_value
unique_fields.append(field_name)
if null_found:
- unique_queryset = self.__class__.objects.filter(
- **unique_filter)
+ unique_queryset = self.__class__.objects.filter(**unique_filter)
if self.pk:
unique_queryset = unique_queryset.exclude(pk=self.pk)
if unique_queryset.exists():
msg = self.unique_error_message(
- self.__class__, tuple(unique_fields))
+ self.__class__, tuple(unique_fields)
+ )
raise ValidationError(msg)
- def save(self, force_insert=False, force_update=False, using=None,
- update_fields=None, clean=True):
+ def save(
+ self,
+ force_insert=False,
+ force_update=False,
+ using=None,
+ update_fields=None,
+ clean=True,
+ ):
# método clean não pode ser chamado no caso do save que está sendo
# executado é o save de revision_pre_delete_signal
import inspect
- funcs = list(filter(lambda x: x == 'revision_pre_delete_signal',
- map(lambda x: x[3], inspect.stack())))
+
+ funcs = list(
+ filter(
+ lambda x: x == "revision_pre_delete_signal",
+ map(lambda x: x[3], inspect.stack()),
+ )
+ )
if clean and not funcs:
self.clean()
@@ -81,29 +92,32 @@ class BaseModel(models.Model):
force_insert=force_insert,
force_update=force_update,
using=using,
- update_fields=update_fields)
+ update_fields=update_fields,
+ )
class PerfilEstruturalTextoArticulado(BaseModel):
- sigla = models.CharField(
- max_length=10, unique=True, verbose_name=_('Sigla'))
- nome = models.CharField(max_length=50, verbose_name=_('Nome'))
+ sigla = models.CharField(max_length=10, unique=True, verbose_name=_("Sigla"))
+ nome = models.CharField(max_length=50, verbose_name=_("Nome"))
padrao = models.BooleanField(
- default=False,
- choices=YES_NO_CHOICES, verbose_name=_('Padrão'))
+ default=False, choices=YES_NO_CHOICES, verbose_name=_("Padrão")
+ )
parent = models.ForeignKey(
- 'self',
- blank=True, null=True, default=None,
- related_name='perfil_parent_set',
+ "self",
+ blank=True,
+ null=True,
+ default=None,
+ related_name="perfil_parent_set",
on_delete=PROTECT,
- verbose_name=_('Perfil Herdado'))
+ verbose_name=_("Perfil Herdado"),
+ )
class Meta:
- verbose_name = _('Perfil Estrutural de Texto Articulado')
- verbose_name_plural = _('Perfis Estruturais de Textos Articulados')
+ verbose_name = _("Perfil Estrutural de Texto Articulado")
+ verbose_name_plural = _("Perfis Estruturais de Textos Articulados")
- ordering = ['-padrao', 'sigla']
+ ordering = ["-padrao", "sigla"]
def __str__(self):
return self.nome
@@ -113,57 +127,72 @@ class PerfilEstruturalTextoArticulado(BaseModel):
if not self.parent:
return []
- parents = self.parent.parents + [self.parent, ]
+ parents = self.parent.parents + [
+ self.parent,
+ ]
return parents
class TipoTextoArticulado(models.Model):
- sigla = models.CharField(max_length=3, verbose_name=_('Sigla'))
- descricao = models.CharField(max_length=50, verbose_name=_('Descrição'))
+ sigla = models.CharField(max_length=3, verbose_name=_("Sigla"))
+ descricao = models.CharField(max_length=50, verbose_name=_("Descrição"))
content_type = models.OneToOneField(
ContentType,
- blank=True, null=True,
+ blank=True,
+ null=True,
on_delete=models.SET_NULL,
- verbose_name=_('Modelo Integrado'))
+ verbose_name=_("Modelo Integrado"),
+ )
participacao_social = models.BooleanField(
- blank=False, default=False,
+ blank=False,
+ default=False,
choices=YES_NO_CHOICES,
- verbose_name=_('Participação Social'))
+ verbose_name=_("Participação Social"),
+ )
publicacao_func = models.BooleanField(
choices=YES_NO_CHOICES,
- blank=False, default=False,
- verbose_name=_('Histórico de Publicação'))
+ blank=False,
+ default=False,
+ verbose_name=_("Histórico de Publicação"),
+ )
perfis = models.ManyToManyField(
PerfilEstruturalTextoArticulado,
- blank=True, verbose_name=_('Perfis Estruturais de Textos Articulados'),
- help_text=_("""
+ blank=True,
+ verbose_name=_("Perfis Estruturais de Textos Articulados"),
+ help_text=_(
+ """
Apenas os perfis selecionados aqui estarão disponíveis
para o editor de Textos Articulados cujo Tipo seja este
em edição.
- """))
+ """
+ ),
+ )
rodape_global = models.TextField(
- verbose_name=_('Rodapé Global'),
- help_text=_('A cada Tipo de Texto Articulado pode ser adicionado '
- 'uma nota global de rodapé!'),
- default=''
+ verbose_name=_("Rodapé Global"),
+ help_text=_(
+ "A cada Tipo de Texto Articulado pode ser adicionado "
+ "uma nota global de rodapé!"
+ ),
+ default="",
)
class Meta:
- verbose_name = _('Tipo de Texto Articulado')
- verbose_name_plural = _('Tipos de Texto Articulados')
- ordering = ('id',)
+ verbose_name = _("Tipo de Texto Articulado")
+ verbose_name_plural = _("Tipos de Texto Articulados")
+ ordering = ("id",)
def __str__(self):
return self.descricao
PARTICIPACAO_SOCIAL_CHOICES = [
- (None, _('Padrão definido no Tipo')),
- (True, _('Sim')),
- (False, _('Não'))]
+ (None, _("Padrão definido no Tipo")),
+ (True, _("Sim")),
+ (False, _("Não")),
+]
STATUS_TA_PRIVATE = 99 # Só os donos podem ver
@@ -175,44 +204,34 @@ STATUS_TA_IMMUTABLE_PUBLIC = 69
STATUS_TA_PUBLIC = 0
PRIVACIDADE_STATUS = (
- (STATUS_TA_PRIVATE, _('Privado')), # só dono ve e edita
+ (STATUS_TA_PRIVATE, _("Privado")), # só dono ve e edita
# só quem tem permissão para ver
- (STATUS_TA_IMMUTABLE_RESTRICT, _('Imotável Restrito')),
+ (STATUS_TA_IMMUTABLE_RESTRICT, _("Imotável Restrito")),
# só quem tem permissão para ver
- (STATUS_TA_IMMUTABLE_PUBLIC, _('Imutável Público')),
- (STATUS_TA_EDITION, _('Em Edição')), # só quem tem permissão para editar
- (STATUS_TA_PUBLIC, _('Público')), # visualização pública
+ (STATUS_TA_IMMUTABLE_PUBLIC, _("Imutável Público")),
+ (STATUS_TA_EDITION, _("Em Edição")), # só quem tem permissão para editar
+ (STATUS_TA_PUBLIC, _("Público")), # visualização pública
)
class TextoArticulado(TimestampedMixin):
- data = models.DateField(
- blank=True,
- null=True,
- verbose_name=_('Data')
- )
+ data = models.DateField(blank=True, null=True, verbose_name=_("Data"))
- ementa = models.TextField(verbose_name=_('Ementa'))
+ ementa = models.TextField(verbose_name=_("Ementa"))
- observacao = models.TextField(
- blank=True,
- verbose_name=_('Observação')
- )
+ observacao = models.TextField(blank=True, verbose_name=_("Observação"))
- numero = models.CharField(
- max_length=8,
- verbose_name=_('Número')
- )
+ numero = models.CharField(max_length=8, verbose_name=_("Número"))
- ano = models.PositiveSmallIntegerField(verbose_name=_('Ano'))
+ ano = models.PositiveSmallIntegerField(verbose_name=_("Ano"))
tipo_ta = models.ForeignKey(
TipoTextoArticulado,
blank=True,
null=True,
default=None,
- verbose_name=_('Tipo de Texto Articulado'),
- on_delete=models.PROTECT
+ verbose_name=_("Tipo de Texto Articulado"),
+ on_delete=models.PROTECT,
)
participacao_social = models.BooleanField(
@@ -220,93 +239,93 @@ class TextoArticulado(TimestampedMixin):
null=True,
default=False,
choices=PARTICIPACAO_SOCIAL_CHOICES,
- verbose_name=_('Participação Social')
+ verbose_name=_("Participação Social"),
)
content_type = models.ForeignKey(
- ContentType,
- blank=True,
- null=True,
- default=None,
- on_delete=models.PROTECT
+ ContentType, blank=True, null=True, default=None, on_delete=models.PROTECT
)
- object_id = models.PositiveIntegerField(
- blank=True,
- null=True,
- default=None)
+ object_id = models.PositiveIntegerField(blank=True, null=True, default=None)
- content_object = GenericForeignKey('content_type', 'object_id')
+ content_object = GenericForeignKey("content_type", "object_id")
owners = models.ManyToManyField(
get_settings_auth_user_model(),
blank=True,
- verbose_name=_('Donos do Texto Articulado')
+ verbose_name=_("Donos do Texto Articulado"),
)
editable_only_by_owners = models.BooleanField(
choices=YES_NO_CHOICES,
default=True,
- verbose_name=_('Editável apenas pelos donos do Texto Articulado?')
+ verbose_name=_("Editável apenas pelos donos do Texto Articulado?"),
)
editing_locked = models.BooleanField(
choices=YES_NO_CHOICES,
default=True,
- verbose_name=_('Texto Articulado em Edição?')
+ verbose_name=_("Texto Articulado em Edição?"),
)
privacidade = models.IntegerField(
- _('Privacidade'),
- choices=PRIVACIDADE_STATUS,
- default=STATUS_TA_PRIVATE
+ _("Privacidade"), choices=PRIVACIDADE_STATUS, default=STATUS_TA_PRIVATE
)
class Meta:
- verbose_name = _('Texto Articulado')
- verbose_name_plural = _('Textos Articulados')
- ordering = ['-data', '-numero']
+ verbose_name = _("Texto Articulado")
+ verbose_name_plural = _("Textos Articulados")
+ ordering = ["-data", "-numero"]
permissions = (
- ('view_restricted_textoarticulado',
- _('Pode ver qualquer Texto Articulado')),
- ('lock_unlock_textoarticulado',
- _('Pode bloquear/desbloquear edição de Texto Articulado')),
+ (
+ "view_restricted_textoarticulado",
+ _("Pode ver qualquer Texto Articulado"),
+ ),
+ (
+ "lock_unlock_textoarticulado",
+ _("Pode bloquear/desbloquear edição de Texto Articulado"),
+ ),
)
def __str__(self):
if self.content_object:
- assert hasattr(self.content_object, 'epigrafe'), _(
- 'Modelos integrados aos Textos Articulados devem possuir a '
- 'property "epigrafe"')
+ assert hasattr(self.content_object, "epigrafe"), _(
+ "Modelos integrados aos Textos Articulados devem possuir a "
+ 'property "epigrafe"'
+ )
return str(self.content_object.epigrafe)
else:
numero = self.numero
if numero.isnumeric():
- numero = '{0:,}'.format(int(self.numero)).replace(',', '.')
+ numero = "{0:,}".format(int(self.numero)).replace(",", ".")
- return _('%(tipo)s nº %(numero)s, de %(data)s') % {
- 'tipo': self.tipo_ta,
- 'numero': numero,
- 'data': defaultfilters.date(self.data, r"d \d\e F \d\e Y").lower()}
+ return _("%(tipo)s nº %(numero)s, de %(data)s") % {
+ "tipo": self.tipo_ta,
+ "numero": numero,
+ "data": defaultfilters.date(self.data, r"d \d\e F \d\e Y").lower(),
+ }
def hash(self):
- from django.core import serializers
import hashlib
+
+ from django.core import serializers
+
data = serializers.serialize(
- "xml", Dispositivo.objects.filter(
- Q(ta_id=self.id) | Q(ta_publicado_id=self.id)))
+ "xml",
+ Dispositivo.objects.filter(Q(ta_id=self.id) | Q(ta_publicado_id=self.id)),
+ )
md5 = hashlib.md5()
- md5.update(data.encode('utf-8'))
+ md5.update(data.encode("utf-8"))
return md5.hexdigest()
def can_use_dynamic_editing(self, user):
- return not self.editing_locked and\
- (not self.editable_only_by_owners and
- user.has_perm(
- 'compilacao.change_dispositivo_edicao_dinamica') or
- self.editable_only_by_owners and user in self.owners.all() and
- user.has_perm(
- 'compilacao.change_your_dispositivo_edicao_dinamica'))
+ return not self.editing_locked and (
+ not self.editable_only_by_owners
+ and user.has_perm("compilacao.change_dispositivo_edicao_dinamica")
+ or self.editable_only_by_owners
+ and user in self.owners.all()
+ and user.has_perm("compilacao.change_your_dispositivo_edicao_dinamica")
+ )
def has_view_permission(self, request=None):
if self.privacidade in (STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PUBLIC):
@@ -318,18 +337,16 @@ class TextoArticulado(TimestampedMixin):
if request.user in self.owners.all():
return True
- if self.privacidade == STATUS_TA_IMMUTABLE_RESTRICT and\
- request.user.has_perm(
- 'compilacao.view_restricted_textoarticulado'):
+ if self.privacidade == STATUS_TA_IMMUTABLE_RESTRICT and request.user.has_perm(
+ "compilacao.view_restricted_textoarticulado"
+ ):
return True
elif self.privacidade == STATUS_TA_EDITION:
- if request.user.has_perm(
- 'compilacao.change_dispositivo_edicao_dinamica'):
+ if request.user.has_perm("compilacao.change_dispositivo_edicao_dinamica"):
return True
else:
- messages.error(request, _(
- 'Este Texto Articulado está em edição.'))
+ messages.error(request, _("Este Texto Articulado está em edição."))
elif self.privacidade == STATUS_TA_PRIVATE:
if request.user in self.owners.all():
@@ -340,50 +357,59 @@ class TextoArticulado(TimestampedMixin):
return False
def has_edit_permission(self, request):
-
if self.privacidade == STATUS_TA_PRIVATE:
if request.user not in self.owners.all():
raise Http404()
if not self.can_use_dynamic_editing(request.user):
- messages.error(request, _(
- 'Usuário sem permissão para edição.'))
+ messages.error(request, _("Usuário sem permissão para edição."))
return False
else:
return True
if self.privacidade == STATUS_TA_IMMUTABLE_RESTRICT:
- messages.error(request, _(
- 'A edição deste Texto Articulado está bloqueada. '
- 'Este documento é imutável e de acesso é restrito.'))
+ messages.error(
+ request,
+ _(
+ "A edição deste Texto Articulado está bloqueada. "
+ "Este documento é imutável e de acesso é restrito."
+ ),
+ )
return False
if self.privacidade == STATUS_TA_IMMUTABLE_PUBLIC:
- messages.error(request, _(
- 'A edição deste Texto Articulado está bloqueada. '
- 'Este documento é imutável.'))
+ messages.error(
+ request,
+ _(
+ "A edição deste Texto Articulado está bloqueada. "
+ "Este documento é imutável."
+ ),
+ )
return False
- if self.editing_locked and\
- self.privacidade in (STATUS_TA_PUBLIC, STATUS_TA_EDITION) and\
- not request.user.has_perm(
- 'compilacao.lock_unlock_textoarticulado'):
- messages.error(request, _(
- 'A edição deste Texto Articulado está bloqueada. '
- 'É necessário acessar com usuário que possui '
- 'permissão de desbloqueio.'))
+ if (
+ self.editing_locked
+ and self.privacidade in (STATUS_TA_PUBLIC, STATUS_TA_EDITION)
+ and not request.user.has_perm("compilacao.lock_unlock_textoarticulado")
+ ):
+ messages.error(
+ request,
+ _(
+ "A edição deste Texto Articulado está bloqueada. "
+ "É necessário acessar com usuário que possui "
+ "permissão de desbloqueio."
+ ),
+ )
return False
- if not request.user.has_perm(
- 'compilacao.change_dispositivo_edicao_dinamica'):
- messages.error(request, _(
- 'Usuário sem permissão para edição.'))
+ if not request.user.has_perm("compilacao.change_dispositivo_edicao_dinamica"):
+ messages.error(request, _("Usuário sem permissão para edição."))
return False
- if self.editable_only_by_owners and\
- request.user not in self.owners.all():
- messages.error(request, _(
- 'Apenas usuários donos do Texto Articulado podem editá-lo.'))
+ if self.editable_only_by_owners and request.user not in self.owners.all():
+ messages.error(
+ request, _("Apenas usuários donos do Texto Articulado podem editá-lo.")
+ )
return False
return True
@@ -391,57 +417,58 @@ class TextoArticulado(TimestampedMixin):
@classonlymethod
def update_or_create(cls, view_integracao, obj):
map_fields = view_integracao.map_fields
- ta_values = getattr(view_integracao, 'ta_values', {})
+ ta_values = getattr(view_integracao, "ta_values", {})
related_object_type = ContentType.objects.get_for_model(obj)
ta = TextoArticulado.objects.filter(
- object_id=obj.pk,
- content_type=related_object_type)
+ object_id=obj.pk, content_type=related_object_type
+ )
ta_exists = bool(ta.exists())
if not ta_exists:
tipo_ta = TipoTextoArticulado.objects.filter(
- content_type=related_object_type).first()
+ content_type=related_object_type
+ ).first()
ta = TextoArticulado()
ta.tipo_ta = tipo_ta
ta.content_object = obj
- ta.privacidade = ta_values.get('privacidade', STATUS_TA_EDITION)
- ta.editing_locked = ta_values.get('editing_locked', False)
- ta.editable_only_by_owners = ta_values.get(
- 'editable_only_by_owners', False)
+ ta.privacidade = ta_values.get("privacidade", STATUS_TA_EDITION)
+ ta.editing_locked = ta_values.get("editing_locked", False)
+ ta.editable_only_by_owners = ta_values.get("editable_only_by_owners", False)
else:
ta = ta[0]
if not ta.data:
- ta.data = getattr(obj, map_fields['data']
- if map_fields['data'] else 'xxx',
- timezone.now())
+ ta.data = getattr(
+ obj, map_fields["data"] if map_fields["data"] else "xxx", timezone.now()
+ )
if not ta.data:
ta.data = timezone.now()
ta.ementa = getattr(
- obj, map_fields['ementa']
- if map_fields['ementa'] else 'xxx', _(
- 'Integração com %s sem ementa.') % obj)
+ obj,
+ map_fields["ementa"] if map_fields["ementa"] else "xxx",
+ _("Integração com %s sem ementa.") % obj,
+ )
ta.observacao = getattr(
- obj, map_fields['observacao']
- if map_fields['observacao'] else 'xxx', '')
+ obj, map_fields["observacao"] if map_fields["observacao"] else "xxx", ""
+ )
now = timezone.now()
ta.numero = getattr(
- obj, map_fields['numero']
- if map_fields['numero'] else 'xxx', int('%s%s%s' % (
- int(now.year),
- int(now.month),
- int(now.day))))
+ obj,
+ map_fields["numero"] if map_fields["numero"] else "xxx",
+ int("%s%s%s" % (int(now.year), int(now.month), int(now.day))),
+ )
- ta.ano = getattr(obj, map_fields['ano']
- if map_fields['ano'] else 'xxx', now.year)
+ ta.ano = getattr(
+ obj, map_fields["ano"] if map_fields["ano"] else "xxx", now.year
+ )
ta.save()
return ta
@@ -452,26 +479,28 @@ class TextoArticulado(TimestampedMixin):
# Os dispositivos a clonar será com base no Texto Articulado
assert self.tipo_ta and self.tipo_ta.content_type, _(
- 'Não é permitido chamar o método clone_for '
- 'para Textos Articulados independentes.')
+ "Não é permitido chamar o método clone_for "
+ "para Textos Articulados independentes."
+ )
- view_integracao = list(filter(lambda x:
- x.model == obj._meta.model,
- get_integrations_view_names()))
+ view_integracao = list(
+ filter(lambda x: x.model == obj._meta.model, get_integrations_view_names())
+ )
assert len(view_integracao) > 0, _(
- 'Não é permitido chamar o método clone_for '
- 'se não existe integração.')
+ "Não é permitido chamar o método clone_for " "se não existe integração."
+ )
assert len(view_integracao) == 1, _(
- 'Não é permitido haver mais de uma integração para um Model.')
+ "Não é permitido haver mais de uma integração para um Model."
+ )
view_integracao = view_integracao[0]
origem = self
destino = TextoArticulado.update_or_create(view_integracao, obj)
- dispositivos = Dispositivo.objects.filter(ta=origem).order_by('ordem')
+ dispositivos = Dispositivo.objects.filter(ta=origem).order_by("ordem")
with transaction.atomic():
map_ids = {}
@@ -496,8 +525,7 @@ class TextoArticulado(TimestampedMixin):
d.save()
map_ids[id_old] = d.id
- dispositivos = Dispositivo.objects.filter(
- ta=destino).order_by('ordem')
+ dispositivos = Dispositivo.objects.filter(ta=destino).order_by("ordem")
for d in dispositivos:
if not d.dispositivo_pai:
@@ -508,17 +536,19 @@ class TextoArticulado(TimestampedMixin):
return destino
def reagrupar_ordem_de_dispositivos(self):
-
dpts = Dispositivo.objects.filter(ta=self)
if not dpts.exists():
return
ordem_max = dpts.last().ordem
- dpts.update(ordem=F('ordem') + ordem_max)
+ dpts.update(ordem=F("ordem") + ordem_max)
- dpts = Dispositivo.objects.filter(
- ta=self).values_list('pk', flat=True).order_by('ordem')
+ dpts = (
+ Dispositivo.objects.filter(ta=self)
+ .values_list("pk", flat=True)
+ .order_by("ordem")
+ )
count = 0
for d in dpts:
@@ -526,19 +556,19 @@ class TextoArticulado(TimestampedMixin):
Dispositivo.objects.filter(pk=d).update(ordem=count)
def reordenar_dispositivos(self):
-
dpts = Dispositivo.objects.filter(ta=self)
if not dpts.exists():
return
ordem_max = dpts.last().ordem
- dpts.update(ordem=F('ordem') + ordem_max)
+ dpts.update(ordem=F("ordem") + ordem_max)
- raizes = Dispositivo.objects.filter(
- ta=self,
- dispositivo_pai__isnull=True).values_list(
- 'pk', flat=True).order_by('ordem')
+ raizes = (
+ Dispositivo.objects.filter(ta=self, dispositivo_pai__isnull=True)
+ .values_list("pk", flat=True)
+ .order_by("ordem")
+ )
count = []
count.append(Dispositivo.INTERVALO_ORDEM)
@@ -546,9 +576,11 @@ class TextoArticulado(TimestampedMixin):
def update(dpk):
Dispositivo.objects.filter(pk=dpk).update(ordem=count[0])
count[0] = count[0] + Dispositivo.INTERVALO_ORDEM
- filhos = Dispositivo.objects.filter(
- dispositivo_pai_id=dpk).values_list(
- 'pk', flat=True).order_by('ordem')
+ filhos = (
+ Dispositivo.objects.filter(dispositivo_pai_id=dpk)
+ .values_list("pk", flat=True)
+ .order_by("ordem")
+ )
for dpk in filhos:
update(dpk)
@@ -558,33 +590,30 @@ class TextoArticulado(TimestampedMixin):
class TipoNota(models.Model):
- sigla = models.CharField(
- max_length=10, unique=True, verbose_name=_('Sigla'))
- nome = models.CharField(max_length=50, verbose_name=_('Nome'))
- modelo = models.TextField(
- blank=True, verbose_name=_('Modelo'))
+ sigla = models.CharField(max_length=10, unique=True, verbose_name=_("Sigla"))
+ nome = models.CharField(max_length=50, verbose_name=_("Nome"))
+ modelo = models.TextField(blank=True, verbose_name=_("Modelo"))
class Meta:
- verbose_name = _('Tipo de Nota')
- verbose_name_plural = _('Tipos de Nota')
- ordering = ('id',)
+ verbose_name = _("Tipo de Nota")
+ verbose_name_plural = _("Tipos de Nota")
+ ordering = ("id",)
def __str__(self):
- return '%s: %s' % (self.sigla, self.nome)
+ return "%s: %s" % (self.sigla, self.nome)
class TipoVide(models.Model):
- sigla = models.CharField(
- max_length=10, unique=True, verbose_name=_('Sigla'))
- nome = models.CharField(max_length=50, verbose_name=_('Nome'))
+ sigla = models.CharField(max_length=10, unique=True, verbose_name=_("Sigla"))
+ nome = models.CharField(max_length=50, verbose_name=_("Nome"))
class Meta:
- verbose_name = _('Tipo de Vide')
- verbose_name_plural = _('Tipos de Vide')
- ordering = ('id',)
+ verbose_name = _("Tipo de Vide")
+ verbose_name_plural = _("Tipos de Vide")
+ ordering = ("id",)
def __str__(self):
- return '%s: %s' % (self.sigla, self.nome)
+ return "%s: %s" % (self.sigla, self.nome)
class TipoDispositivo(BaseModel):
@@ -604,21 +633,22 @@ class TipoDispositivo(BaseModel):
- revogação de dispositivo_de_articulacao revogam todo o conteúdo
"""
- FNC1 = '1'
- FNCI = 'I'
- FNCi = 'i'
- FNCA = 'A'
- FNCa = 'a'
- FNC8 = '*'
- FNCN = 'N'
+
+ FNC1 = "1"
+ FNCI = "I"
+ FNCi = "i"
+ FNCA = "A"
+ FNCa = "a"
+ FNC8 = "*"
+ FNCN = "N"
FORMATO_NUMERACAO_CHOICES = (
- (FNC1, _('1-Numérico')),
- (FNCI, _('I-Romano Maiúsculo')),
- (FNCi, _('i-Romano Minúsculo')),
- (FNCA, _('A-Alfabético Maiúsculo')),
- (FNCa, _('a-Alfabético Minúsculo')),
- (FNC8, _('Tópico - Sem contagem')),
- (FNCN, _('Sem renderização')),
+ (FNC1, _("1-Numérico")),
+ (FNCI, _("I-Romano Maiúsculo")),
+ (FNCi, _("i-Romano Minúsculo")),
+ (FNCA, _("A-Alfabético Maiúsculo")),
+ (FNCa, _("a-Alfabético Minúsculo")),
+ (FNC8, _("Tópico - Sem contagem")),
+ (FNCN, _("Sem renderização")),
)
# Choice básico. Porém pode ser melhorado dando a opção de digitar outro
@@ -629,128 +659,141 @@ class TipoDispositivo(BaseModel):
TNRN = 0
TNR9 = 9
TIPO_NUMERO_ROTULO = (
- (TNRN, _('Numeração Cardinal.')),
- (TNRT, _('Numeração Ordinal.')),
- (TNR9, _('Numeração Ordinal até o item nove.')),
+ (TNRN, _("Numeração Cardinal.")),
+ (TNRT, _("Numeração Ordinal.")),
+ (TNR9, _("Numeração Ordinal até o item nove.")),
)
- nome = models.CharField(
- max_length=50, unique=True, verbose_name=_('Nome'))
+ nome = models.CharField(max_length=50, unique=True, verbose_name=_("Nome"))
class_css = models.CharField(
- blank=True,
- max_length=256,
- verbose_name=_('Classe CSS'))
+ blank=True, max_length=256, verbose_name=_("Classe CSS")
+ )
rotulo_prefixo_html = models.TextField(
- blank=True,
- verbose_name=_('Prefixo html do rótulo'))
+ blank=True, verbose_name=_("Prefixo html do rótulo")
+ )
rotulo_prefixo_texto = models.TextField(
- blank=True,
- verbose_name=_('Prefixo de Edição do rótulo'))
+ blank=True, verbose_name=_("Prefixo de Edição do rótulo")
+ )
rotulo_ordinal = models.IntegerField(
- choices=TIPO_NUMERO_ROTULO,
- verbose_name=_('Tipo de número do rótulo'))
+ choices=TIPO_NUMERO_ROTULO, verbose_name=_("Tipo de número do rótulo")
+ )
rotulo_separador_variacao01 = models.CharField(
blank=False,
max_length=1,
default="-",
- verbose_name=_('Separador entre Numeração e Variação 1'))
+ verbose_name=_("Separador entre Numeração e Variação 1"),
+ )
rotulo_separador_variacao12 = models.CharField(
blank=False,
max_length=1,
default="-",
- verbose_name=_('Separador entre Variação 1 e Variação 2'))
+ verbose_name=_("Separador entre Variação 1 e Variação 2"),
+ )
rotulo_separador_variacao23 = models.CharField(
blank=False,
max_length=1,
default="-",
- verbose_name=_('Separador entre Variação 2 e Variação 3'))
+ verbose_name=_("Separador entre Variação 2 e Variação 3"),
+ )
rotulo_separador_variacao34 = models.CharField(
blank=False,
max_length=1,
default="-",
- verbose_name=_('Separador entre Variação 3 e Variação 4'))
+ verbose_name=_("Separador entre Variação 3 e Variação 4"),
+ )
rotulo_separador_variacao45 = models.CharField(
blank=False,
max_length=1,
default="-",
- verbose_name=_('Separador entre Variação 4 e Variação 5'))
+ verbose_name=_("Separador entre Variação 4 e Variação 5"),
+ )
rotulo_sufixo_texto = models.TextField(
- blank=True,
- verbose_name=_('Sufixo de Edição do rótulo'))
+ blank=True, verbose_name=_("Sufixo de Edição do rótulo")
+ )
rotulo_sufixo_html = models.TextField(
- blank=True,
- verbose_name=_('Sufixo html do rótulo'))
+ blank=True, verbose_name=_("Sufixo html do rótulo")
+ )
texto_prefixo_html = models.TextField(
- blank=True,
- verbose_name=_('Prefixo html do texto'))
+ blank=True, verbose_name=_("Prefixo html do texto")
+ )
texto_sufixo_html = models.TextField(
- blank=True,
- verbose_name=_('Sufixo html do texto'))
+ blank=True, verbose_name=_("Sufixo html do texto")
+ )
nota_automatica_prefixo_html = models.TextField(
- blank=True,
- verbose_name=_('Prefixo html da nota automática'))
+ blank=True, verbose_name=_("Prefixo html da nota automática")
+ )
nota_automatica_sufixo_html = models.TextField(
- blank=True,
- verbose_name=_('Sufixo html da nota automática'))
+ blank=True, verbose_name=_("Sufixo html da nota automática")
+ )
contagem_continua = models.BooleanField(
- choices=YES_NO_CHOICES, verbose_name=_('Contagem contínua'), default=False)
+ choices=YES_NO_CHOICES, verbose_name=_("Contagem contínua"), default=False
+ )
dispositivo_de_articulacao = models.BooleanField(
choices=YES_NO_CHOICES,
default=False,
- verbose_name=_('Dispositivo de Articulação (Sem Texto)'))
+ verbose_name=_("Dispositivo de Articulação (Sem Texto)"),
+ )
dispositivo_de_alteracao = models.BooleanField(
choices=YES_NO_CHOICES,
default=False,
- verbose_name=_('Dispositivo de Alteração'))
+ verbose_name=_("Dispositivo de Alteração"),
+ )
formato_variacao0 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
- verbose_name=_('Formato da Numeração'))
+ verbose_name=_("Formato da Numeração"),
+ )
formato_variacao1 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
- verbose_name=_('Formato da Variação 1'))
+ verbose_name=_("Formato da Variação 1"),
+ )
formato_variacao2 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
- verbose_name=_('Formato da Variação 2'))
+ verbose_name=_("Formato da Variação 2"),
+ )
formato_variacao3 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
- verbose_name=_('Formato da Variação 3'))
+ verbose_name=_("Formato da Variação 3"),
+ )
formato_variacao4 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
- verbose_name=_('Formato da Variação 4'))
+ verbose_name=_("Formato da Variação 4"),
+ )
formato_variacao5 = models.CharField(
max_length=1,
choices=FORMATO_NUMERACAO_CHOICES,
default=FNC1,
- verbose_name=_('Formato da Variação 5'))
+ verbose_name=_("Formato da Variação 5"),
+ )
relacoes_diretas_pai_filho = models.ManyToManyField(
- 'self',
- through='TipoDispositivoRelationship',
- through_fields=('pai', 'filho_permitido'),
+ "self",
+ through="TipoDispositivoRelationship",
+ through_fields=("pai", "filho_permitido"),
symmetrical=False,
- related_name='relacaoes_pai_filho')
+ related_name="relacaoes_pai_filho",
+ )
class Meta:
- verbose_name = _('Tipo de Dispositivo')
- verbose_name_plural = _('Tipos de Dispositivo')
- ordering = ['id']
+ verbose_name = _("Tipo de Dispositivo")
+ verbose_name_plural = _("Tipos de Dispositivo")
+ ordering = ["id"]
def __str__(self):
return self.nome
def permitido_inserir_in(
- self, pai_relativo, include_relative_autos=True, perfil_pk=None):
-
+ self, pai_relativo, include_relative_autos=True, perfil_pk=None
+ ):
perfil = PerfilEstruturalTextoArticulado.objects.all()
if not perfil_pk:
perfil = perfil.filter(padrao=True)
@@ -774,7 +817,6 @@ class TipoDispositivo(BaseModel):
return False
def permitido_variacao(self, base, perfil_pk=None):
-
perfil = PerfilEstruturalTextoArticulado.objects.all()
if not perfil_pk:
perfil = perfil.filter(padrao=True)
@@ -798,285 +840,226 @@ class TipoDispositivo(BaseModel):
class TipoDispositivoRelationship(BaseModel):
pai = models.ForeignKey(
- TipoDispositivo,
- related_name='filhos_permitidos',
- on_delete=models.PROTECT
+ TipoDispositivo, related_name="filhos_permitidos", on_delete=models.PROTECT
)
filho_permitido = models.ForeignKey(
- TipoDispositivo,
- related_name='possiveis_pais',
- on_delete=models.PROTECT
+ TipoDispositivo, related_name="possiveis_pais", on_delete=models.PROTECT
)
perfil = models.ForeignKey(
- PerfilEstruturalTextoArticulado,
- on_delete=models.PROTECT
+ PerfilEstruturalTextoArticulado, on_delete=models.PROTECT
)
filho_de_insercao_automatica = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
- verbose_name=_('Filho de Inserção Automática')
+ verbose_name=_("Filho de Inserção Automática"),
)
permitir_variacao = models.BooleanField(
default=True,
choices=YES_NO_CHOICES,
- verbose_name=_('Permitir Variação Numérica')
+ verbose_name=_("Permitir Variação Numérica"),
)
quantidade_permitida = models.IntegerField(
- default=-1,
- verbose_name=_('Quantidade permitida nesta relação')
+ default=-1, verbose_name=_("Quantidade permitida nesta relação")
)
class Meta:
- verbose_name = _('Relação Direta Permitida')
- verbose_name_plural = _('Relaçõe Diretas Permitidas')
- ordering = ['pai', 'filho_permitido']
- unique_together = (
- ('pai', 'filho_permitido', 'perfil'),)
+ verbose_name = _("Relação Direta Permitida")
+ verbose_name_plural = _("Relaçõe Diretas Permitidas")
+ ordering = ["pai", "filho_permitido"]
+ unique_together = (("pai", "filho_permitido", "perfil"),)
def __str__(self):
- return '%s - %s' % (
+ return "%s - %s" % (
self.pai.nome,
- self.filho_permitido.nome if self.filho_permitido else '')
+ self.filho_permitido.nome if self.filho_permitido else "",
+ )
class TipoPublicacao(models.Model):
- sigla = models.CharField(
- max_length=10, unique=True, verbose_name=_('Sigla'))
- nome = models.CharField(max_length=50, verbose_name=_('Nome'))
+ sigla = models.CharField(max_length=10, unique=True, verbose_name=_("Sigla"))
+ nome = models.CharField(max_length=50, verbose_name=_("Nome"))
class Meta:
- verbose_name = _('Tipo de Publicação')
- verbose_name_plural = _('Tipos de Publicação')
- ordering = ('id',)
+ verbose_name = _("Tipo de Publicação")
+ verbose_name_plural = _("Tipos de Publicação")
+ ordering = ("id",)
def __str__(self):
return self.nome
class VeiculoPublicacao(models.Model):
- sigla = models.CharField(
- max_length=10, unique=True, verbose_name=_('Sigla'))
- nome = models.CharField(max_length=60, verbose_name=_('Nome'))
+ sigla = models.CharField(max_length=10, unique=True, verbose_name=_("Sigla"))
+ nome = models.CharField(max_length=60, verbose_name=_("Nome"))
class Meta:
- verbose_name = _('Veículo de Publicação')
- verbose_name_plural = _('Veículos de Publicação')
- ordering = ('id',)
+ verbose_name = _("Veículo de Publicação")
+ verbose_name_plural = _("Veículos de Publicação")
+ ordering = ("id",)
def __str__(self):
- return '%s: %s' % (self.sigla, self.nome)
+ return "%s: %s" % (self.sigla, self.nome)
class Publicacao(TimestampedMixin):
ta = models.ForeignKey(
- TextoArticulado,
- verbose_name=_('Texto Articulado'),
- on_delete=models.CASCADE
+ TextoArticulado, verbose_name=_("Texto Articulado"), on_delete=models.CASCADE
)
veiculo_publicacao = models.ForeignKey(
VeiculoPublicacao,
- verbose_name=_('Veículo de Publicação'),
- on_delete=models.PROTECT
+ verbose_name=_("Veículo de Publicação"),
+ on_delete=models.PROTECT,
)
tipo_publicacao = models.ForeignKey(
- TipoPublicacao,
- verbose_name=_('Tipo de Publicação'),
- on_delete=models.PROTECT
+ TipoPublicacao, verbose_name=_("Tipo de Publicação"), on_delete=models.PROTECT
)
- data = models.DateField(verbose_name=_('Data de Publicação'))
+ data = models.DateField(verbose_name=_("Data de Publicação"))
hora = models.TimeField(
- blank=True,
- null=True,
- verbose_name=_('Horário de Publicação')
+ blank=True, null=True, verbose_name=_("Horário de Publicação")
)
numero = models.PositiveIntegerField(
- blank=True,
- null=True,
- verbose_name=_('Número')
+ blank=True, null=True, verbose_name=_("Número")
)
- ano = models.PositiveIntegerField(
- blank=True,
- null=True,
- verbose_name=_('Ano')
- )
+ ano = models.PositiveIntegerField(blank=True, null=True, verbose_name=_("Ano"))
edicao = models.PositiveIntegerField(
- blank=True,
- null=True,
- verbose_name=_('Edição')
+ blank=True, null=True, verbose_name=_("Edição")
)
url_externa = models.URLField(
- max_length=1024,
- blank=True,
- verbose_name=_('Link para Versão Eletrônica')
+ max_length=1024, blank=True, verbose_name=_("Link para Versão Eletrônica")
)
pagina_inicio = models.PositiveIntegerField(
- blank=True,
- null=True,
- verbose_name=_('Pg. Início')
+ blank=True, null=True, verbose_name=_("Pg. Início")
)
pagina_fim = models.PositiveIntegerField(
- blank=True,
- null=True,
- verbose_name=_('Pg. Fim')
+ blank=True, null=True, verbose_name=_("Pg. Fim")
)
class Meta:
- verbose_name = _('Publicação')
- verbose_name_plural = _('Publicações')
- ordering = ('id',)
+ verbose_name = _("Publicação")
+ verbose_name_plural = _("Publicações")
+ ordering = ("id",)
def __str__(self):
- return _('%s realizada em %s \n %s') % (
+ return _("%s realizada em %s \n %s") % (
self.tipo_publicacao,
defaultfilters.date(self.data, r"d \d\e F \d\e Y"),
- self.ta)
+ self.ta,
+ )
def imagem_upload_path(instance, filename):
- return texto_upload_path(instance, filename, subpath='')
+ return texto_upload_path(instance, filename, subpath="")
class Dispositivo(BaseModel, TimestampedMixin):
- TEXTO_PADRAO_DISPOSITIVO_REVOGADO = force_str(_('(Revogado)'))
+ TEXTO_PADRAO_DISPOSITIVO_REVOGADO = force_str(_("(Revogado)"))
INTERVALO_ORDEM = 1000
ordem = models.PositiveIntegerField(
- default=0,
- verbose_name=_('Ordem de Renderização')
+ default=0, verbose_name=_("Ordem de Renderização")
)
ordem_bloco_atualizador = models.PositiveIntegerField(
- default=0,
- verbose_name=_('Ordem de Renderização no Bloco Atualizador')
+ default=0, verbose_name=_("Ordem de Renderização no Bloco Atualizador")
)
# apenas articulacao recebe nivel zero
nivel = models.PositiveIntegerField(
- default=0,
- blank=True,
- null=True,
- verbose_name=_('Nível Estrutural')
+ default=0, blank=True, null=True, verbose_name=_("Nível Estrutural")
)
dispositivo0 = models.PositiveIntegerField(
- default=0,
- verbose_name=_('Número do Dispositivo')
+ default=0, verbose_name=_("Número do Dispositivo")
)
dispositivo1 = models.PositiveIntegerField(
- default=0,
- blank=True,
- null=True,
- verbose_name=_('Primeiro Nível de Variação')
+ default=0, blank=True, null=True, verbose_name=_("Primeiro Nível de Variação")
)
dispositivo2 = models.PositiveIntegerField(
- default=0,
- blank=True,
- null=True,
- verbose_name=_('Segundo Nível de Variação')
+ default=0, blank=True, null=True, verbose_name=_("Segundo Nível de Variação")
)
dispositivo3 = models.PositiveIntegerField(
- default=0,
- blank=True,
- null=True,
- verbose_name=_('Terceiro Nível de Variação')
+ default=0, blank=True, null=True, verbose_name=_("Terceiro Nível de Variação")
)
dispositivo4 = models.PositiveIntegerField(
- default=0,
- blank=True,
- null=True,
- verbose_name=_('Quarto Nível de Variação')
+ default=0, blank=True, null=True, verbose_name=_("Quarto Nível de Variação")
)
dispositivo5 = models.PositiveIntegerField(
- default=0,
- blank=True,
- null=True,
- verbose_name=_('Quinto Nível de Variação')
+ default=0, blank=True, null=True, verbose_name=_("Quinto Nível de Variação")
)
rotulo = models.CharField(
- max_length=50,
- blank=True,
- default='',
- verbose_name=_('Rótulo')
+ max_length=50, blank=True, default="", verbose_name=_("Rótulo")
)
texto = models.TextField(
- blank=True,
- default='',
- verbose_name=_('Texto do Dispositivo')
+ blank=True, default="", verbose_name=_("Texto do Dispositivo")
)
texto_atualizador = models.TextField(
blank=True,
- default='',
- verbose_name=_('Texto do Dispositivo no Dispositivo Atualizador')
+ default="",
+ verbose_name=_("Texto do Dispositivo no Dispositivo Atualizador"),
)
- inicio_vigencia = models.DateField(verbose_name=_('Início de Vigência'))
+ inicio_vigencia = models.DateField(verbose_name=_("Início de Vigência"))
fim_vigencia = models.DateField(
- blank=True,
- null=True,
- verbose_name=_('Fim de Vigência')
+ blank=True, null=True, verbose_name=_("Fim de Vigência")
)
- inicio_eficacia = models.DateField(verbose_name=_('Início de Eficácia'))
+ inicio_eficacia = models.DateField(verbose_name=_("Início de Eficácia"))
fim_eficacia = models.DateField(
- blank=True,
- null=True,
- verbose_name=_('Fim de Eficácia')
+ blank=True, null=True, verbose_name=_("Fim de Eficácia")
)
inconstitucionalidade = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
- verbose_name=_('Declarado Inconstitucional')
+ verbose_name=_("Declarado Inconstitucional"),
)
auto_inserido = models.BooleanField(
- default=False,
- choices=YES_NO_CHOICES,
- verbose_name=_('Auto Inserido')
+ default=False, choices=YES_NO_CHOICES, verbose_name=_("Auto Inserido")
)
visibilidade = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
- verbose_name=_('Visibilidade no Texto Articulado Publicado')
+ verbose_name=_("Visibilidade no Texto Articulado Publicado"),
)
dispositivo_de_revogacao = models.BooleanField(
default=False,
choices=YES_NO_CHOICES,
- verbose_name=_('Dispositivo de Revogação')
+ verbose_name=_("Dispositivo de Revogação"),
)
tipo_dispositivo = models.ForeignKey(
TipoDispositivo,
on_delete=models.PROTECT,
- related_name='dispositivos_do_tipo_set',
- verbose_name=_('Tipo do Dispositivo')
+ related_name="dispositivos_do_tipo_set",
+ verbose_name=_("Tipo do Dispositivo"),
)
publicacao = models.ForeignKey(
@@ -1084,15 +1067,15 @@ class Dispositivo(BaseModel, TimestampedMixin):
blank=True,
null=True,
default=None,
- verbose_name=_('Publicação'),
+ verbose_name=_("Publicação"),
on_delete=models.SET_NULL,
)
ta = models.ForeignKey(
TextoArticulado,
on_delete=models.CASCADE,
- related_name='dispositivos_set',
- verbose_name=_('Texto Articulado'),
+ related_name="dispositivos_set",
+ verbose_name=_("Texto Articulado"),
)
ta_publicado = models.ForeignKey(
@@ -1101,158 +1084,192 @@ class Dispositivo(BaseModel, TimestampedMixin):
blank=True,
null=True,
default=None,
- related_name='dispositivos_alterados_pelo_ta_set',
- verbose_name=_('Texto Articulado Publicado')
+ related_name="dispositivos_alterados_pelo_ta_set",
+ verbose_name=_("Texto Articulado Publicado"),
)
dispositivo_subsequente = models.ForeignKey(
- 'self',
+ "self",
blank=True,
null=True,
default=None,
- related_name='dispositivo_subsequente_set',
+ related_name="dispositivo_subsequente_set",
on_delete=models.SET_NULL,
- verbose_name=_('Dispositivo Subsequente')
+ verbose_name=_("Dispositivo Subsequente"),
)
dispositivo_substituido = models.ForeignKey(
- 'self',
+ "self",
blank=True,
null=True,
default=None,
- related_name='dispositivo_substituido_set',
+ related_name="dispositivo_substituido_set",
on_delete=models.SET_NULL,
- verbose_name=_('Dispositivo Substituido')
+ verbose_name=_("Dispositivo Substituido"),
)
dispositivo_pai = models.ForeignKey(
- 'self',
+ "self",
blank=True,
null=True,
default=None,
- related_name='dispositivos_filhos_set',
- verbose_name=_('Dispositivo Pai'),
+ related_name="dispositivos_filhos_set",
+ verbose_name=_("Dispositivo Pai"),
on_delete=models.CASCADE,
)
dispositivo_raiz = models.ForeignKey(
- 'self',
+ "self",
blank=True,
null=True,
default=None,
- related_name='nodes',
- verbose_name=_('Dispositivo Raiz'),
+ related_name="nodes",
+ verbose_name=_("Dispositivo Raiz"),
on_delete=models.CASCADE,
)
dispositivo_vigencia = models.ForeignKey(
- 'self',
+ "self",
blank=True,
null=True,
default=None,
on_delete=models.SET_NULL,
- related_name='dispositivos_vigencias_set',
- verbose_name=_('Dispositivo de Vigência')
+ related_name="dispositivos_vigencias_set",
+ verbose_name=_("Dispositivo de Vigência"),
)
dispositivo_atualizador = models.ForeignKey(
- 'self',
+ "self",
blank=True,
null=True,
default=None,
- related_name='dispositivos_alterados_set',
- verbose_name=_('Dispositivo Atualizador'),
+ related_name="dispositivos_alterados_set",
+ verbose_name=_("Dispositivo Atualizador"),
on_delete=models.SET_NULL,
)
contagem_continua = models.BooleanField(
- default=False,
- choices=YES_NO_CHOICES,
- verbose_name=_('Contagem contínua')
+ default=False, choices=YES_NO_CHOICES, verbose_name=_("Contagem contínua")
)
imagem = ImageCropField(
- verbose_name=_('Imagem'),
- upload_to=imagem_upload_path, null=True, blank=True)
+ verbose_name=_("Imagem"), upload_to=imagem_upload_path, null=True, blank=True
+ )
imagem_cropping = ImageRatioField(
- 'imagem', '100x100', verbose_name=_('Recorte de Imagem'),
- free_crop=True, size_warning=True,
- help_text=_('O recorte de imagem '
- 'é possível após a atualização.'))
+ "imagem",
+ "100x100",
+ verbose_name=_("Recorte de Imagem"),
+ free_crop=True,
+ size_warning=True,
+ help_text=_("O recorte de imagem " "é possível após a atualização."),
+ )
# define custom manager
class SelectRelatedManager(models.Manager):
def get_queryset(self):
- return super().get_queryset().select_related('tipo_dispositivo',
- 'publicacao',
- 'ta',
- 'ta_publicado',
- 'dispositivo_subsequente',
- 'dispositivo_substituido',
- 'dispositivo_pai',
- 'dispositivo_pai__tipo_dispositivo',
- 'dispositivo_raiz',
- 'dispositivo_vigencia',
- 'dispositivo_atualizador'
- )
+ return (
+ super()
+ .get_queryset()
+ .select_related(
+ "tipo_dispositivo",
+ "publicacao",
+ "ta",
+ "ta_publicado",
+ "dispositivo_subsequente",
+ "dispositivo_substituido",
+ "dispositivo_pai",
+ "dispositivo_pai__tipo_dispositivo",
+ "dispositivo_raiz",
+ "dispositivo_vigencia",
+ "dispositivo_atualizador",
+ )
+ )
+
# Replace the default manager with custom manager
objects = SelectRelatedManager()
class Meta:
- verbose_name = _('Dispositivo')
- verbose_name_plural = _('Dispositivos')
- ordering = ['ta', 'ordem']
+ verbose_name = _("Dispositivo")
+ verbose_name_plural = _("Dispositivos")
+ ordering = ["ta", "ordem"]
unique_together = (
- ('ta', 'ordem',),
- ('ta',
- 'dispositivo0',
- 'dispositivo1',
- 'dispositivo2',
- 'dispositivo3',
- 'dispositivo4',
- 'dispositivo5',
- 'tipo_dispositivo',
- 'dispositivo_raiz',
- 'dispositivo_pai',
- 'dispositivo_atualizador',
- 'ta_publicado',
- 'publicacao',),
- ('ta',
- 'dispositivo0',
- 'dispositivo1',
- 'dispositivo2',
- 'dispositivo3',
- 'dispositivo4',
- 'dispositivo5',
- 'tipo_dispositivo',
- 'contagem_continua',
- 'dispositivo_raiz',
- 'dispositivo_atualizador',
- 'ta_publicado',
- 'publicacao',),
+ (
+ "ta",
+ "ordem",
+ ),
+ (
+ "ta",
+ "dispositivo0",
+ "dispositivo1",
+ "dispositivo2",
+ "dispositivo3",
+ "dispositivo4",
+ "dispositivo5",
+ "tipo_dispositivo",
+ "dispositivo_raiz",
+ "dispositivo_pai",
+ "dispositivo_atualizador",
+ "ta_publicado",
+ "publicacao",
+ ),
+ (
+ "ta",
+ "dispositivo0",
+ "dispositivo1",
+ "dispositivo2",
+ "dispositivo3",
+ "dispositivo4",
+ "dispositivo5",
+ "tipo_dispositivo",
+ "contagem_continua",
+ "dispositivo_raiz",
+ "dispositivo_atualizador",
+ "ta_publicado",
+ "publicacao",
+ ),
)
permissions = (
- ('change_dispositivo_edicao_dinamica', _(
- 'Permissão de edição de dispositivos originais '
- 'via editor dinâmico.')),
- ('change_your_dispositivo_edicao_dinamica', _(
- 'Permissão de edição de dispositivos originais '
- 'via editor dinâmico desde que seja dono.')),
- ('change_dispositivo_edicao_avancada', _(
- 'Permissão de edição de dispositivos originais '
- 'via formulários de edição avançada.')),
- ('change_dispositivo_registros_compilacao', _(
- 'Permissão de registro de compilação via editor dinâmico.')),
- ('view_dispositivo_notificacoes', _(
- 'Permissão de acesso às notificações de pendências.')),
- ('change_dispositivo_de_vigencia_global', _(
- 'Permissão alteração global do dispositivo de vigência')),
+ (
+ "change_dispositivo_edicao_dinamica",
+ _(
+ "Permissão de edição de dispositivos originais "
+ "via editor dinâmico."
+ ),
+ ),
+ (
+ "change_your_dispositivo_edicao_dinamica",
+ _(
+ "Permissão de edição de dispositivos originais "
+ "via editor dinâmico desde que seja dono."
+ ),
+ ),
+ (
+ "change_dispositivo_edicao_avancada",
+ _(
+ "Permissão de edição de dispositivos originais "
+ "via formulários de edição avançada."
+ ),
+ ),
+ (
+ "change_dispositivo_registros_compilacao",
+ _("Permissão de registro de compilação via editor dinâmico."),
+ ),
+ (
+ "view_dispositivo_notificacoes",
+ _("Permissão de acesso às notificações de pendências."),
+ ),
+ (
+ "change_dispositivo_de_vigencia_global",
+ _("Permissão alteração global do dispositivo de vigência"),
+ ),
)
def ws_sync(self):
return self.ta and self.ta.privacidade in (
- STATUS_TA_IMMUTABLE_PUBLIC, STATUS_TA_PUBLIC)
+ STATUS_TA_IMMUTABLE_PUBLIC,
+ STATUS_TA_PUBLIC,
+ )
def clean(self):
"""
@@ -1267,28 +1284,32 @@ class Dispositivo(BaseModel, TimestampedMixin):
for field_name in field_tuple:
field_value = getattr(self, field_name)
if getattr(self, field_name) is None:
- unique_filter['%s__isnull' % field_name] = True
+ unique_filter["%s__isnull" % field_name] = True
null_found = True
else:
- unique_filter['%s' % field_name] = field_value
+ unique_filter["%s" % field_name] = field_value
unique_fields.append(field_name)
if null_found:
- unique_queryset = self.__class__.objects.filter(
- **unique_filter)
+ unique_queryset = self.__class__.objects.filter(**unique_filter)
if self.pk:
unique_queryset = unique_queryset.exclude(pk=self.pk)
- if not self.contagem_continua and \
- 'contagem_continua' in field_tuple:
+ if not self.contagem_continua and "contagem_continua" in field_tuple:
continue
if unique_queryset.exists():
msg = self.unique_error_message(
- self.__class__, tuple(unique_fields))
+ self.__class__, tuple(unique_fields)
+ )
raise ValidationError(msg)
- def save(self, force_insert=False, force_update=False, using=None,
- update_fields=None, clean=True):
-
+ def save(
+ self,
+ force_insert=False,
+ force_update=False,
+ using=None,
+ update_fields=None,
+ clean=True,
+ ):
self.dispositivo_raiz = self.get_raiz()
if self.dispositivo_raiz == self:
self.dispositivo_raiz = None
@@ -1306,12 +1327,17 @@ class Dispositivo(BaseModel, TimestampedMixin):
pass"""
return super().save(
- force_insert=force_insert, force_update=force_update, using=using,
- update_fields=update_fields, clean=clean)
+ force_insert=force_insert,
+ force_update=force_update,
+ using=using,
+ update_fields=update_fields,
+ clean=clean,
+ )
def __str__(self):
- return '%(rotulo)s' % {
- 'rotulo': (self.rotulo if self.rotulo else self.tipo_dispositivo)}
+ return "%(rotulo)s" % {
+ "rotulo": (self.rotulo if self.rotulo else self.tipo_dispositivo)
+ }
def get_raiz(self):
dp = self
@@ -1322,22 +1348,22 @@ class Dispositivo(BaseModel, TimestampedMixin):
def rotulo_padrao(self, local_insert=0, for_insert_in=0):
"""
0 = Sem inserção - com nomeclatura padrao
- 1 = Inserção com transformação de parágrafo único para §1º """
+ 1 = Inserção com transformação de parágrafo único para §1º"""
- r = ''
+ r = ""
t = self.tipo_dispositivo
- prefixo = t.rotulo_prefixo_texto.split(';')
+ prefixo = t.rotulo_prefixo_texto.split(";")
if len(prefixo) > 1:
-
if for_insert_in:
irmaos_mesmo_tipo = Dispositivo.objects.filter(
- tipo_dispositivo=self.tipo_dispositivo,
- dispositivo_pai=self)
+ tipo_dispositivo=self.tipo_dispositivo, dispositivo_pai=self
+ )
else:
irmaos_mesmo_tipo = Dispositivo.objects.filter(
tipo_dispositivo=self.tipo_dispositivo,
- dispositivo_pai=self.dispositivo_pai)
+ dispositivo_pai=self.dispositivo_pai,
+ )
if not irmaos_mesmo_tipo.exists():
r += prefixo[1]
@@ -1350,14 +1376,15 @@ class Dispositivo(BaseModel, TimestampedMixin):
elif irmaos_mesmo_tipo.count() == 1:
self.transform_in_next()
self.transform_in_next()
- r += _('Transformar %s em %s%s e criar %s1%s') % (
+ r += _("Transformar %s em %s%s e criar %s1%s") % (
prefixo[1].strip(),
prefixo[0],
self.get_nomenclatura_completa(),
prefixo[0],
- 'º' if
- self.tipo_dispositivo.rotulo_ordinal >= 0
- else '',)
+ "º"
+ if self.tipo_dispositivo.rotulo_ordinal >= 0
+ else "",
+ )
else:
self.dispositivo0 = 1
r += prefixo[0]
@@ -1373,31 +1400,34 @@ class Dispositivo(BaseModel, TimestampedMixin):
r += self.get_nomenclatura_completa()
else:
if local_insert == 1 and irmaos_mesmo_tipo.count() == 1:
-
if Dispositivo.objects.filter(
- ordem__gt=self.ordem,
- ordem__lt=irmaos_mesmo_tipo[0].ordem).exists():
+ ordem__gt=self.ordem, ordem__lt=irmaos_mesmo_tipo[0].ordem
+ ).exists():
self.dispositivo0 = 2
- r += _('Transformar %s em %s%s e criar %s1%s') % (
+ r += _("Transformar %s em %s%s e criar %s1%s") % (
prefixo[1].strip(),
prefixo[0],
self.get_nomenclatura_completa(),
prefixo[0],
- 'º' if
- self.tipo_dispositivo.rotulo_ordinal >= 0
- else '',)
+ "º"
+ if self.tipo_dispositivo.rotulo_ordinal >= 0
+ else "",
+ )
else:
- r += _('Transformar %s em %s%s e criar %s 2%s') % (
+ r += _("Transformar %s em %s%s e criar %s 2%s") % (
prefixo[1].strip(),
prefixo[0],
self.get_nomenclatura_completa(),
prefixo[0],
- 'º' if
- self.tipo_dispositivo.
- rotulo_ordinal >= 0 else '',)
- elif irmaos_mesmo_tipo.count() == 1 and\
- irmaos_mesmo_tipo[0].dispositivo0 == 0 and\
- self.dispositivo0 == 1:
+ "º"
+ if self.tipo_dispositivo.rotulo_ordinal >= 0
+ else "",
+ )
+ elif (
+ irmaos_mesmo_tipo.count() == 1
+ and irmaos_mesmo_tipo[0].dispositivo0 == 0
+ and self.dispositivo0 == 1
+ ):
irmao = irmaos_mesmo_tipo[0]
irmao.dispositivo0 = 1
rr = prefixo[0]
@@ -1523,10 +1553,10 @@ class Dispositivo(BaseModel, TimestampedMixin):
self.dispositivo2,
self.dispositivo3,
self.dispositivo4,
- self.dispositivo5]
+ self.dispositivo5,
+ ]
def get_nomenclatura_completa(self):
-
numero = self.get_numero_completo()
formato = [
@@ -1535,21 +1565,23 @@ class Dispositivo(BaseModel, TimestampedMixin):
self.tipo_dispositivo.formato_variacao2,
self.tipo_dispositivo.formato_variacao3,
self.tipo_dispositivo.formato_variacao4,
- self.tipo_dispositivo.formato_variacao5]
+ self.tipo_dispositivo.formato_variacao5,
+ ]
separadores = [
- '',
+ "",
self.tipo_dispositivo.rotulo_separador_variacao01,
self.tipo_dispositivo.rotulo_separador_variacao12,
self.tipo_dispositivo.rotulo_separador_variacao23,
self.tipo_dispositivo.rotulo_separador_variacao34,
- self.tipo_dispositivo.rotulo_separador_variacao45]
+ self.tipo_dispositivo.rotulo_separador_variacao45,
+ ]
numero.reverse()
formato.reverse()
separadores.reverse()
- result = ''
+ result = ""
flag_obrigatorio = False
for i in range(len(numero)):
@@ -1560,74 +1592,71 @@ class Dispositivo(BaseModel, TimestampedMixin):
if i + 1 == len(numero) and numero[i] == 0:
continue
- if i + 1 == len(numero) and \
- (self.tipo_dispositivo.rotulo_ordinal == -1 or
- 0 < numero[i] <= self.tipo_dispositivo.rotulo_ordinal):
- result = 'º' + result
+ if i + 1 == len(numero) and (
+ self.tipo_dispositivo.rotulo_ordinal == -1
+ or 0 < numero[i] <= self.tipo_dispositivo.rotulo_ordinal
+ ):
+ result = "º" + result
if formato[i] == TipoDispositivo.FNC1:
result = separadores[i] + str(numero[i]) + result
elif formato[i] == TipoDispositivo.FNCI:
- result = separadores[i] + \
- int_to_roman(numero[i]) + result
+ result = separadores[i] + int_to_roman(numero[i]) + result
elif formato[i] == TipoDispositivo.FNCi:
- result = separadores[i] + \
- int_to_roman(numero[i]).lower() + result
+ result = separadores[i] + int_to_roman(numero[i]).lower() + result
elif formato[i] == TipoDispositivo.FNCA:
- result = separadores[i] + \
- int_to_letter(numero[i]) + result
+ result = separadores[i] + int_to_letter(numero[i]) + result
elif formato[i] == TipoDispositivo.FNCa:
- result = separadores[i] + \
- int_to_letter(numero[i]).lower() + result
+ result = separadores[i] + int_to_letter(numero[i]).lower() + result
elif formato[i] == TipoDispositivo.FNC8:
- result = separadores[i] + '*' + result
+ result = separadores[i] + "*" + result
elif formato[i] == TipoDispositivo.FNCN:
result = separadores[i] + result
return result
def criar_espaco(self, espaco_a_criar, local=None):
-
- if local == 'json_add_next':
- proximo_bloco = Dispositivo.objects.filter(
- ordem__gt=self.ordem,
- nivel__lte=self.nivel,
- ta_id=self.ta_id).first()
- elif local == 'json_add_in':
+ if local == "json_add_next":
proximo_bloco = Dispositivo.objects.filter(
- ordem__gt=self.ordem,
- nivel__lte=self.nivel + 1,
- ta_id=self.ta_id).exclude(auto_inserido=True).first()
- elif local == 'json_add_in_with_auto':
+ ordem__gt=self.ordem, nivel__lte=self.nivel, ta_id=self.ta_id
+ ).first()
+ elif local == "json_add_in":
+ proximo_bloco = (
+ Dispositivo.objects.filter(
+ ordem__gt=self.ordem, nivel__lte=self.nivel + 1, ta_id=self.ta_id
+ )
+ .exclude(auto_inserido=True)
+ .first()
+ )
+ elif local == "json_add_in_with_auto":
proximo_bloco = Dispositivo.objects.filter(
- ordem__gt=self.ordem,
- nivel__lte=self.nivel + 1,
- ta_id=self.ta_id).first()
+ ordem__gt=self.ordem, nivel__lte=self.nivel + 1, ta_id=self.ta_id
+ ).first()
else:
proximo_bloco = Dispositivo.objects.filter(
- ordem__gte=self.ordem,
- ta_id=self.ta_id).first()
+ ordem__gte=self.ordem, ta_id=self.ta_id
+ ).first()
if proximo_bloco:
ordem = proximo_bloco.ordem
- proximo_bloco = Dispositivo.objects.order_by('-ordem').filter(
- ordem__gte=ordem,
- ta_id=self.ta_id)
+ proximo_bloco = Dispositivo.objects.order_by("-ordem").filter(
+ ordem__gte=ordem, ta_id=self.ta_id
+ )
- proximo_bloco.update(ordem=F('ordem') + 1)
+ proximo_bloco.update(ordem=F("ordem") + 1)
proximo_bloco.update(
- ordem=F('ordem') + (
- Dispositivo.INTERVALO_ORDEM * espaco_a_criar - 1))
+ ordem=F("ordem") + (Dispositivo.INTERVALO_ORDEM * espaco_a_criar - 1)
+ )
else:
# inserção no fim do ta
- ordem_max = Dispositivo.objects.order_by(
- 'ordem').filter(
- ta_id=self.ta_id).aggregate(
- Max('ordem'))
- if ordem_max['ordem__max'] is None:
- raise Exception(
- _('Não existem registros base neste Texto Articulado'))
- ordem = ordem_max['ordem__max'] + Dispositivo.INTERVALO_ORDEM
+ ordem_max = (
+ Dispositivo.objects.order_by("ordem")
+ .filter(ta_id=self.ta_id)
+ .aggregate(Max("ordem"))
+ )
+ if ordem_max["ordem__max"] is None:
+ raise Exception(_("Não existem registros base neste Texto Articulado"))
+ ordem = ordem_max["ordem__max"] + Dispositivo.INTERVALO_ORDEM
return ordem
def organizar_niveis(self):
@@ -1636,20 +1665,19 @@ class Dispositivo(BaseModel, TimestampedMixin):
else:
self.nivel = self.dispositivo_pai.nivel + 1
- filhos = Dispositivo.objects.filter(
- dispositivo_pai_id=self.pk)
+ filhos = Dispositivo.objects.filter(dispositivo_pai_id=self.pk)
for filho in filhos:
filho.nivel = self.nivel + 1
filho.save()
filho.organizar_niveis()
- def get_parents(self, ordem='desc'):
+ def get_parents(self, ordem="desc"):
dp = self
p = []
while dp.dispositivo_pai:
dp = dp.dispositivo_pai
- if ordem == 'desc':
+ if ordem == "desc":
p.append(dp)
else:
p.insert(0, dp)
@@ -1657,47 +1685,61 @@ class Dispositivo(BaseModel, TimestampedMixin):
return p
def get_parents_asc(self):
- return self.get_parents(ordem='asc')
+ return self.get_parents(ordem="asc")
def incrementar_irmaos(self, variacao=0, tipoadd=[], force=True):
-
if not self.tipo_dispositivo.contagem_continua:
- irmaos = list(Dispositivo.objects.filter(
- Q(ordem__gt=self.ordem) | Q(dispositivo0=0),
- dispositivo_pai_id=self.dispositivo_pai_id,
- tipo_dispositivo_id=self.tipo_dispositivo.pk))
+ irmaos = list(
+ Dispositivo.objects.filter(
+ Q(ordem__gt=self.ordem) | Q(dispositivo0=0),
+ dispositivo_pai_id=self.dispositivo_pai_id,
+ tipo_dispositivo_id=self.tipo_dispositivo.pk,
+ )
+ )
elif self.dispositivo_pai is None:
- irmaos = list(Dispositivo.objects.filter(
- ordem__gt=self.ordem,
- ta_id=self.ta_id,
- tipo_dispositivo_id=self.tipo_dispositivo.pk))
+ irmaos = list(
+ Dispositivo.objects.filter(
+ ordem__gt=self.ordem,
+ ta_id=self.ta_id,
+ tipo_dispositivo_id=self.tipo_dispositivo.pk,
+ )
+ )
else: # contagem continua restrita a articulacao
proxima_articulacao = self.select_next_root()
if proxima_articulacao is None:
- irmaos = list(Dispositivo.objects.filter(
- ordem__gt=self.ordem,
- ta_id=self.ta_id,
- tipo_dispositivo_id=self.tipo_dispositivo.pk))
+ irmaos = list(
+ Dispositivo.objects.filter(
+ ordem__gt=self.ordem,
+ ta_id=self.ta_id,
+ tipo_dispositivo_id=self.tipo_dispositivo.pk,
+ )
+ )
else:
- irmaos = list(Dispositivo.objects.filter(
- Q(ordem__gt=self.ordem) &
- Q(ordem__lt=proxima_articulacao.ordem),
- ta_id=self.ta_id,
- tipo_dispositivo_id=self.tipo_dispositivo.pk))
+ irmaos = list(
+ Dispositivo.objects.filter(
+ Q(ordem__gt=self.ordem)
+ & Q(ordem__lt=proxima_articulacao.ordem),
+ ta_id=self.ta_id,
+ tipo_dispositivo_id=self.tipo_dispositivo.pk,
+ )
+ )
dp_profundidade = self.get_profundidade()
- if (not force and not variacao and len(irmaos) > 0 and
- irmaos[0].get_numero_completo() > self.get_numero_completo()):
+ if (
+ not force
+ and not variacao
+ and len(irmaos) > 0
+ and irmaos[0].get_numero_completo() > self.get_numero_completo()
+ ):
return
irmaos_a_salvar = []
ultimo_irmao = None
for irmao in irmaos:
-
if irmao.ordem <= self.ordem or irmao.dispositivo0 == 0:
irmaos_a_salvar.append(irmao)
continue
@@ -1709,17 +1751,14 @@ class Dispositivo(BaseModel, TimestampedMixin):
if irmao.get_numero_completo() < self.get_numero_completo():
if irmao_profundidade > dp_profundidade:
if ultimo_irmao is None:
- irmao.transform_in_next(
- dp_profundidade - irmao_profundidade)
- irmao.transform_in_next(
- irmao_profundidade - dp_profundidade)
+ irmao.transform_in_next(dp_profundidade - irmao_profundidade)
+ irmao.transform_in_next(irmao_profundidade - dp_profundidade)
else:
- irmao.set_numero_completo(
- ultimo_irmao.get_numero_completo())
+ irmao.set_numero_completo(ultimo_irmao.get_numero_completo())
irmao.transform_in_next(
- irmao_profundidade -
- ultimo_irmao.get_profundidade())
+ irmao_profundidade - ultimo_irmao.get_profundidade()
+ )
ultimo_irmao = irmao
else:
@@ -1734,11 +1773,13 @@ class Dispositivo(BaseModel, TimestampedMixin):
irmao.rotulo = irmao.rotulo_padrao()
irmaos_a_salvar.append(irmao)
else:
- if dp_profundidade < irmao_profundidade and \
- dp_profundidade > 0 and \
- self.get_numero_completo()[:dp_profundidade] >= \
- irmao.get_numero_completo()[:dp_profundidade] and\
- ultimo_irmao is None:
+ if (
+ dp_profundidade < irmao_profundidade
+ and dp_profundidade > 0
+ and self.get_numero_completo()[:dp_profundidade]
+ >= irmao.get_numero_completo()[:dp_profundidade]
+ and ultimo_irmao is None
+ ):
break
else:
ultimo_irmao = irmao
@@ -1750,14 +1791,16 @@ class Dispositivo(BaseModel, TimestampedMixin):
irmaos_a_salvar.reverse()
for irmao in irmaos_a_salvar:
- if (irmao.dispositivo0 == 0 and
- irmao.ordem <= self.ordem) and variacao == 0:
+ if (
+ irmao.dispositivo0 == 0 and irmao.ordem <= self.ordem
+ ) and variacao == 0:
irmao.dispositivo0 = 1
irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 2
self.rotulo = self.rotulo_padrao()
- elif (irmao.dispositivo0 == 0 and
- irmao.ordem > self.ordem) and variacao == 0:
+ elif (
+ irmao.dispositivo0 == 0 and irmao.ordem > self.ordem
+ ) and variacao == 0:
irmao.dispositivo0 = 2
irmao.rotulo = irmao.rotulo_padrao()
self.dispositivo0 = 1
@@ -1767,8 +1810,7 @@ class Dispositivo(BaseModel, TimestampedMixin):
irmao.save()
def select_roots(self):
- return Dispositivo.objects.order_by(
- 'ordem').filter(nivel=0, ta_id=self.ta_id)
+ return Dispositivo.objects.order_by("ordem").filter(nivel=0, ta_id=self.ta_id)
def select_next_root(self):
return self.select_roots().filter(ordem__gt=self.ordem).first()
@@ -1782,14 +1824,13 @@ class Dispositivo(BaseModel, TimestampedMixin):
# pp possiveis_pais
if not perfil_pk:
- perfis = PerfilEstruturalTextoArticulado.objects.filter(
- padrao=True)[:1]
+ perfis = PerfilEstruturalTextoArticulado.objects.filter(padrao=True)[:1]
if perfis.exists():
perfil_pk = perfis[0].pk
pp = self.tipo_dispositivo.possiveis_pais.filter(
- pai=self.dispositivo_pai.tipo_dispositivo,
- perfil_id=perfil_pk)
+ pai=self.dispositivo_pai.tipo_dispositivo, perfil_id=perfil_pk
+ )
if pp.exists():
if pp[0].filho_de_insercao_automatica:
@@ -1812,10 +1853,9 @@ class Dispositivo(BaseModel, TimestampedMixin):
dp.tipo_dispositivo = tipo_base
- dp.set_numero_completo(
- dispositivo_base.get_numero_completo())
+ dp.set_numero_completo(dispositivo_base.get_numero_completo())
dp.nivel = dispositivo_base.nivel
- dp.texto = ''
+ dp.texto = ""
dp.visibilidade = True
# dp.auto_inserido = dispositivo_base.auto_inserido
dp.ta = dispositivo_base.ta
@@ -1829,8 +1869,9 @@ class Dispositivo(BaseModel, TimestampedMixin):
dp.dispositivo_atualizador = b.dispositivo_atualizador
if dp.ta_publicado:
- dp.ordem_bloco_atualizador = b.ordem_bloco_atualizador + \
- Dispositivo.INTERVALO_ORDEM
+ dp.ordem_bloco_atualizador = (
+ b.ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM
+ )
dp.dispositivo_vigencia = dispositivo_base.dispositivo_vigencia
if dp.dispositivo_vigencia:
@@ -1850,97 +1891,125 @@ class Dispositivo(BaseModel, TimestampedMixin):
@staticmethod
def set_numero_for_add_in(dispositivo_base, dispositivo, tipo_base):
-
if tipo_base.contagem_continua:
raiz = dispositivo_base.get_raiz()
- disps = Dispositivo.objects.order_by('-ordem').filter(
+ disps = Dispositivo.objects.order_by("-ordem").filter(
tipo_dispositivo_id=tipo_base.pk,
ordem__lte=dispositivo_base.ordem,
ordem__gt=raiz.ordem,
- ta_id=dispositivo_base.ta_id)[:1]
+ ta_id=dispositivo_base.ta_id,
+ )[:1]
if disps.exists():
- dispositivo.set_numero_completo(
- disps[0].get_numero_completo())
+ dispositivo.set_numero_completo(disps[0].get_numero_completo())
# dispositivo.transform_in_next()
else:
- dispositivo.set_numero_completo([0, 0, 0, 0, 0, 0, ])
+ dispositivo.set_numero_completo(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
else:
- if ';' in tipo_base.rotulo_prefixo_texto:
-
+ if ";" in tipo_base.rotulo_prefixo_texto:
if dispositivo != dispositivo_base:
irmaos_mesmo_tipo = Dispositivo.objects.filter(
- tipo_dispositivo=tipo_base,
- dispositivo_pai=dispositivo_base)
-
- dispositivo.set_numero_completo([
- 1 if irmaos_mesmo_tipo.exists() else 0,
- 0, 0, 0, 0, 0, ])
+ tipo_dispositivo=tipo_base, dispositivo_pai=dispositivo_base
+ )
+
+ dispositivo.set_numero_completo(
+ [
+ 1 if irmaos_mesmo_tipo.exists() else 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
else:
- dispositivo.set_numero_completo([0, 0, 0, 0, 0, 0, ])
+ dispositivo.set_numero_completo(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
else:
- dispositivo.set_numero_completo([1, 0, 0, 0, 0, 0, ])
+ dispositivo.set_numero_completo(
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
def ordenar_bloco_alteracao(self):
- if not self.tipo_dispositivo.dispositivo_de_articulacao or\
- not self.tipo_dispositivo.dispositivo_de_alteracao:
+ if (
+ not self.tipo_dispositivo.dispositivo_de_articulacao
+ or not self.tipo_dispositivo.dispositivo_de_alteracao
+ ):
return
- filhos = Dispositivo.objects.order_by(
- 'ordem_bloco_atualizador').filter(
- Q(dispositivo_pai_id=self.pk) |
- Q(dispositivo_atualizador_id=self.pk))
+ filhos = Dispositivo.objects.order_by("ordem_bloco_atualizador").filter(
+ Q(dispositivo_pai_id=self.pk) | Q(dispositivo_atualizador_id=self.pk)
+ )
if not filhos.exists():
return
ordem_max = filhos.last().ordem_bloco_atualizador
- filhos.update(
- ordem_bloco_atualizador=F('ordem_bloco_atualizador') + ordem_max)
+ filhos.update(ordem_bloco_atualizador=F("ordem_bloco_atualizador") + ordem_max)
- filhos = filhos.values_list(
- 'pk', flat=True).order_by('ordem_bloco_atualizador')
+ filhos = filhos.values_list("pk", flat=True).order_by("ordem_bloco_atualizador")
count = 0
for d in filhos:
count += Dispositivo.INTERVALO_ORDEM
- Dispositivo.objects.filter(pk=d).update(
- ordem_bloco_atualizador=count)
+ Dispositivo.objects.filter(pk=d).update(ordem_bloco_atualizador=count)
class Vide(TimestampedMixin):
- texto = models.TextField(verbose_name=_('Texto do Vide'))
+ texto = models.TextField(verbose_name=_("Texto do Vide"))
tipo = models.ForeignKey(
- TipoVide,
- verbose_name=_('Tipo do Vide'),
- on_delete=models.PROTECT
+ TipoVide, verbose_name=_("Tipo do Vide"), on_delete=models.PROTECT
)
dispositivo_base = models.ForeignKey(
Dispositivo,
- verbose_name=_('Dispositivo Base'),
- related_name='dispositivo_base_set',
- on_delete=models.PROTECT
+ verbose_name=_("Dispositivo Base"),
+ related_name="dispositivo_base_set",
+ on_delete=models.PROTECT,
)
dispositivo_ref = models.ForeignKey(
Dispositivo,
- related_name='dispositivo_citado_set',
- verbose_name=_('Dispositivo Referido'),
- on_delete=models.PROTECT
+ related_name="dispositivo_citado_set",
+ verbose_name=_("Dispositivo Referido"),
+ on_delete=models.PROTECT,
)
class Meta:
- verbose_name = _('Vide')
- verbose_name_plural = _('Vides')
- ordering = ('id',)
- unique_together = ['dispositivo_base', 'dispositivo_ref', 'tipo']
+ verbose_name = _("Vide")
+ verbose_name_plural = _("Vides")
+ ordering = ("id",)
+ unique_together = ["dispositivo_base", "dispositivo_ref", "tipo"]
def __str__(self):
- return _('Vide %s') % self.texto
+ return _("Vide %s") % self.texto
NPRIV = 1
@@ -1948,69 +2017,58 @@ NINST = 2
NPUBL = 3
NOTAS_PUBLICIDADE_CHOICES = (
# Only the owner of the note has visibility.
- (NPRIV, _('Nota Privada')),
+ (NPRIV, _("Nota Privada")),
# All authenticated users have visibility.
- (NINST, _('Nota Institucional')),
+ (NINST, _("Nota Institucional")),
# All users have visibility.
- (NPUBL, _('Nota Pública')),
+ (NPUBL, _("Nota Pública")),
)
class Nota(TimestampedMixin):
-
NPRIV = 1
NINST = 2
NPUBL = 3
titulo = models.CharField(
- verbose_name=_('Título'),
- max_length=100,
- default='',
- blank=True
+ verbose_name=_("Título"), max_length=100, default="", blank=True
)
- texto = models.TextField(verbose_name=_('Texto'))
+ texto = models.TextField(verbose_name=_("Texto"))
url_externa = models.URLField(
- max_length=1024,
- blank=True,
- verbose_name=_('Url externa')
+ max_length=1024, blank=True, verbose_name=_("Url externa")
)
- publicacao = models.DateTimeField(verbose_name=_('Data de Publicação'))
+ publicacao = models.DateTimeField(verbose_name=_("Data de Publicação"))
- efetividade = models.DateTimeField(verbose_name=_('Data de Efeito'))
+ efetividade = models.DateTimeField(verbose_name=_("Data de Efeito"))
tipo = models.ForeignKey(
- TipoNota,
- verbose_name=_('Tipo da Nota'),
- on_delete=models.PROTECT
+ TipoNota, verbose_name=_("Tipo da Nota"), on_delete=models.PROTECT
)
dispositivo = models.ForeignKey(
Dispositivo,
- verbose_name=_('Dispositivo da Nota'),
- related_name='dispositivo_nota_set',
- on_delete=models.PROTECT
+ verbose_name=_("Dispositivo da Nota"),
+ related_name="dispositivo_nota_set",
+ on_delete=models.PROTECT,
)
owner = models.ForeignKey(
get_settings_auth_user_model(),
- verbose_name=_('Dono da Nota'),
- on_delete=models.PROTECT
+ verbose_name=_("Dono da Nota"),
+ on_delete=models.PROTECT,
)
publicidade = models.PositiveSmallIntegerField(
- choices=NOTAS_PUBLICIDADE_CHOICES,
- verbose_name=_('Nível de Publicidade'))
+ choices=NOTAS_PUBLICIDADE_CHOICES, verbose_name=_("Nível de Publicidade")
+ )
class Meta:
- verbose_name = _('Nota')
- verbose_name_plural = _('Notas')
- ordering = ['-publicacao', '-modified']
+ verbose_name = _("Nota")
+ verbose_name_plural = _("Notas")
+ ordering = ["-publicacao", "-modified"]
def __str__(self):
- return '%s: %s' % (
- self.tipo,
- self.get_publicidade_display()
- )
+ return "%s: %s" % (self.tipo, self.get_publicidade_display())
diff --git a/sapl/compilacao/templatetags/compilacao_filters.py b/sapl/compilacao/templatetags/compilacao_filters.py
index 0e8d896ae..e6e652050 100644
--- a/sapl/compilacao/templatetags/compilacao_filters.py
+++ b/sapl/compilacao/templatetags/compilacao_filters.py
@@ -1,4 +1,3 @@
-
from django import template
from django.core.signing import Signer
from django.db.models import Q
@@ -11,7 +10,6 @@ register = template.Library()
class DispositivoTreeNode(template.Node):
-
def __init__(self, template_nodes, dispositivo_list_var):
self.template_nodes = template_nodes
self.dispositivo_list_var = dispositivo_list_var
@@ -20,103 +18,108 @@ class DispositivoTreeNode(template.Node):
bits_alts = []
bits_filhos = []
context.push()
- for child in node['alts']:
+ for child in node["alts"]:
bits_alts.append(self._render_node(context, child))
- for child in node['filhos']:
+ for child in node["filhos"]:
bits_filhos.append(self._render_node(context, child))
- context['node'] = node
- context['alts'] = mark_safe(''.join(bits_alts))
- context['filhos'] = mark_safe(''.join(bits_filhos))
+ context["node"] = node
+ context["alts"] = mark_safe("".join(bits_alts))
+ context["filhos"] = mark_safe("".join(bits_filhos))
rendered = self.template_nodes.render(context)
context.pop()
return rendered
def render(self, context):
dispositivo_list_var = self.dispositivo_list_var.resolve(context)
- bits = [self._render_node(context, node)
- for node in dispositivo_list_var]
- return ''.join(bits)
+ bits = [self._render_node(context, node) for node in dispositivo_list_var]
+ return "".join(bits)
@register.tag
def dispositivotree(parser, token):
-
bits = token.contents.split()
if len(bits) != 2:
- raise template.TemplateSyntaxError(
- _('%s tag requires a queryset') % bits[0])
+ raise template.TemplateSyntaxError(_("%s tag requires a queryset") % bits[0])
dispositivo_list_var = template.Variable(bits[1])
- template_nodes = parser.parse(('enddispositivotree',))
+ template_nodes = parser.parse(("enddispositivotree",))
parser.delete_first_token()
return DispositivoTreeNode(template_nodes, dispositivo_list_var)
+
# --------------------------------------------------------------
@register.filter
def get_bloco_atualizador(pk_atualizador):
- return Dispositivo.objects.order_by('ordem_bloco_atualizador').filter(
- Q(dispositivo_pai_id=pk_atualizador) |
- Q(dispositivo_atualizador_id=pk_atualizador)).select_related()
+ return (
+ Dispositivo.objects.order_by("ordem_bloco_atualizador")
+ .filter(
+ Q(dispositivo_pai_id=pk_atualizador)
+ | Q(dispositivo_atualizador_id=pk_atualizador)
+ )
+ .select_related()
+ )
@register.simple_tag
def dispositivo_desativado(dispositivo, inicio_vigencia, fim_vigencia):
if dispositivo.dispositivo_de_revogacao:
- return 'revogado'
+ return "revogado"
if inicio_vigencia and fim_vigencia:
if dispositivo.fim_vigencia is None:
- return ''
+ return ""
elif dispositivo.fim_vigencia >= fim_vigencia:
- return ''
- return 'desativado'
+ return ""
+ return "desativado"
else:
if dispositivo.fim_vigencia is not None:
- return 'desativado'
- return ''
+ return "desativado"
+ return ""
@register.simple_tag
def nota_automatica(dispositivo, ta_pub_list):
-
- if dispositivo.ta_publicado and dispositivo.dispositivo_atualizador is not None and dispositivo.dispositivo_atualizador.dispositivo_pai is not None:
+ if (
+ dispositivo.ta_publicado
+ and dispositivo.dispositivo_atualizador is not None
+ and dispositivo.dispositivo_atualizador.dispositivo_pai is not None
+ ):
d = dispositivo.dispositivo_atualizador.dispositivo_pai
if d.auto_inserido:
d = d.dispositivo_pai
- ta_publicado = ta_pub_list[dispositivo.ta_publicado_id] if\
- ta_pub_list else dispositivo.ta_publicado
+ ta_publicado = (
+ ta_pub_list[dispositivo.ta_publicado_id]
+ if ta_pub_list
+ else dispositivo.ta_publicado
+ )
if dispositivo.dispositivo_de_revogacao:
- return _('Revogado pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Revogado pelo %s - %s.") % (d, ta_publicado)
elif not dispositivo.dispositivo_substituido_id:
- return _('Inclusão feita pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Inclusão feita pelo %s - %s.") % (d, ta_publicado)
else:
if dispositivo.tipo_dispositivo.dispositivo_de_articulacao:
- return _('Alteração de rótulo feita pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Alteração de rótulo feita pelo %s - %s.") % (d, ta_publicado)
else:
- return _('Alteração feita pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Alteração feita pelo %s - %s.") % (d, ta_publicado)
- return ''
+ return ""
@register.simple_tag
def set_nivel_old(view, value):
view.flag_nivel_old = value
- return ''
+ return ""
@register.simple_tag
def close_div(value_max, value_min, varr):
- return mark_safe('' * (int(value_max) - int(value_min) + 1 + varr))
+ return mark_safe("" * (int(value_max) - int(value_min) + 1 + varr))
@register.filter
@@ -124,7 +127,8 @@ def get_sign_vigencia(value):
string = "%s,%s,%s" % (
value.ta_publicado_id if value.ta_publicado_id else 0,
value.inicio_vigencia,
- value.fim_vigencia)
+ value.fim_vigencia,
+ )
signer = Signer()
return signer.sign(str(string))
@@ -142,8 +146,7 @@ def isinst(value, class_str):
@register.filter
def render_actions_head(view, d_atual):
-
- if view.__class__.__name__ != 'DispositivoSimpleEditView':
+ if view.__class__.__name__ != "DispositivoSimpleEditView":
return False
# Menu
@@ -160,45 +163,51 @@ def render_actions_head(view, d_atual):
@register.filter
def short_string(str, length):
if len(str) > length:
- return str[:length] + '...'
+ return str[:length] + "..."
else:
return str
@register.filter
def nomenclatura(d):
- result = ''
- if d.rotulo != '':
- if d.tipo_dispositivo.rotulo_prefixo_texto != '':
+ result = ""
+ if d.rotulo != "":
+ if d.tipo_dispositivo.rotulo_prefixo_texto != "":
result = d.rotulo
else:
- result = '(' + d.tipo_dispositivo.nome + ' ' + \
- d.rotulo + ')'
+ result = "(" + d.tipo_dispositivo.nome + " " + d.rotulo + ")"
else:
r = d.rotulo_padrao()
if r:
- r += ' '
- result = '(' + d.tipo_dispositivo.nome + r + ')'
+ r += " "
+ result = "(" + d.tipo_dispositivo.nome + r + ")"
return result
def update_dispositivos_parents(dpts_parents, ta_id):
-
- dpts = Dispositivo.objects.order_by('ordem').filter(
- ta_id=ta_id).values_list(
- 'pk', 'dispositivo_pai_id', 'rotulo', 'tipo_dispositivo__nome',
- 'tipo_dispositivo__rotulo_prefixo_texto')
+ dpts = (
+ Dispositivo.objects.order_by("ordem")
+ .filter(ta_id=ta_id)
+ .values_list(
+ "pk",
+ "dispositivo_pai_id",
+ "rotulo",
+ "tipo_dispositivo__nome",
+ "tipo_dispositivo__rotulo_prefixo_texto",
+ )
+ )
for d in dpts:
- dpts_parents[str(d[0])] = {
- 'd': d, 'p': [], 'h': None}
+ dpts_parents[str(d[0])] = {"d": d, "p": [], "h": None}
def parents(k):
- pai = dpts_parents[str(k)]['d'][1]
- p = dpts_parents[str(k)]['p']
+ pai = dpts_parents[str(k)]["d"][1]
+ p = dpts_parents[str(k)]["p"]
if not p:
if pai:
- parent_k = [pai, ] + parents(pai)
+ parent_k = [
+ pai,
+ ] + parents(pai)
else:
parent_k = []
else:
@@ -207,12 +216,12 @@ def update_dispositivos_parents(dpts_parents, ta_id):
return parent_k
for k in dpts_parents:
- dpts_parents[str(k)]['p'] = parents(k)
+ dpts_parents[str(k)]["p"] = parents(k)
@register.simple_tag
def heranca(request, d, ignore_ultimo=0, ignore_primeiro=0):
- ta_dpts_parents = request.session.get('herancas')
+ ta_dpts_parents = request.session.get("herancas")
if not ta_dpts_parents:
ta_dpts_parents = {}
@@ -225,7 +234,7 @@ def heranca(request, d, ignore_ultimo=0, ignore_primeiro=0):
ta_dpts_parents[ta_id] = dpts_parents
update_dispositivos_parents(dpts_parents, ta_id)
- herancas_fila = request.session.get('herancas_fila')
+ herancas_fila = request.session.get("herancas_fila")
if not herancas_fila:
herancas_fila = []
@@ -234,22 +243,21 @@ def heranca(request, d, ignore_ultimo=0, ignore_primeiro=0):
ta_remove = herancas_fila.pop(0)
del ta_dpts_parents[str(ta_remove)]
- request.session['herancas_fila'] = herancas_fila
- request.session['herancas'] = ta_dpts_parents
+ request.session["herancas_fila"] = herancas_fila
+ request.session["herancas"] = ta_dpts_parents
- h = ta_dpts_parents[ta_id][d_pk]['h']
+ h = ta_dpts_parents[ta_id][d_pk]["h"]
if h:
return h
dpts_parents = ta_dpts_parents[ta_id]
- parents = dpts_parents[d_pk]['p']
- result = ''
+ parents = dpts_parents[d_pk]["p"]
+ result = ""
if parents:
pk_last = parents[-1]
for pk in parents:
-
if ignore_ultimo and pk == pk_last:
break
@@ -257,23 +265,21 @@ def heranca(request, d, ignore_ultimo=0, ignore_primeiro=0):
ignore_primeiro = 0
continue
- p = dpts_parents[str(pk)]['d']
+ p = dpts_parents[str(pk)]["d"]
- if p[4] != '':
- result = p[2] + ' ' + result
+ if p[4] != "":
+ result = p[2] + " " + result
else:
- result = '(' + p[3] + ' ' + \
- p[2] + ')' + ' ' + result
+ result = "(" + p[3] + " " + p[2] + ")" + " " + result
- dpts_parents[d_pk]['h'] = result
+ dpts_parents[d_pk]["h"] = result
return result
@register.simple_tag
def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0):
- result = ''
+ result = ""
while d is not None:
-
if ignore_ultimo and d.dispositivo_pai is None:
break
if ignore_primeiro:
@@ -281,22 +287,27 @@ def nomenclatura_heranca(d, ignore_ultimo=0, ignore_primeiro=0):
d = d.dispositivo_pai
continue
- if d.rotulo != '':
- if d.tipo_dispositivo.rotulo_prefixo_texto != '':
- result = d.rotulo + ' ' + result
+ if d.rotulo != "":
+ if d.tipo_dispositivo.rotulo_prefixo_texto != "":
+ result = d.rotulo + " " + result
else:
- result = '(' + d.tipo_dispositivo.nome + ' ' + \
- d.rotulo + ')' + ' ' + result
+ result = (
+ "(" + d.tipo_dispositivo.nome + " " + d.rotulo + ")" + " " + result
+ )
else:
- result = '(' + d.tipo_dispositivo.nome + \
- d.rotulo_padrao() + ')' + ' ' + result
+ result = (
+ "(" + d.tipo_dispositivo.nome + d.rotulo_padrao() + ")" + " " + result
+ )
d = d.dispositivo_pai
return result
+
@register.filter
def list(obj):
- return [obj, ]
+ return [
+ obj,
+ ]
@register.filter
diff --git a/sapl/compilacao/tests/test_compilacao.py b/sapl/compilacao/tests/test_compilacao.py
index fec382392..345d8d749 100644
--- a/sapl/compilacao/tests/test_compilacao.py
+++ b/sapl/compilacao/tests/test_compilacao.py
@@ -1,104 +1,85 @@
import pytest
from model_bakery import baker
-from sapl.compilacao.models import PerfilEstruturalTextoArticulado
-from sapl.compilacao.models import TipoTextoArticulado
-from sapl.compilacao.models import TextoArticulado, TipoNota
-from sapl.compilacao.models import TipoVide, TipoDispositivo
-from sapl.compilacao.models import TipoDispositivoRelationship
+from sapl.compilacao.models import (PerfilEstruturalTextoArticulado,
+ TextoArticulado, TipoDispositivo,
+ TipoDispositivoRelationship, TipoNota,
+ TipoTextoArticulado, TipoVide)
@pytest.mark.django_db(transaction=False)
def test_perfil_estrutural_texto_articulado_model():
perfil_estrutural_texto_articulado = baker.make(
- PerfilEstruturalTextoArticulado,
- nome='Teste_Nome_Perfil',
- sigla='TSPETA')
+ PerfilEstruturalTextoArticulado, nome="Teste_Nome_Perfil", sigla="TSPETA"
+ )
- assert perfil_estrutural_texto_articulado.nome == 'Teste_Nome_Perfil'
- assert perfil_estrutural_texto_articulado.sigla == 'TSPETA'
+ assert perfil_estrutural_texto_articulado.nome == "Teste_Nome_Perfil"
+ assert perfil_estrutural_texto_articulado.sigla == "TSPETA"
@pytest.mark.django_db(transaction=False)
def test_tipo_texto_articulado_model():
tipo_texto_articulado = baker.make(
- TipoTextoArticulado,
- sigla='TTP',
- descricao='T_Desc_Tipo_Texto_Articulado'
+ TipoTextoArticulado, sigla="TTP", descricao="T_Desc_Tipo_Texto_Articulado"
)
- assert tipo_texto_articulado.sigla == 'TTP'
- assert tipo_texto_articulado.descricao == 'T_Desc_Tipo_Texto_Articulado'
+ assert tipo_texto_articulado.sigla == "TTP"
+ assert tipo_texto_articulado.descricao == "T_Desc_Tipo_Texto_Articulado"
@pytest.mark.django_db(transaction=False)
def test_texto_articulado_model():
texto_articulado = baker.make(
TextoArticulado,
- ementa='Teste_Ementa_Texto_Articulado',
- numero='12345678',
+ ementa="Teste_Ementa_Texto_Articulado",
+ numero="12345678",
ano=2016,
)
- assert texto_articulado.ementa == 'Teste_Ementa_Texto_Articulado'
- assert texto_articulado.numero == '12345678'
+ assert texto_articulado.ementa == "Teste_Ementa_Texto_Articulado"
+ assert texto_articulado.numero == "12345678"
assert texto_articulado.ano == 2016
@pytest.mark.django_db(transaction=False)
def test_tipo_nota_model():
- tipo_nota = baker.make(
- TipoNota,
- sigla='TTN',
- nome='Teste_Nome_Tipo_Nota'
- )
+ tipo_nota = baker.make(TipoNota, sigla="TTN", nome="Teste_Nome_Tipo_Nota")
- assert tipo_nota.sigla == 'TTN'
- assert tipo_nota.nome == 'Teste_Nome_Tipo_Nota'
+ assert tipo_nota.sigla == "TTN"
+ assert tipo_nota.nome == "Teste_Nome_Tipo_Nota"
@pytest.mark.django_db(transaction=False)
def test_tipo_vide_model():
- tipo_vide = baker.make(
- TipoVide,
- sigla='TTV',
- nome='Teste_Nome_Tipo_Vide'
- )
+ tipo_vide = baker.make(TipoVide, sigla="TTV", nome="Teste_Nome_Tipo_Vide")
- assert tipo_vide.sigla == 'TTV'
- assert tipo_vide.nome == 'Teste_Nome_Tipo_Vide'
+ assert tipo_vide.sigla == "TTV"
+ assert tipo_vide.nome == "Teste_Nome_Tipo_Vide"
@pytest.mark.django_db(transaction=False)
def test_tipo_dispositivo_model():
tipo_dispositivo = baker.make(
- TipoDispositivo,
- nome='Teste_Nome_Tipo_Dispositivo',
- rotulo_ordinal=0
+ TipoDispositivo, nome="Teste_Nome_Tipo_Dispositivo", rotulo_ordinal=0
)
- assert tipo_dispositivo.nome == 'Teste_Nome_Tipo_Dispositivo'
+ assert tipo_dispositivo.nome == "Teste_Nome_Tipo_Dispositivo"
assert tipo_dispositivo.rotulo_ordinal == 0
@pytest.mark.django_db(transaction=False)
def test_tipo_dispositivo_relationship_model():
tipo_dispositivo_pai = baker.make(
- TipoDispositivo,
- nome='Tipo_Dispositivo_Pai',
- rotulo_ordinal=0
+ TipoDispositivo, nome="Tipo_Dispositivo_Pai", rotulo_ordinal=0
)
t_dispositivo_filho = baker.make(
- TipoDispositivo,
- nome='Tipo_Dispositivo_Filho',
- rotulo_ordinal=0
+ TipoDispositivo, nome="Tipo_Dispositivo_Filho", rotulo_ordinal=0
)
p_e_texto_articulado = baker.make(
- PerfilEstruturalTextoArticulado,
- nome='Teste_Nome_Perfil',
- sigla='TSPETA')
+ PerfilEstruturalTextoArticulado, nome="Teste_Nome_Perfil", sigla="TSPETA"
+ )
tipo_dispositivo_relationship = baker.make(
TipoDispositivoRelationship,
diff --git a/sapl/compilacao/tests/test_tipo_texto_articulado_form.py b/sapl/compilacao/tests/test_tipo_texto_articulado_form.py
index 8c58f6cfd..3476a7e33 100644
--- a/sapl/compilacao/tests/test_tipo_texto_articulado_form.py
+++ b/sapl/compilacao/tests/test_tipo_texto_articulado_form.py
@@ -14,10 +14,10 @@ def test_valida_campos_obrigatorios_tipo_texto_articulado_form():
errors = form.errors
- assert errors['sigla'] == [_('Este campo é obrigatório.')]
- assert errors['descricao'] == [_('Este campo é obrigatório.')]
- assert errors['participacao_social'] == [_('Este campo é obrigatório.')]
- assert errors['publicacao_func'] == [_('Este campo é obrigatório.')]
+ assert errors["sigla"] == [_("Este campo é obrigatório.")]
+ assert errors["descricao"] == [_("Este campo é obrigatório.")]
+ assert errors["participacao_social"] == [_("Este campo é obrigatório.")]
+ assert errors["publicacao_func"] == [_("Este campo é obrigatório.")]
assert len(errors) == 4
@@ -29,12 +29,12 @@ def test_valida_campos_obrigatorios_nota_form():
errors = form.errors
- assert errors['texto'] == [_('Este campo é obrigatório')]
- assert errors['publicidade'] == [_('Este campo é obrigatório.')]
- assert errors['tipo'] == [_('Este campo é obrigatório.')]
- assert errors['publicacao'] == [_('Este campo é obrigatório')]
- assert errors['efetividade'] == [_('Este campo é obrigatório')]
- assert errors['dispositivo'] == [_('Este campo é obrigatório.')]
+ assert errors["texto"] == [_("Este campo é obrigatório")]
+ assert errors["publicidade"] == [_("Este campo é obrigatório.")]
+ assert errors["tipo"] == [_("Este campo é obrigatório.")]
+ assert errors["publicacao"] == [_("Este campo é obrigatório")]
+ assert errors["efetividade"] == [_("Este campo é obrigatório")]
+ assert errors["dispositivo"] == [_("Este campo é obrigatório.")]
assert len(errors) == 6
@@ -43,15 +43,18 @@ def test_valida_campos_obrigatorios_nota_form():
def test_nota_form_invalido():
tipo = baker.make(TipoNota)
- form = forms.NotaForm(data={'titulo': 'titulo',
- 'texto': 'teste',
- 'url_externa': 'www.test.com',
- 'publicidade': 'publicidade',
- 'tipo': str(tipo.pk),
- 'publicacao': '10/05/2017',
- 'efetividade': '10/05/2017',
- 'dispositivo': 'dispositivo',
- 'pk': 'pk'
- })
+ form = forms.NotaForm(
+ data={
+ "titulo": "titulo",
+ "texto": "teste",
+ "url_externa": "www.test.com",
+ "publicidade": "publicidade",
+ "tipo": str(tipo.pk),
+ "publicacao": "10/05/2017",
+ "efetividade": "10/05/2017",
+ "dispositivo": "dispositivo",
+ "pk": "pk",
+ }
+ )
assert not form.is_valid()
diff --git a/sapl/compilacao/urls.py b/sapl/compilacao/urls.py
index 10947b756..0c616c8d6 100644
--- a/sapl/compilacao/urls.py
+++ b/sapl/compilacao/urls.py
@@ -2,117 +2,139 @@ from django.urls import include, path, re_path
from sapl.compilacao import views
from sapl.compilacao.views import (TipoDispositivoCrud, TipoNotaCrud,
- TipoPublicacaoCrud, TipoVideCrud,
- VeiculoPublicacaoCrud,
- TipoTextoArticuladoCrud)
+ TipoPublicacaoCrud, TipoTextoArticuladoCrud,
+ TipoVideCrud, VeiculoPublicacaoCrud)
from .apps import AppConfig
app_name = AppConfig.name
urlpatterns_compilacao = [
- path('', views.TaListView.as_view(), name='ta_list'),
- path('create', views.TaCreateView.as_view(), name='ta_create'),
- path('', views.TaDetailView.as_view(), name='ta_detail'),
- path('/edit',
- views.TaUpdateView.as_view(), name='ta_edit'),
- path('/delete',
- views.TaDeleteView.as_view(), name='ta_delete'),
-
-
- path('/text',
- views.TextView.as_view(), name='ta_text'),
-
- re_path(r'^(?P[0-9]+)/text/vigencia/(?P.*:[A-Za-z0-9_-]+)/$',
- views.TextView.as_view(), name='ta_vigencia'),
-
- re_path(r'^(?P[0-9]+)/text/edit',
- views.TextEditView.as_view(), name='ta_text_edit'),
-
- re_path(r'^(?P[0-9]+)/text/notifications',
- views.TextNotificacoesView.as_view(), name='ta_text_notificacoes'),
-
- path('/text//',
- views.DispositivoView.as_view(), name='dispositivo'),
-
- re_path(r'^(?P[0-9]+)/text/(?P[0-9]+)/refresh',
+ path("", views.TaListView.as_view(), name="ta_list"),
+ path("create", views.TaCreateView.as_view(), name="ta_create"),
+ path("", views.TaDetailView.as_view(), name="ta_detail"),
+ path("/edit", views.TaUpdateView.as_view(), name="ta_edit"),
+ path("/delete", views.TaDeleteView.as_view(), name="ta_delete"),
+ path("/text", views.TextView.as_view(), name="ta_text"),
+ re_path(
+ r"^(?P[0-9]+)/text/vigencia/(?P.*:[A-Za-z0-9_-]+)/$",
+ views.TextView.as_view(),
+ name="ta_vigencia",
+ ),
+ re_path(
+ r"^(?P[0-9]+)/text/edit",
+ views.TextEditView.as_view(),
+ name="ta_text_edit",
+ ),
+ re_path(
+ r"^(?P[0-9]+)/text/notifications",
+ views.TextNotificacoesView.as_view(),
+ name="ta_text_notificacoes",
+ ),
+ path(
+ "/text//",
+ views.DispositivoView.as_view(),
+ name="dispositivo",
+ ),
+ re_path(
+ r"^(?P[0-9]+)/text/(?P[0-9]+)/refresh",
views.DispositivoDinamicEditView.as_view(),
- name='dispositivo_refresh'),
-
- path('/text//edit',
- views.DispositivoEdicaoBasicaView.as_view(), name='dispositivo_edit'),
-
- re_path(r'^(?P[0-9]+)/text/(?P[0-9]+)/edit/vigencia',
+ name="dispositivo_refresh",
+ ),
+ path(
+ "/text//edit",
+ views.DispositivoEdicaoBasicaView.as_view(),
+ name="dispositivo_edit",
+ ),
+ re_path(
+ r"^(?P[0-9]+)/text/(?P[0-9]+)/edit/vigencia",
views.DispositivoEdicaoVigenciaView.as_view(),
- name='dispositivo_edit_vigencia'),
-
- re_path(r'^(?P[0-9]+)/text/(?P[0-9]+)/edit/alteracao',
+ name="dispositivo_edit_vigencia",
+ ),
+ re_path(
+ r"^(?P[0-9]+)/text/(?P[0-9]+)/edit/alteracao",
views.DispositivoEdicaoAlteracaoView.as_view(),
- name='dispositivo_edit_alteracao'),
-
- re_path(r'^(?P[0-9]+)/text/(?P[0-9]+)/edit/definidor_vigencia',
+ name="dispositivo_edit_alteracao",
+ ),
+ re_path(
+ r"^(?P[0-9]+)/text/(?P[0-9]+)/edit/definidor_vigencia",
views.DispositivoDefinidorVigenciaView.as_view(),
- name='dispositivo_edit_definidor_vigencia'),
-
-
- path('/text//nota/create',
- views.NotasCreateView.as_view(), name='nota_create'),
-
- path('/text//nota//edit',
- views.NotasEditView.as_view(), name='nota_edit'),
-
- path('/text//nota//delete',
- views.NotasDeleteView.as_view(), name='nota_delete'),
-
- path('/text//vide/create',
- views.VideCreateView.as_view(), name='vide_create'),
-
- path('/text//vide//edit',
- views.VideEditView.as_view(), name='vide_edit'),
-
- path('/text//vide//delete',
- views.VideDeleteView.as_view(), name='vide_delete'),
-
- path('search_fragment_form',
+ name="dispositivo_edit_definidor_vigencia",
+ ),
+ path(
+ "/text//nota/create",
+ views.NotasCreateView.as_view(),
+ name="nota_create",
+ ),
+ path(
+ "/text//nota//edit",
+ views.NotasEditView.as_view(),
+ name="nota_edit",
+ ),
+ path(
+ "/text//nota//delete",
+ views.NotasDeleteView.as_view(),
+ name="nota_delete",
+ ),
+ path(
+ "/text//vide/create",
+ views.VideCreateView.as_view(),
+ name="vide_create",
+ ),
+ path(
+ "/text//vide//edit",
+ views.VideEditView.as_view(),
+ name="vide_edit",
+ ),
+ path(
+ "/text//vide//delete",
+ views.VideDeleteView.as_view(),
+ name="vide_delete",
+ ),
+ path(
+ "search_fragment_form",
views.DispositivoSearchFragmentFormView.as_view(),
- name='dispositivo_fragment_form'),
-
- path('search_form',
+ name="dispositivo_fragment_form",
+ ),
+ path(
+ "search_form",
views.DispositivoSearchModalView.as_view(),
- name='dispositivo_search_form'),
-
-
- path('/publicacao',
- views.PublicacaoListView.as_view(), name='ta_pub_list'),
- path('/publicacao/create',
- views.PublicacaoCreateView.as_view(), name='ta_pub_create'),
- path('/publicacao/',
- views.PublicacaoDetailView.as_view(), name='ta_pub_detail'),
- path('/publicacao//edit',
- views.PublicacaoUpdateView.as_view(), name='ta_pub_edit'),
- path('/publicacao//delete',
- views.PublicacaoDeleteView.as_view(), name='ta_pub_delete'),
-
-
-
+ name="dispositivo_search_form",
+ ),
+ path(
+ "/publicacao", views.PublicacaoListView.as_view(), name="ta_pub_list"
+ ),
+ path(
+ "/publicacao/create",
+ views.PublicacaoCreateView.as_view(),
+ name="ta_pub_create",
+ ),
+ path(
+ "/publicacao/",
+ views.PublicacaoDetailView.as_view(),
+ name="ta_pub_detail",
+ ),
+ path(
+ "/publicacao//edit",
+ views.PublicacaoUpdateView.as_view(),
+ name="ta_pub_edit",
+ ),
+ path(
+ "/publicacao//delete",
+ views.PublicacaoDeleteView.as_view(),
+ name="ta_pub_delete",
+ ),
]
urlpatterns = [
- path('ta/', include(urlpatterns_compilacao)),
-
- path('sistema/ta/config/tipo-nota/',
- include(TipoNotaCrud.get_urls())),
- path('sistema/ta/config/tipo-vide/',
- include(TipoVideCrud.get_urls())),
- path('sistema/ta/config/tipo-publicacao/',
- include(TipoPublicacaoCrud.get_urls())),
- path('sistema/ta/config/veiculo-publicacao/',
- include(VeiculoPublicacaoCrud.get_urls())),
- path('sistema/ta/config/tipo/',
- include(TipoTextoArticuladoCrud.get_urls())),
- path('sistema/ta/config/tipodispositivo/',
- include(TipoDispositivoCrud.get_urls())),
-
-
-
+ path("ta/", include(urlpatterns_compilacao)),
+ path("sistema/ta/config/tipo-nota/", include(TipoNotaCrud.get_urls())),
+ path("sistema/ta/config/tipo-vide/", include(TipoVideCrud.get_urls())),
+ path("sistema/ta/config/tipo-publicacao/", include(TipoPublicacaoCrud.get_urls())),
+ path(
+ "sistema/ta/config/veiculo-publicacao/",
+ include(VeiculoPublicacaoCrud.get_urls()),
+ ),
+ path("sistema/ta/config/tipo/", include(TipoTextoArticuladoCrud.get_urls())),
+ path("sistema/ta/config/tipodispositivo/", include(TipoDispositivoCrud.get_urls())),
]
diff --git a/sapl/compilacao/utils.py b/sapl/compilacao/utils.py
index aa1793484..5673d4c53 100644
--- a/sapl/compilacao/utils.py
+++ b/sapl/compilacao/utils.py
@@ -1,29 +1,31 @@
import sys
DISPOSITIVO_SELECT_RELATED = (
- 'tipo_dispositivo',
- 'ta_publicado',
- 'ta',
- 'dispositivo_atualizador',
- 'dispositivo_atualizador__dispositivo_pai',
- 'dispositivo_atualizador__dispositivo_pai__ta',
- 'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta',
- 'dispositivo_pai',
- 'dispositivo_pai__tipo_dispositivo',
- 'ta_publicado',
- 'ta',)
+ "tipo_dispositivo",
+ "ta_publicado",
+ "ta",
+ "dispositivo_atualizador",
+ "dispositivo_atualizador__dispositivo_pai",
+ "dispositivo_atualizador__dispositivo_pai__ta",
+ "dispositivo_atualizador__dispositivo_pai__ta__tipo_ta",
+ "dispositivo_pai",
+ "dispositivo_pai__tipo_dispositivo",
+ "ta_publicado",
+ "ta",
+)
DISPOSITIVO_SELECT_RELATED_EDIT = (
- 'ta_publicado',
- 'ta',
- 'dispositivo_atualizador',
- 'dispositivo_atualizador__dispositivo_pai',
- 'dispositivo_atualizador__dispositivo_pai__ta',
- 'dispositivo_atualizador__dispositivo_pai__ta__tipo_ta',
- 'dispositivo_pai',
- 'dispositivo_pai__tipo_dispositivo',
- 'ta_publicado',
- 'ta',)
+ "ta_publicado",
+ "ta",
+ "dispositivo_atualizador",
+ "dispositivo_atualizador__dispositivo_pai",
+ "dispositivo_atualizador__dispositivo_pai__ta",
+ "dispositivo_atualizador__dispositivo_pai__ta__tipo_ta",
+ "dispositivo_pai",
+ "dispositivo_pai__tipo_dispositivo",
+ "ta_publicado",
+ "ta",
+)
def int_to_roman(int_value):
@@ -32,8 +34,7 @@ def int_to_roman(int_value):
if not 0 < int_value < 4000:
raise ValueError("Argument must be between 1 and 3999")
ints = (1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1)
- nums = ('M', 'CM', 'D', 'CD', 'C', 'XC',
- 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I')
+ nums = ("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I")
result = ""
for i in range(len(ints)):
count = int(int_value / ints[i])
@@ -43,9 +44,9 @@ def int_to_roman(int_value):
def int_to_letter(int_value):
- result = ''
+ result = ""
if not int_value:
- return '0'
+ return "0"
int_value -= 1
while int_value >= 26:
rest = int_value % 26
@@ -59,10 +60,10 @@ def get_integrations_view_names():
result = []
modules = sys.modules
for key, value in modules.items():
- if key.endswith('.views'):
+ if key.endswith(".views"):
for v in value.__dict__.values():
- if hasattr(v, '__bases__'):
+ if hasattr(v, "__bases__"):
for base in v.__bases__:
- if 'IntegracaoTaView' in str(base):
+ if "IntegracaoTaView" in str(base):
result.append(v)
return result
diff --git a/sapl/compilacao/views.py b/sapl/compilacao/views.py
index 68650bfe9..5dba344ef 100644
--- a/sapl/compilacao/views.py
+++ b/sapl/compilacao/views.py
@@ -1,7 +1,7 @@
-from collections import OrderedDict
-from datetime import timedelta
import logging
import sys
+from collections import OrderedDict
+from datetime import timedelta
from braces.views import FormMessagesMixin
from bs4 import BeautifulSoup
@@ -11,13 +11,13 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin
from django.contrib.contenttypes.models import ContentType
-from django.core.exceptions import ValidationError, PermissionDenied
+from django.core.exceptions import PermissionDenied, ValidationError
from django.core.signing import Signer
from django.db import transaction
from django.db.models import Q
from django.db.models.query import QuerySet
-from django.http.response import (HttpResponse, HttpResponseRedirect,
- JsonResponse, Http404)
+from django.http.response import (Http404, HttpResponse, HttpResponseRedirect,
+ JsonResponse)
from django.shortcuts import get_object_or_404, redirect
from django.urls import reverse, reverse_lazy
from django.utils.dateparse import parse_date
@@ -50,30 +50,29 @@ from sapl.compilacao.models import (STATUS_TA_EDITION, STATUS_TA_PRIVATE,
from sapl.compilacao.utils import (DISPOSITIVO_SELECT_RELATED,
DISPOSITIVO_SELECT_RELATED_EDIT,
get_integrations_view_names)
-from sapl.crud.base import RP_DETAIL, RP_LIST, Crud, CrudAux, CrudListView,\
- make_pagination
+from sapl.crud.base import (RP_DETAIL, RP_LIST, Crud, CrudAux, CrudListView,
+ make_pagination)
from sapl.settings import BASE_DIR
-
-TipoNotaCrud = CrudAux.build(TipoNota, 'tipo_nota')
-TipoVideCrud = CrudAux.build(TipoVide, 'tipo_vide')
-TipoPublicacaoCrud = CrudAux.build(TipoPublicacao, 'tipo_publicacao')
-VeiculoPublicacaoCrud = CrudAux.build(VeiculoPublicacao, 'veiculo_publicacao')
+TipoNotaCrud = CrudAux.build(TipoNota, "tipo_nota")
+TipoVideCrud = CrudAux.build(TipoVide, "tipo_vide")
+TipoPublicacaoCrud = CrudAux.build(TipoPublicacao, "tipo_publicacao")
+VeiculoPublicacaoCrud = CrudAux.build(VeiculoPublicacao, "veiculo_publicacao")
class TipoDispositivoCrud(CrudAux):
model = TipoDispositivo
class BaseMixin(CrudAux.BaseMixin):
- list_field_names = ('nome', )
+ list_field_names = ("nome",)
@property
def delete_url(self):
- return ''
+ return ""
@property
def create_url(self):
- return ''
+ return ""
class CreateView(CrudAux.CreateView):
def has_permission(self):
@@ -84,7 +83,7 @@ class TipoDispositivoCrud(CrudAux):
return False
class UpdateView(CrudAux.UpdateView):
- layout_key = 'TipoDispositivoUpdate'
+ layout_key = "TipoDispositivoUpdate"
class ListView(CrudAux.ListView):
paginate_by = 100
@@ -92,21 +91,21 @@ class TipoDispositivoCrud(CrudAux):
def choice_models_in_extenal_views():
integrations_view_names = get_integrations_view_names()
- result = [(None, '-------------'), ]
+ result = [
+ (None, "-------------"),
+ ]
for item in integrations_view_names:
- if hasattr(item, 'model') and hasattr(item, 'model_type_foreignkey'):
+ if hasattr(item, "model") and hasattr(item, "model_type_foreignkey"):
ct = ContentType.objects.filter(
- model=item.model.__name__.lower(),
- app_label=item.model._meta.app_label)
+ model=item.model.__name__.lower(), app_label=item.model._meta.app_label
+ )
if ct.exists():
- result.append((
- ct[0].pk,
- item.model._meta.verbose_name_plural))
+ result.append((ct[0].pk, item.model._meta.verbose_name_plural))
return result
def choice_model_type_foreignkey_in_extenal_views(id_tipo_ta=None):
- yield None, '-------------'
+ yield None, "-------------"
if not id_tipo_ta:
return
@@ -115,44 +114,50 @@ def choice_model_type_foreignkey_in_extenal_views(id_tipo_ta=None):
integrations_view_names = get_integrations_view_names()
for item in integrations_view_names:
- if hasattr(item, 'model_type_foreignkey'):
- if (tipo_ta.content_type.model == item.model.__name__.lower() and
- tipo_ta.content_type.app_label ==
- item.model._meta.app_label):
+ if hasattr(item, "model_type_foreignkey"):
+ if (
+ tipo_ta.content_type.model == item.model.__name__.lower()
+ and tipo_ta.content_type.app_label == item.model._meta.app_label
+ ):
for i in item.model_type_foreignkey.objects.all():
yield i.pk, i
class IntegracaoTaView(TemplateView):
-
def get_redirect_deactivated(self):
messages.error(
self.request,
- _('O modulo de Textos Articulados para %s está desativado.'
- ) % self.model._meta.verbose_name_plural)
- return redirect('/')
+ _("O modulo de Textos Articulados para %s está desativado.")
+ % self.model._meta.verbose_name_plural,
+ )
+ return redirect("/")
def get(self, request, *args, **kwargs):
-
try:
if settings.DEBUG or not TipoDispositivo.objects.exists():
AppConfig.import_pattern()
- if hasattr(self, 'map_funcs'):
+ if hasattr(self, "map_funcs"):
tipo_ta = TipoTextoArticulado.objects.get(
- content_type=ContentType.objects.get_for_model(
- self.model))
+ content_type=ContentType.objects.get_for_model(self.model)
+ )
for key, value in self.map_funcs.items():
setattr(tipo_ta, key, value)
tipo_ta.save()
except Exception as e:
- print("{} {}".format(
- _('Ocorreu erro na importação do arquivo base dos Tipos de Dispositivos, entre outras informações iniciais.'), str(e)))
+ print(
+ "{} {}".format(
+ _(
+ "Ocorreu erro na importação do arquivo base dos Tipos de Dispositivos, entre outras informações iniciais."
+ ),
+ str(e),
+ )
+ )
return self.get_redirect_deactivated()
- assert hasattr(self, 'map_fields'), _(
+ assert hasattr(self, "map_fields"), _(
"""
O mapa dos campos não foi definido. Ele deve seguir a estrutura
de chaves abaixo:
@@ -168,36 +173,27 @@ class IntegracaoTaView(TemplateView):
Caso o model de integração não possua um dos campos,
implemente, ou passe `None` para as chaves que são fixas.
- """)
+ """
+ )
- ta_values = getattr(self, 'ta_values', {})
+ ta_values = getattr(self, "ta_values", {})
- item = get_object_or_404(self.model, pk=kwargs['pk'])
+ item = get_object_or_404(self.model, pk=kwargs["pk"])
related_object_type = ContentType.objects.get_for_model(item)
ta = TextoArticulado.objects.filter(
- object_id=item.pk,
- content_type=related_object_type)
+ object_id=item.pk, content_type=related_object_type
+ )
ta_exists = bool(ta.exists())
self.object = ta = ta.first()
ta_perm_edit = (
- (
- request.user.has_perm(
- 'compilacao.change_dispositivo_edicao_dinamica') and
- ta_values.get(
- 'privacidade',
- STATUS_TA_EDITION
- ) != STATUS_TA_PRIVATE
- ) or (
- request.user.has_perm(
- 'compilacao.change_your_dispositivo_edicao_dinamica') and
- ta_values.get(
- 'privacidade',
- STATUS_TA_EDITION
- ) == STATUS_TA_PRIVATE
- )
+ request.user.has_perm("compilacao.change_dispositivo_edicao_dinamica")
+ and ta_values.get("privacidade", STATUS_TA_EDITION) != STATUS_TA_PRIVATE
+ ) or (
+ request.user.has_perm("compilacao.change_your_dispositivo_edicao_dinamica")
+ and ta_values.get("privacidade", STATUS_TA_EDITION) == STATUS_TA_PRIVATE
)
"""
@@ -214,28 +210,31 @@ class IntegracaoTaView(TemplateView):
"""
if not ta_exists and not ta_perm_edit:
- messages.info(request, _('%s não possui %s.') % (
- item, TextoArticulado._meta.verbose_name))
- return redirect('/message')
+ messages.info(
+ request,
+ _("%s não possui %s.") % (item, TextoArticulado._meta.verbose_name),
+ )
+ return redirect("/message")
if ta_perm_edit:
self.object = ta = TextoArticulado.update_or_create(self, item)
if not ta_exists:
- if ta.editable_only_by_owners and\
- not self.request.user.is_anonymous:
+ if ta.editable_only_by_owners and not self.request.user.is_anonymous:
ta.owners.add(self.request.user)
- if not Dispositivo.objects.filter(ta_id=ta.pk).exists() and\
- ta.can_use_dynamic_editing(self.request.user):
- return redirect(to=reverse_lazy('sapl.compilacao:ta_text_edit',
- kwargs={'ta_id': ta.pk}))
+ if not Dispositivo.objects.filter(
+ ta_id=ta.pk
+ ).exists() and ta.can_use_dynamic_editing(self.request.user):
+ return redirect(
+ to=reverse_lazy("sapl.compilacao:ta_text_edit", kwargs={"ta_id": ta.pk})
+ )
else:
return redirect(
- to='%s?%s' % (
- reverse_lazy('sapl.compilacao:ta_text',
- kwargs={'ta_id': ta.pk}),
- request.META['QUERY_STRING']
+ to="%s?%s"
+ % (
+ reverse_lazy("sapl.compilacao:ta_text", kwargs={"ta_id": ta.pk}),
+ request.META["QUERY_STRING"],
)
)
@@ -256,7 +255,8 @@ class CompMixin(PermissionRequiredMixin):
def ta(self):
try:
ta = TextoArticulado.objects.get(
- pk=self.kwargs.get('ta_id', self.kwargs.get('pk', 0)))
+ pk=self.kwargs.get("ta_id", self.kwargs.get("pk", 0))
+ )
except TextoArticulado.DoesNotExist:
raise Http404()
@@ -265,192 +265,303 @@ class CompMixin(PermissionRequiredMixin):
def get_context_data(self, **kwargs):
context = super(CompMixin, self).get_context_data(**kwargs)
- if hasattr(self, 'model') and not hasattr(self, 'object'):
+ if hasattr(self, "model") and not hasattr(self, "object"):
context.update(
- {'title': self.model._meta.verbose_name_plural
- if isinstance(self, ListView)
- else self.model._meta.verbose_name})
+ {
+ "title": self.model._meta.verbose_name_plural
+ if isinstance(self, ListView)
+ else self.model._meta.verbose_name
+ }
+ )
if isinstance(self, ListView):
- context['NO_ENTRIES_MSG'] = CrudListView.no_entries_msg
+ context["NO_ENTRIES_MSG"] = CrudListView.no_entries_msg
return context
def get_notificacoes(self, object_list=None, type_notificacoes=None):
-
p = []
- def padd(r, type_notificacao, reverse_url=None, test=True, msg='',
- kwargs=None, to_position=None):
-
+ def padd(
+ r,
+ type_notificacao,
+ reverse_url=None,
+ test=True,
+ msg="",
+ kwargs=None,
+ to_position=None,
+ ):
if not test:
return
r.contextual_class = type_notificacao
if not kwargs:
- kwargs = {'ta_id': r.ta_id, 'pk': r.pk}
+ kwargs = {"ta_id": r.ta_id, "pk": r.pk}
if reverse_url:
- p.append((type_notificacao, msg,
- reverse_lazy(reverse_url, kwargs=kwargs),
- to_position))
+ p.append(
+ (
+ type_notificacao,
+ msg,
+ reverse_lazy(reverse_url, kwargs=kwargs),
+ to_position,
+ )
+ )
else:
p.append((type_notificacao, msg, None, to_position))
def success(r):
- type_notificacao = 'success'
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.inconstitucionalidade,
- _('Declarado Inconstitucional.'))
+ type_notificacao = "success"
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.inconstitucionalidade,
+ _("Declarado Inconstitucional."),
+ )
- padd(r, type_notificacao, 'sapl.compilacao:ta_text_edit',
- r.ta_publicado and r.dispositivo_atualizador,
- _('Dispositivo alterado em %s' % r.ta_publicado),
- {'ta_id': r.ta_publicado_id}, r.dispositivo_atualizador_id)
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:ta_text_edit",
+ r.ta_publicado and r.dispositivo_atualizador,
+ _("Dispositivo alterado em %s" % r.ta_publicado),
+ {"ta_id": r.ta_publicado_id},
+ r.dispositivo_atualizador_id,
+ )
def info(r):
- type_notificacao = 'info'
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.publicacao and
- r.dispositivo_vigencia and
- r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia,
- _('Data da publicação associada ao Dispositivo difere da data'
- ' de inicio de vigência do Dispositivo de vigência.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.publicacao and r.publicacao.data != r.inicio_vigencia,
- _('Data da publicação associada ao Dispositivo difere '
- 'da data de inicio de vigência.'))
-
- padd(r, type_notificacao, 'sapl.compilacao:dispositivo_edit',
- r.rotulo != r.rotulo_padrao(local_insert=1),
- _('Rótulo Diferente do Padrão'))
-
- padd(r, type_notificacao, 'sapl.compilacao:dispositivo_edit',
- r.texto_atualizador and r.texto_atualizador != r.texto,
- _('Texto do Dispositivo para o Documento '
- 'está diferente do texto para o Documento Alterador.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.texto_atualizador and r.texto_atualizador == r.texto,
- _('Texto do Dispositivo no Documento Alterador '
- 'está igual ao Texto no Documento Original. '
- 'Não é necessário manter armazenado o texto no Documento '
- 'Alterador.'))
+ type_notificacao = "info"
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.publicacao
+ and r.dispositivo_vigencia
+ and r.publicacao.data != r.dispositivo_vigencia.inicio_vigencia,
+ _(
+ "Data da publicação associada ao Dispositivo difere da data"
+ " de inicio de vigência do Dispositivo de vigência."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.publicacao and r.publicacao.data != r.inicio_vigencia,
+ _(
+ "Data da publicação associada ao Dispositivo difere "
+ "da data de inicio de vigência."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit",
+ r.rotulo != r.rotulo_padrao(local_insert=1),
+ _("Rótulo Diferente do Padrão"),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit",
+ r.texto_atualizador and r.texto_atualizador != r.texto,
+ _(
+ "Texto do Dispositivo para o Documento "
+ "está diferente do texto para o Documento Alterador."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.texto_atualizador and r.texto_atualizador == r.texto,
+ _(
+ "Texto do Dispositivo no Documento Alterador "
+ "está igual ao Texto no Documento Original. "
+ "Não é necessário manter armazenado o texto no Documento "
+ "Alterador."
+ ),
+ )
def warning(r):
- type_notificacao = 'warning'
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.dispositivo_vigencia and r.inicio_vigencia !=
- r.dispositivo_vigencia.inicio_vigencia,
- _('Data de início de Vigência difere da data início de '
- 'Vigência do Dispositivo de Vigência'))
-
- padd(r, type_notificacao, 'sapl.compilacao:ta_text',
- r.inconstitucionalidade and not r.notas.exists(),
- _('Dispositivo está definido como inconstitucional. É '
- 'aconcelhavel inserir uma Nota informando esta condição.'),
- kwargs={'ta_id': r.ta_id},
- to_position=r.pk)
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.inconstitucionalidade and not (
- r.inicio_vigencia == r.fim_vigencia and
- r.fim_vigencia == r.inicio_eficacia and
- r.inicio_eficacia == r.fim_eficacia),
- _('Dispositivo está definido como inconstitucional porém '
- 'existe diferença entre as datas início e fim de '
- 'vigência e eficácia.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.publicacao and
- r.ta_publicado and r.ta_publicado != r.publicacao.ta,
- _('A Publicação associada a este Dispositivo não é '
- 'uma publicação do Texto Articulado Alterador.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- not r.publicacao,
- _('Dispositivo sem registro de publicação.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.texto and r.tipo_dispositivo.dispositivo_de_articulacao,
- _('Dispositivos de Articulação não '
- 'deveriam armazenar texto.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- not r.texto and
- not r.tipo_dispositivo.dispositivo_de_articulacao,
- _('Dispositivo está sem texto.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.texto_atualizador and not r.ta_publicado,
- _('Existe Texto Atualizador, porém este Dispositivo não '
- 'está associado a nenhum Documento Atualizador.'))
+ type_notificacao = "warning"
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.dispositivo_vigencia
+ and r.inicio_vigencia != r.dispositivo_vigencia.inicio_vigencia,
+ _(
+ "Data de início de Vigência difere da data início de "
+ "Vigência do Dispositivo de Vigência"
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:ta_text",
+ r.inconstitucionalidade and not r.notas.exists(),
+ _(
+ "Dispositivo está definido como inconstitucional. É "
+ "aconcelhavel inserir uma Nota informando esta condição."
+ ),
+ kwargs={"ta_id": r.ta_id},
+ to_position=r.pk,
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.inconstitucionalidade
+ and not (
+ r.inicio_vigencia == r.fim_vigencia
+ and r.fim_vigencia == r.inicio_eficacia
+ and r.inicio_eficacia == r.fim_eficacia
+ ),
+ _(
+ "Dispositivo está definido como inconstitucional porém "
+ "existe diferença entre as datas início e fim de "
+ "vigência e eficácia."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.publicacao and r.ta_publicado and r.ta_publicado != r.publicacao.ta,
+ _(
+ "A Publicação associada a este Dispositivo não é "
+ "uma publicação do Texto Articulado Alterador."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ not r.publicacao,
+ _("Dispositivo sem registro de publicação."),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.texto and r.tipo_dispositivo.dispositivo_de_articulacao,
+ _("Dispositivos de Articulação não " "deveriam armazenar texto."),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ not r.texto and not r.tipo_dispositivo.dispositivo_de_articulacao,
+ _("Dispositivo está sem texto."),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.texto_atualizador and not r.ta_publicado,
+ _(
+ "Existe Texto Atualizador, porém este Dispositivo não "
+ "está associado a nenhum Documento Atualizador."
+ ),
+ )
def danger(r):
- type_notificacao = 'danger'
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- not r.dispositivo_vigencia,
- _('Dispositivo sem definição de Dispositivo de Vigência.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_vigencia',
- r.inconstitucionalidade and
- r.inicio_vigencia != r.fim_vigencia,
- _('Dispositivo está definido como inconstitucional porém '
- 'existe período de vigência.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.ta_publicado and not r.dispositivo_atualizador,
- _('Dispositivo está associado a um Texto Articulado '
- 'Atualizador mas, a nenhum Dispositivo Atualizador.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- not r.dispositivo_atualizador and
- r.dispositivo_substituido,
- _('Dispositivo está substituindo outro mas não foi informado '
- 'o Dispositivo Atualizador.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.dispositivo_substituido and
- r.dispositivo_substituido.tipo_dispositivo !=
- r.tipo_dispositivo,
- _('Dispositivo está substituindo um Dispositivo '
- 'de outro tipo.'))
-
- padd(r, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.dispositivo_substituido and
- r.dispositivo_substituido.ta != r.ta,
- _('Dispositivo está substituindo um Dispositivo de outro '
- 'Texto Articulado.'))
-
- padd(r.dispositivo_substituido, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.dispositivo_substituido and
- r.dispositivo_substituido.dispositivo_subsequente != r,
- _('Dispositivo está substituindo um Dispositivo que não '
- 'possui este como seu Dispositivo Subsequente.'))
-
- padd(r.dispositivo_subsequente, type_notificacao,
- 'sapl.compilacao:dispositivo_edit_alteracao',
- r.dispositivo_subsequente and
- r.dispositivo_subsequente.dispositivo_substituido != r,
- _('Dispositivo foi substituído por outro que não '
- 'possui este como seu Dispositivo Substituído.'))
+ type_notificacao = "danger"
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ not r.dispositivo_vigencia,
+ _("Dispositivo sem definição de Dispositivo de Vigência."),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ r.inconstitucionalidade and r.inicio_vigencia != r.fim_vigencia,
+ _(
+ "Dispositivo está definido como inconstitucional porém "
+ "existe período de vigência."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.ta_publicado and not r.dispositivo_atualizador,
+ _(
+ "Dispositivo está associado a um Texto Articulado "
+ "Atualizador mas, a nenhum Dispositivo Atualizador."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ not r.dispositivo_atualizador and r.dispositivo_substituido,
+ _(
+ "Dispositivo está substituindo outro mas não foi informado "
+ "o Dispositivo Atualizador."
+ ),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.dispositivo_substituido
+ and r.dispositivo_substituido.tipo_dispositivo != r.tipo_dispositivo,
+ _("Dispositivo está substituindo um Dispositivo " "de outro tipo."),
+ )
+
+ padd(
+ r,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.dispositivo_substituido and r.dispositivo_substituido.ta != r.ta,
+ _(
+ "Dispositivo está substituindo um Dispositivo de outro "
+ "Texto Articulado."
+ ),
+ )
+
+ padd(
+ r.dispositivo_substituido,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.dispositivo_substituido
+ and r.dispositivo_substituido.dispositivo_subsequente != r,
+ _(
+ "Dispositivo está substituindo um Dispositivo que não "
+ "possui este como seu Dispositivo Subsequente."
+ ),
+ )
+
+ padd(
+ r.dispositivo_subsequente,
+ type_notificacao,
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ r.dispositivo_subsequente
+ and r.dispositivo_subsequente.dispositivo_substituido != r,
+ _(
+ "Dispositivo foi substituído por outro que não "
+ "possui este como seu Dispositivo Substituído."
+ ),
+ )
rr = []
for r in object_list:
@@ -458,24 +569,28 @@ class CompMixin(PermissionRequiredMixin):
r.contextual_class = ""
for f in type_notificacoes:
- if f != 'default':
+ if f != "default":
locals()[f](r)
r.notificacoes = p
- if p or 'default' in type_notificacoes:
+ if p or "default" in type_notificacoes:
rr.append(r)
if r.dispositivos_alterados_set.exists():
rr += self.get_notificacoes(
- r.dispositivos_alterados_set.all(), type_notificacoes)
+ r.dispositivos_alterados_set.all(), type_notificacoes
+ )
return rr
class TipoTextoArticuladoCrud(CrudAux):
model = TipoTextoArticulado
- public = [RP_LIST, RP_DETAIL, ]
+ public = [
+ RP_LIST,
+ RP_DETAIL,
+ ]
class CreateView(CrudAux.CreateView):
form_class = TipoTaForm
@@ -483,9 +598,11 @@ class TipoTextoArticuladoCrud(CrudAux):
def get(self, request, *args, **kwargs):
self.object = None
form = self.get_form()
- form.fields['content_type'] = forms.ChoiceField(
+ form.fields["content_type"] = forms.ChoiceField(
choices=choice_models_in_extenal_views(),
- label=_('Modelo Integrado'), required=False)
+ label=_("Modelo Integrado"),
+ required=False,
+ )
return self.render_to_response(self.get_context_data(form=form))
@@ -495,9 +612,11 @@ class TipoTextoArticuladoCrud(CrudAux):
def get(self, request, *args, **kwargs):
self.object = self.get_object()
form = self.get_form()
- form.fields['content_type'] = forms.ChoiceField(
+ form.fields["content_type"] = forms.ChoiceField(
choices=choice_models_in_extenal_views(),
- label=_('Modelo Integrado'), required=False)
+ label=_("Modelo Integrado"),
+ required=False,
+ )
return self.render_to_response(self.get_context_data(form=form))
@@ -505,7 +624,7 @@ class TaListView(CompMixin, ListView):
model = TextoArticulado
paginate_by = 10
verbose_name = model._meta.verbose_name
- permission_required = 'compilacao.list_textoarticulado'
+ permission_required = "compilacao.list_textoarticulado"
@property
def title(self):
@@ -513,34 +632,35 @@ class TaListView(CompMixin, ListView):
@property
def create_url(self):
- return reverse_lazy('sapl.compilacao:ta_create')
+ return reverse_lazy("sapl.compilacao:ta_create")
def get_context_data(self, **kwargs):
context = super(TaListView, self).get_context_data(**kwargs)
- paginator = context['paginator']
- page_obj = context['page_obj']
- context['page_range'] = make_pagination(
- page_obj.number, paginator.num_pages)
+ paginator = context["paginator"]
+ page_obj = context["page_obj"]
+ context["page_range"] = make_pagination(page_obj.number, paginator.num_pages)
return context
def get_queryset(self):
qs = ListView.get_queryset(self)
- qs = qs.exclude(
- ~Q(owners=self.request.user.id),
- privacidade=STATUS_TA_PRIVATE)
+ qs = qs.exclude(~Q(owners=self.request.user.id), privacidade=STATUS_TA_PRIVATE)
- if 'check' in self.request.GET:
+ if "check" in self.request.GET:
qs = qs.filter(
temp_check_migrations=False,
privacidade=0,
).exclude(dispositivos_set__tipo_dispositivo_id=3)
- if 'check_dvt' in self.request.GET:
- qs = qs.filter(
- ).filter(
- dispositivos_set__isnull=False,
- dispositivos_set__dispositivo_vigencia__isnull=True).distinct()
+ if "check_dvt" in self.request.GET:
+ qs = (
+ qs.filter()
+ .filter(
+ dispositivos_set__isnull=False,
+ dispositivos_set__dispositivo_vigencia__isnull=True,
+ )
+ .distinct()
+ )
return qs
@@ -559,10 +679,11 @@ class TaDetailView(CompMixin, DetailView):
def title(self):
if self.get_object().content_object:
return _(
- 'Metadados para o Texto Articulado de %s\n'
- '%s') % (
+ "Metadados para o Texto Articulado de %s\n" "%s"
+ ) % (
self.get_object().content_object._meta.verbose_name_plural,
- self.get_object().content_object.epigrafe)
+ self.get_object().content_object.epigrafe,
+ )
else:
return self.get_object()
@@ -571,24 +692,23 @@ class TaCreateView(CompMixin, FormMessagesMixin, CreateView):
model = TextoArticulado
form_class = TaForm
template_name = "crud/form.html"
- form_valid_message = _('Registro criado com sucesso!')
- form_invalid_message = _('O registro não foi criado.')
- permission_required = 'compilacao.add_tipotextoarticulado'
+ form_valid_message = _("Registro criado com sucesso!")
+ form_invalid_message = _("O registro não foi criado.")
+ permission_required = "compilacao.add_tipotextoarticulado"
def get_success_url(self):
- return reverse_lazy('sapl.compilacao:ta_detail',
- kwargs={'pk': self.object.id})
+ return reverse_lazy("sapl.compilacao:ta_detail", kwargs={"pk": self.object.id})
@property
def cancel_url(self):
- return reverse_lazy('sapl.compilacao:ta_list')
+ return reverse_lazy("sapl.compilacao:ta_list")
class TaUpdateView(CompMixin, UpdateView):
model = TextoArticulado
form_class = TaForm
template_name = "crud/form.html"
- permission_required = 'compilacao.change_textoarticulado'
+ permission_required = "compilacao.change_textoarticulado"
def get(self, request, *args, **kwargs):
self.object = self.get_object()
@@ -599,19 +719,21 @@ class TaUpdateView(CompMixin, UpdateView):
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
- return reverse_lazy('sapl.compilacao:ta_detail',
- kwargs={'pk': self.kwargs['pk']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_detail", kwargs={"pk": self.kwargs["pk"]}
+ )
@property
def cancel_url(self):
- return reverse_lazy('sapl.compilacao:ta_detail',
- kwargs={'pk': self.kwargs['pk']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_detail", kwargs={"pk": self.kwargs["pk"]}
+ )
class TaDeleteView(CompMixin, DeleteView):
model = TextoArticulado
template_name = "crud/confirm_delete.html"
- permission_required = 'compilacao.delete_textoarticulado'
+ permission_required = "compilacao.delete_textoarticulado"
def post(self, request, *args, **kwargs):
if not request.user.is_superuser:
@@ -620,59 +742,60 @@ class TaDeleteView(CompMixin, DeleteView):
@property
def detail_url(self):
- return reverse_lazy('sapl.compilacao:ta_detail',
- kwargs={'pk': self.kwargs['pk']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_detail", kwargs={"pk": self.kwargs["pk"]}
+ )
def get_success_url(self):
- messages.info(self.request, 'Texto Articulado excluido com sucesso!')
+ messages.info(self.request, "Texto Articulado excluido com sucesso!")
- reverse_url = '%s:%s_detail' % (
+ reverse_url = "%s:%s_detail" % (
self.object.content_object._meta.app_config.name,
- self.object.content_object._meta.model_name)
+ self.object.content_object._meta.model_name,
+ )
- return reverse_lazy(reverse_url,
- kwargs={'pk': self.object.content_object.pk})
+ return reverse_lazy(reverse_url, kwargs={"pk": self.object.content_object.pk})
@property
def title(self):
- return 'Texto Articulado: %s' % self.object
+ return "Texto Articulado: %s" % self.object
class DispositivoSuccessUrlMixin(CompMixin):
-
def get_success_url(self):
return reverse_lazy(
- 'sapl.compilacao:dispositivo', kwargs={
- 'ta_id': self.kwargs[
- 'ta_id'],
- 'dispositivo_id': self.kwargs[
- 'dispositivo_id']})
+ "sapl.compilacao:dispositivo",
+ kwargs={
+ "ta_id": self.kwargs["ta_id"],
+ "dispositivo_id": self.kwargs["dispositivo_id"],
+ },
+ )
class NotaMixin(DispositivoSuccessUrlMixin):
-
def get_modelo_nota(self, request):
- if 'action' in request.GET and request.GET['action'] == 'modelo_nota':
- tn = TipoNota.objects.get(pk=request.GET['id_tipo'])
+ if "action" in request.GET and request.GET["action"] == "modelo_nota":
+ tn = TipoNota.objects.get(pk=request.GET["id_tipo"])
return True, tn.modelo
- return False, ''
+ return False, ""
def get_initial(self):
dispositivo = get_object_or_404(
- Dispositivo, pk=self.kwargs.get('dispositivo_id'))
- initial = {'dispositivo': dispositivo}
+ Dispositivo, pk=self.kwargs.get("dispositivo_id")
+ )
+ initial = {"dispositivo": dispositivo}
- if 'pk' in self.kwargs:
- initial['pk'] = self.kwargs.get('pk')
+ if "pk" in self.kwargs:
+ initial["pk"] = self.kwargs.get("pk")
return initial
class NotasCreateView(NotaMixin, CreateView):
logger = logging.getLogger(__name__)
- template_name = 'compilacao/ajax_form.html'
+ template_name = "compilacao/ajax_form.html"
form_class = NotaForm
- permission_required = 'compilacao.add_nota'
+ permission_required = "compilacao.add_nota"
def get(self, request, *args, **kwargs):
flag_action, modelo_nota = self.get_modelo_nota(request)
@@ -682,21 +805,20 @@ class NotasCreateView(NotaMixin, CreateView):
return super(NotasCreateView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
-
username = request.user.username
self.object = None
try:
- ta_id = kwargs.pop('ta_id')
- dispositivo_id = kwargs.pop('dispositivo_id')
+ ta_id = kwargs.pop("ta_id")
+ dispositivo_id = kwargs.pop("dispositivo_id")
form = NotaForm(request.POST, request.FILES, **kwargs)
- kwargs['ta_id'] = ta_id
- kwargs['dispositivo_id'] = dispositivo_id
+ kwargs["ta_id"] = ta_id
+ kwargs["dispositivo_id"] = dispositivo_id
if form.is_valid():
nt = form.save(commit=False)
nt.owner_id = request.user.pk
nt.save()
- self.kwargs['pk'] = nt.pk
+ self.kwargs["pk"] = nt.pk
return self.form_valid(form)
else:
return self.form_invalid(form)
@@ -709,9 +831,9 @@ class NotasCreateView(NotaMixin, CreateView):
class NotasEditView(NotaMixin, UpdateView):
model = Nota
- template_name = 'compilacao/ajax_form.html'
+ template_name = "compilacao/ajax_form.html"
form_class = NotaForm
- permission_required = 'compilacao.change_nota'
+ permission_required = "compilacao.change_nota"
def get(self, request, *args, **kwargs):
flag_action, modelo_nota = self.get_modelo_nota(request)
@@ -722,33 +844,34 @@ class NotasEditView(NotaMixin, UpdateView):
class NotasDeleteView(NotaMixin, TemplateView):
-
- permission_required = 'compilacao.delete_nota'
+ permission_required = "compilacao.delete_nota"
def get(self, request, *args, **kwargs):
- nt = Nota.objects.get(pk=self.kwargs['pk'])
+ nt = Nota.objects.get(pk=self.kwargs["pk"])
nt.delete()
return HttpResponseRedirect(self.get_success_url())
class VideMixin(DispositivoSuccessUrlMixin):
-
def get_initial(self):
dispositivo_base = get_object_or_404(
- Dispositivo, pk=self.kwargs.get('dispositivo_id'))
- initial = {'dispositivo_base': dispositivo_base, }
+ Dispositivo, pk=self.kwargs.get("dispositivo_id")
+ )
+ initial = {
+ "dispositivo_base": dispositivo_base,
+ }
- if 'pk' in self.kwargs:
- initial['pk'] = self.kwargs.get('pk')
+ if "pk" in self.kwargs:
+ initial["pk"] = self.kwargs.get("pk")
return initial
class VideCreateView(VideMixin, CreateView):
model = Vide
- template_name = 'compilacao/ajax_form.html'
+ template_name = "compilacao/ajax_form.html"
form_class = VideForm
- permission_required = 'compilacao.add_vide'
+ permission_required = "compilacao.add_vide"
def get(self, request, *args, **kwargs):
self.object = None
@@ -758,32 +881,37 @@ class VideCreateView(VideMixin, CreateView):
class VideEditView(VideMixin, UpdateView):
model = Vide
- template_name = 'compilacao/ajax_form.html'
+ template_name = "compilacao/ajax_form.html"
form_class = VideForm
- permission_required = 'compilacao.change_vide'
+ permission_required = "compilacao.change_vide"
class VideDeleteView(VideMixin, TemplateView):
- permission_required = 'compilacao.delete_vide'
+ permission_required = "compilacao.delete_vide"
def get(self, request, *args, **kwargs):
- vd = Vide.objects.get(pk=self.kwargs['pk'])
+ vd = Vide.objects.get(pk=self.kwargs["pk"])
vd.delete()
return HttpResponseRedirect(self.get_success_url())
class PublicacaoMixin(CompMixin):
-
def dispatch(self, request, *args, **kwargs):
ta = self.ta
if not ta.tipo_ta.publicacao_func:
- messages.error(request, _(
- 'A funcionalidade de %s está desativada para %s.') % (
- TipoTextoArticulado._meta.get_field(
- 'publicacao_func').verbose_name,
- ta.tipo_ta.descricao))
- return redirect(reverse('sapl.compilacao:ta_text',
- kwargs={'ta_id': self.kwargs['ta_id']}))
+ messages.error(
+ request,
+ _("A funcionalidade de %s está desativada para %s.")
+ % (
+ TipoTextoArticulado._meta.get_field("publicacao_func").verbose_name,
+ ta.tipo_ta.descricao,
+ ),
+ )
+ return redirect(
+ reverse(
+ "sapl.compilacao:ta_text", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
+ )
return PermissionRequiredMixin.dispatch(self, request, *args, **kwargs)
@@ -795,25 +923,25 @@ class PublicacaoListView(PublicacaoMixin, ListView):
@property
def title(self):
- return _('%s (%s)' % (
- self.model._meta.verbose_name_plural,
- self.ta))
+ return _(
+ "%s (%s)" % (self.model._meta.verbose_name_plural, self.ta)
+ )
@property
def create_url(self):
return reverse_lazy(
- 'sapl.compilacao:ta_pub_create',
- kwargs={'ta_id': self.kwargs['ta_id']})
+ "sapl.compilacao:ta_pub_create", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
def get_queryset(self):
- pubs = Publicacao.objects.filter(ta_id=self.kwargs['ta_id'])
+ pubs = Publicacao.objects.filter(ta_id=self.kwargs["ta_id"])
return pubs
def get_context_data(self, **kwargs):
context = super(PublicacaoListView, self).get_context_data(**kwargs)
- context['title'] = self.title
- context['object'] = self.ta
- context['NO_ENTRIES_MSG'] = CrudListView.no_entries_msg
+ context["title"] = self.title
+ context["object"] = self.ta
+ context["NO_ENTRIES_MSG"] = CrudListView.no_entries_msg
return context
@@ -821,25 +949,24 @@ class PublicacaoCreateView(PublicacaoMixin, FormMessagesMixin, CreateView):
model = Publicacao
form_class = PublicacaoForm
template_name = "crud/form.html"
- form_valid_message = _('Registro criado com sucesso!')
- form_invalid_message = _('O registro não foi criado.')
- permission_required = 'compilacao.add_publicacao'
+ form_valid_message = _("Registro criado com sucesso!")
+ form_invalid_message = _("O registro não foi criado.")
+ permission_required = "compilacao.add_publicacao"
def get_success_url(self):
return reverse_lazy(
- 'sapl.compilacao:ta_pub_detail',
- kwargs={
- 'pk': self.object.id,
- 'ta_id': self.kwargs['ta_id']})
+ "sapl.compilacao:ta_pub_detail",
+ kwargs={"pk": self.object.id, "ta_id": self.kwargs["ta_id"]},
+ )
@property
def cancel_url(self):
return reverse_lazy(
- 'sapl.compilacao:ta_pub_list',
- kwargs={'ta_id': self.kwargs['ta_id']})
+ "sapl.compilacao:ta_pub_list", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
def get_initial(self):
- return {'ta': self.kwargs['ta_id']}
+ return {"ta": self.kwargs["ta_id"]}
class PublicacaoDetailView(PublicacaoMixin, DetailView):
@@ -848,9 +975,9 @@ class PublicacaoDetailView(PublicacaoMixin, DetailView):
@property
def list_url(self):
- return reverse_lazy('sapl.compilacao:ta_pub_list',
- kwargs={
- 'ta_id': self.kwargs['ta_id']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_pub_list", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
@property
def verbose_name_plural(self):
@@ -861,7 +988,7 @@ class PublicacaoUpdateView(PublicacaoMixin, UpdateView):
model = Publicacao
form_class = PublicacaoForm
template_name = "crud/form.html"
- permission_required = 'compilacao.change_publicacao'
+ permission_required = "compilacao.change_publicacao"
def get(self, request, *args, **kwargs):
self.object = self.get_object()
@@ -872,10 +999,10 @@ class PublicacaoUpdateView(PublicacaoMixin, UpdateView):
return self.render_to_response(self.get_context_data(form=form))
def get_success_url(self):
- return reverse_lazy('sapl.compilacao:ta_pub_detail',
- kwargs={
- 'pk': self.object.id,
- 'ta_id': self.kwargs['ta_id']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_pub_detail",
+ kwargs={"pk": self.object.id, "ta_id": self.kwargs["ta_id"]},
+ )
@property
def cancel_url(self):
@@ -885,22 +1012,23 @@ class PublicacaoUpdateView(PublicacaoMixin, UpdateView):
class PublicacaoDeleteView(PublicacaoMixin, DeleteView):
model = Publicacao
template_name = "crud/confirm_delete.html"
- permission_required = 'compilacao.delete_publicacao'
+ permission_required = "compilacao.delete_publicacao"
@property
def detail_url(self):
- return reverse_lazy('sapl.compilacao:ta_pub_detail',
- kwargs={
- 'pk': self.object.id,
- 'ta_id': self.kwargs['ta_id']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_pub_detail",
+ kwargs={"pk": self.object.id, "ta_id": self.kwargs["ta_id"]},
+ )
def get_success_url(self):
- return reverse_lazy('sapl.compilacao:ta_pub_list',
- kwargs={'ta_id': self.kwargs['ta_id']})
+ return reverse_lazy(
+ "sapl.compilacao:ta_pub_list", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
class TextView(CompMixin, ListView):
- template_name = 'compilacao/text_list.html'
+ template_name = "compilacao/text_list.html"
flag_alteradora = -1
@@ -915,69 +1043,72 @@ class TextView(CompMixin, ListView):
@property
def title(self):
- return 'Texto Articulado: %s' % self.object
+ return "Texto Articulado: %s" % self.object
def has_permission(self):
self.object = self.ta
return self.object.has_view_permission(self.request)
def get(self, request, *args, **kwargs):
- if 'print' in request.GET:
- self.template_name = 'compilacao/text_list__print_version.html'
- if 'embedded' in request.GET:
- self.template_name = 'compilacao/text_list__embedded.html'
+ if "print" in request.GET:
+ self.template_name = "compilacao/text_list__print_version.html"
+ if "embedded" in request.GET:
+ self.template_name = "compilacao/text_list__embedded.html"
return ListView.get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super(TextView, self).get_context_data(**kwargs)
- context['object'] = TextoArticulado.objects.get(
- pk=self.kwargs['ta_id'])
+ context["object"] = TextoArticulado.objects.get(pk=self.kwargs["ta_id"])
cita = Vide.objects.filter(
- Q(dispositivo_base__ta_id=self.kwargs['ta_id'])).\
- select_related(
- 'dispositivo_ref',
- 'dispositivo_ref__ta',
- 'dispositivo_ref__dispositivo_pai',
- 'dispositivo_ref__dispositivo_pai__ta', 'tipo')
-
- context['cita'] = {}
+ Q(dispositivo_base__ta_id=self.kwargs["ta_id"])
+ ).select_related(
+ "dispositivo_ref",
+ "dispositivo_ref__ta",
+ "dispositivo_ref__dispositivo_pai",
+ "dispositivo_ref__dispositivo_pai__ta",
+ "tipo",
+ )
+
+ context["cita"] = {}
for c in cita:
- if c.dispositivo_base_id not in context['cita']:
- context['cita'][c.dispositivo_base_id] = []
- context['cita'][c.dispositivo_base_id].append(c)
+ if c.dispositivo_base_id not in context["cita"]:
+ context["cita"][c.dispositivo_base_id] = []
+ context["cita"][c.dispositivo_base_id].append(c)
citado = Vide.objects.filter(
- Q(dispositivo_ref__ta_id=self.kwargs['ta_id'])).\
- select_related(
- 'dispositivo_base',
- 'dispositivo_base__ta',
- 'dispositivo_base__dispositivo_pai',
- 'dispositivo_base__dispositivo_pai__ta', 'tipo')
-
- context['citado'] = {}
+ Q(dispositivo_ref__ta_id=self.kwargs["ta_id"])
+ ).select_related(
+ "dispositivo_base",
+ "dispositivo_base__ta",
+ "dispositivo_base__dispositivo_pai",
+ "dispositivo_base__dispositivo_pai__ta",
+ "tipo",
+ )
+
+ context["citado"] = {}
for c in citado:
- if c.dispositivo_ref_id not in context['citado']:
- context['citado'][c.dispositivo_ref_id] = []
- context['citado'][c.dispositivo_ref_id].append(c)
+ if c.dispositivo_ref_id not in context["citado"]:
+ context["citado"][c.dispositivo_ref_id] = []
+ context["citado"][c.dispositivo_ref_id].append(c)
notas = Nota.objects.filter(
- dispositivo__ta_id=self.kwargs['ta_id']).select_related(
- 'owner', 'tipo')
+ dispositivo__ta_id=self.kwargs["ta_id"]
+ ).select_related("owner", "tipo")
- context['notas'] = {}
+ context["notas"] = {}
for n in notas:
- if n.dispositivo_id not in context['notas']:
- context['notas'][n.dispositivo_id] = []
- context['notas'][n.dispositivo_id].append(n)
+ if n.dispositivo_id not in context["notas"]:
+ context["notas"][n.dispositivo_id] = []
+ context["notas"][n.dispositivo_id].append(n)
tas_pub = [d.ta_publicado for d in self.object_list if d.ta_publicado]
tas_pub = set(tas_pub)
ta_pub_list = {}
for ta in tas_pub:
ta_pub_list[ta.pk] = str(ta)
- context['ta_pub_list'] = ta_pub_list
+ context["ta_pub_list"] = ta_pub_list
# context['vigencias'] = self.get_vigencias()
@@ -991,46 +1122,44 @@ class TextView(CompMixin, ListView):
self.inicio_vigencia = None
self.fim_vigencia = None
self.ta_vigencia = None
- params = {
- 'ordem__gt': 0,
- 'ta_id': self.kwargs['ta_id']
- }
- if 'sign' in self.kwargs:
+ params = {"ordem__gt": 0, "ta_id": self.kwargs["ta_id"]}
+ if "sign" in self.kwargs:
signer = Signer()
try:
- string = signer.unsign(self.kwargs['sign']).split(',')
+ string = signer.unsign(self.kwargs["sign"]).split(",")
self.ta_vigencia = int(string[0])
self.inicio_vigencia = parse_date(string[1])
self.fim_vigencia = parse_date(string[2])
except:
- return Dispositivo.objects.filter(
- **params
- ).select_related(*DISPOSITIVO_SELECT_RELATED)
+ return Dispositivo.objects.filter(**params).select_related(
+ *DISPOSITIVO_SELECT_RELATED
+ )
if self.fim_vigencia:
- params['inicio_vigencia__lte'] = self.fim_vigencia
- return Dispositivo.objects.filter(
- **params
- ).select_related(*DISPOSITIVO_SELECT_RELATED)
+ params["inicio_vigencia__lte"] = self.fim_vigencia
+ return Dispositivo.objects.filter(**params).select_related(
+ *DISPOSITIVO_SELECT_RELATED
+ )
else:
- r = Dispositivo.objects.filter(
- **params
- ).select_related(*DISPOSITIVO_SELECT_RELATED)
+ r = Dispositivo.objects.filter(**params).select_related(
+ *DISPOSITIVO_SELECT_RELATED
+ )
return r
def get_vigencias(self):
- itens = Dispositivo.objects.filter(
- ta_id=self.kwargs['ta_id']
- ).order_by(
- 'dispositivo_vigencia__inicio_vigencia', 'ta_publicado__id', 'ordem'
- ).distinct(
- 'dispositivo_vigencia__inicio_vigencia', 'ta_publicado__id'
- ).select_related(
- 'ta_publicado',
- 'ta',
- 'ta_publicado__tipo_ta',
- 'ta__tipo_ta',
+ itens = (
+ Dispositivo.objects.filter(ta_id=self.kwargs["ta_id"])
+ .order_by(
+ "dispositivo_vigencia__inicio_vigencia", "ta_publicado__id", "ordem"
+ )
+ .distinct("dispositivo_vigencia__inicio_vigencia", "ta_publicado__id")
+ .select_related(
+ "ta_publicado",
+ "ta",
+ "ta_publicado__tipo_ta",
+ "ta__tipo_ta",
+ )
)
ajuste_datas_vigencia = []
@@ -1041,21 +1170,21 @@ class TextView(CompMixin, ListView):
lenLista = len(ajuste_datas_vigencia)
for i in range(lenLista):
if i + 1 < lenLista:
- if ajuste_datas_vigencia[
- i].inicio_vigencia == ajuste_datas_vigencia[
- i + 1].inicio_vigencia:
-
+ if (
+ ajuste_datas_vigencia[i].inicio_vigencia
+ == ajuste_datas_vigencia[i + 1].inicio_vigencia
+ ):
if i + 2 < lenLista:
- ajuste_datas_vigencia[
- i].fim_vigencia = ajuste_datas_vigencia[
- i + 2].inicio_vigencia - timedelta(days=1)
+ ajuste_datas_vigencia[i].fim_vigencia = ajuste_datas_vigencia[
+ i + 2
+ ].inicio_vigencia - timedelta(days=1)
else:
ajuste_datas_vigencia[i].fim_vigencia = None
else:
- ajuste_datas_vigencia[
- i].fim_vigencia = ajuste_datas_vigencia[
- i + 1].inicio_vigencia - timedelta(days=1)
+ ajuste_datas_vigencia[i].fim_vigencia = ajuste_datas_vigencia[
+ i + 1
+ ].inicio_vigencia - timedelta(days=1)
else:
ajuste_datas_vigencia[i].fim_vigencia = None
@@ -1066,38 +1195,48 @@ class TextView(CompMixin, ListView):
for item in ajuste_datas_vigencia:
idx += 1
if idx == 0:
- self.itens_de_vigencia[0] = [item, ]
+ self.itens_de_vigencia[0] = [
+ item,
+ ]
continue
if idx + 1 < length:
- ano = item.ta_publicado.ano if item.ta_publicado else\
- item.ta.ano
+ ano = item.ta_publicado.ano if item.ta_publicado else item.ta.ano
if ano in self.itens_de_vigencia:
self.itens_de_vigencia[ano].append(item)
else:
- self.itens_de_vigencia[ano] = [item, ]
+ self.itens_de_vigencia[ano] = [
+ item,
+ ]
else:
- self.itens_de_vigencia[9999] = [item, ]
+ self.itens_de_vigencia[9999] = [
+ item,
+ ]
if len(self.itens_de_vigencia.keys()) <= 1:
return {}
self.itens_de_vigencia = OrderedDict(
- sorted(self.itens_de_vigencia.items(), key=lambda t: t[0]))
+ sorted(self.itens_de_vigencia.items(), key=lambda t: t[0])
+ )
return self.itens_de_vigencia
def is_ta_alterador(self):
if self.flag_alteradora == -1:
- self.flag_alteradora = Dispositivo.objects.select_related(
- 'dispositivos_alterados_pelo_texto_articulado_set'
- ).filter(ta_id=self.kwargs['ta_id']).count()
+ self.flag_alteradora = (
+ Dispositivo.objects.select_related(
+ "dispositivos_alterados_pelo_texto_articulado_set"
+ )
+ .filter(ta_id=self.kwargs["ta_id"])
+ .count()
+ )
return self.flag_alteradora > 0
class DispositivoView(TextView):
# template_name = 'compilacao/index.html'
- template_name = 'compilacao/text_list_bloco.html'
+ template_name = "compilacao/text_list_bloco.html"
def get_queryset(self):
self.flag_alteradora = -1
@@ -1105,7 +1244,7 @@ class DispositivoView(TextView):
self.flag_nivel_old = -1
try:
- bloco = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
+ bloco = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
except Dispositivo.DoesNotExist:
return []
@@ -1113,49 +1252,57 @@ class DispositivoView(TextView):
self.flag_nivel_ini = bloco.nivel
proximo_bloco = Dispositivo.objects.filter(
- ordem__gt=bloco.ordem,
- nivel__lte=bloco.nivel,
- ta_id=self.kwargs['ta_id'])[:1]
+ ordem__gt=bloco.ordem, nivel__lte=bloco.nivel, ta_id=self.kwargs["ta_id"]
+ )[:1]
if proximo_bloco.count() == 0:
itens = Dispositivo.objects.filter(
- ordem__gte=bloco.ordem,
- ta_id=self.kwargs['ta_id']
+ ordem__gte=bloco.ordem, ta_id=self.kwargs["ta_id"]
).select_related(*DISPOSITIVO_SELECT_RELATED)
else:
itens = Dispositivo.objects.filter(
ordem__gte=bloco.ordem,
ordem__lt=proximo_bloco[0].ordem,
- ta_id=self.kwargs['ta_id']
+ ta_id=self.kwargs["ta_id"],
).select_related(*DISPOSITIVO_SELECT_RELATED)
return itens
class TextEditView(CompMixin, TemplateView):
- template_name = 'compilacao/text_edit.html'
+ template_name = "compilacao/text_edit.html"
def has_permission(self):
self.object = self.ta
return self.object.has_edit_permission(self.request)
def importar_texto_materia(self, request, *args, **kwargs):
- rd = redirect(to=reverse_lazy(
- 'sapl.compilacao:ta_text_edit', kwargs={
- 'ta_id': self.object.id}))
+ rd = redirect(
+ to=reverse_lazy(
+ "sapl.compilacao:ta_text_edit", kwargs={"ta_id": self.object.id}
+ )
+ )
if self.object.dispositivos_set.count() > 1:
messages.error(
request,
- _('Este Texto Articulado possui conteúdo, '
- 'para fazer a importação você deve deixar '
- 'apenas uma única Articulação inicial.'))
+ _(
+ "Este Texto Articulado possui conteúdo, "
+ "para fazer a importação você deve deixar "
+ "apenas uma única Articulação inicial."
+ ),
+ )
return rd
materia = self.materia_da_norma_deste_texto_articulado()
if not materia:
messages.error(
request,
- _('A Norma [{}] não está vinculada a nenhuma matéria.'.format(self.object.content_object)))
+ _(
+ "A Norma [{}] não está vinculada a nenhuma matéria.".format(
+ self.object.content_object
+ )
+ ),
+ )
return rd
self.object.dispositivos_set.all().delete()
@@ -1164,82 +1311,96 @@ class TextEditView(CompMixin, TemplateView):
try:
ta_materia.clone_for(self.object.content_object)
- #TextoArticulado.clone(ta_materia, self.object)
+ # TextoArticulado.clone(ta_materia, self.object)
except Exception as e:
messages.error(
- request,
- _('Ocorreu erro na importação e o procedimento foi cancelado!'))
+ request, _("Ocorreu erro na importação e o procedimento foi cancelado!")
+ )
return rd
def get(self, request, *args, **kwargs):
-
- if 'importar_texto_materia' in request.GET:
+ if "importar_texto_materia" in request.GET:
return self.importar_texto_materia(request, *args, **kwargs)
if self.object.editing_locked:
- if 'unlock' not in request.GET:
+ if "unlock" not in request.GET:
messages.error(
- request, _(
- 'A edição deste Texto Articulado está bloqueada.'))
- return redirect(to=reverse_lazy(
- 'sapl.compilacao:ta_text', kwargs={
- 'ta_id': self.object.id}))
+ request, _("A edição deste Texto Articulado está bloqueada.")
+ )
+ return redirect(
+ to=reverse_lazy(
+ "sapl.compilacao:ta_text", kwargs={"ta_id": self.object.id}
+ )
+ )
else:
# TODO - implementar logging de ação de usuário
self.object.editing_locked = False
self.object.privacidade = STATUS_TA_EDITION
self.object.save()
- messages.success(request, _(
- 'Texto Articulado desbloqueado com sucesso.'))
+ messages.success(
+ request, _("Texto Articulado desbloqueado com sucesso.")
+ )
if self.object.content_object:
self.object.content_object.save()
else:
- if 'lock' in request.GET or 'check' in request.GET:
-
+ if "lock" in request.GET or "check" in request.GET:
# TODO - implementar logging de ação de usuário
notificacoes = self.get_notificacoes(
object_list=self.object.dispositivos_set.all(),
- type_notificacoes=['danger', ])
+ type_notificacoes=[
+ "danger",
+ ],
+ )
if notificacoes:
messages.error(
request,
- _('Existem erros a serem corrigidos que impedem a '
- 'publicação deste Texto Articulado. '
- 'Corrija os erros apontados nas notificações.'))
- self.request.session[
- 'type_notificacoes'] = ['danger', ]
- return redirect(to=reverse_lazy(
- 'sapl.compilacao:ta_text_notificacoes', kwargs={
- 'ta_id': self.object.id}))
-
- if 'lock' in request.GET:
+ _(
+ "Existem erros a serem corrigidos que impedem a "
+ "publicação deste Texto Articulado. "
+ "Corrija os erros apontados nas notificações."
+ ),
+ )
+ self.request.session["type_notificacoes"] = [
+ "danger",
+ ]
+ return redirect(
+ to=reverse_lazy(
+ "sapl.compilacao:ta_text_notificacoes",
+ kwargs={"ta_id": self.object.id},
+ )
+ )
+
+ if "lock" in request.GET:
self.object.editing_locked = True
self.object.privacidade = STATUS_TA_PUBLIC
self.object.save()
- messages.success(request, _(
- 'Texto Articulado publicado com sucesso.'))
+ messages.success(
+ request, _("Texto Articulado publicado com sucesso.")
+ )
else:
self.object.temp_check_migrations = True
self.object.save()
- messages.success(request, _(
- 'Texto Articulado Checado...'))
+ messages.success(request, _("Texto Articulado Checado..."))
if self.object.content_object:
self.object.content_object.save()
- return redirect(to=reverse_lazy(
- 'sapl.compilacao:ta_text', kwargs={
- 'ta_id': self.object.id}))
+ return redirect(
+ to=reverse_lazy(
+ "sapl.compilacao:ta_text", kwargs={"ta_id": self.object.id}
+ )
+ )
return TemplateView.get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):
- dispositivo_id = int(self.kwargs['dispositivo_id']) \
- if 'dispositivo_id' in self.kwargs else 0
+ dispositivo_id = (
+ int(self.kwargs["dispositivo_id"]) if "dispositivo_id" in self.kwargs else 0
+ )
if dispositivo_id:
self.object = Dispositivo.objects.get(pk=dispositivo_id)
@@ -1247,14 +1408,14 @@ class TextEditView(CompMixin, TemplateView):
context = super(TemplateView, self).get_context_data(**kwargs)
if not dispositivo_id:
- ta = TextoArticulado.objects.get(pk=self.kwargs['ta_id'])
+ ta = TextoArticulado.objects.get(pk=self.kwargs["ta_id"])
self.object = ta
- context['object'] = self.object
- context['dispositivos_list'] = self.dispositivos_list()
+ context["object"] = self.object
+ context["dispositivos_list"] = self.dispositivos_list()
- if 'action' in self.request.GET:
- context['action'] = self.request.GET['action']
+ if "action" in self.request.GET:
+ context["action"] = self.request.GET["action"]
return context
@@ -1263,10 +1424,10 @@ class TextEditView(CompMixin, TemplateView):
tds = {td.pk: td for td in TipoDispositivo.objects.all()}
- dispositivo_id = int(self.kwargs['dispositivo_id']) \
- if 'dispositivo_id' in self.kwargs else 0
- ta_id = int(self.kwargs['ta_id']) \
- if 'ta_id' in self.kwargs else 0
+ dispositivo_id = (
+ int(self.kwargs["dispositivo_id"]) if "dispositivo_id" in self.kwargs else 0
+ )
+ ta_id = int(self.kwargs["ta_id"]) if "ta_id" in self.kwargs else 0
q = Q(ta_id=ta_id)
@@ -1275,43 +1436,50 @@ class TextEditView(CompMixin, TemplateView):
if dispositivo_id:
bloco = Dispositivo.objects.get(pk=dispositivo_id)
- if (tds[bloco.tipo_dispositivo_id].dispositivo_de_alteracao and
- not tds[bloco.tipo_dispositivo_id
- ].dispositivo_de_articulacao) or (
- bloco.ta_id != ta_id and bloco.ta_publicado_id == ta_id):
- dispositivos = [bloco, ]
+ if (
+ tds[bloco.tipo_dispositivo_id].dispositivo_de_alteracao
+ and not tds[bloco.tipo_dispositivo_id].dispositivo_de_articulacao
+ ) or (bloco.ta_id != ta_id and bloco.ta_publicado_id == ta_id):
+ dispositivos = [
+ bloco,
+ ]
else:
proximo_bloco = Dispositivo.objects.filter(
- ordem__gt=bloco.ordem,
- nivel__lte=bloco.nivel,
- ta_id=ta_id)[:1]
+ ordem__gt=bloco.ordem, nivel__lte=bloco.nivel, ta_id=ta_id
+ )[:1]
if not proximo_bloco.exists():
q = q & Q(ordem__gte=bloco.ordem)
else:
- q = q & Q(ordem__gte=bloco.ordem) & \
- Q(ordem__lt=proximo_bloco[0].ordem)
+ q = (
+ q
+ & Q(ordem__gte=bloco.ordem)
+ & Q(ordem__lt=proximo_bloco[0].ordem)
+ )
dispositivos_de_alteracao = Dispositivo.objects.filter(
ta_id=ta_id,
tipo_dispositivo__dispositivo_de_alteracao=True,
- tipo_dispositivo__dispositivo_de_articulacao=False
+ tipo_dispositivo__dispositivo_de_articulacao=False,
).select_related(*DISPOSITIVO_SELECT_RELATED_EDIT)
if not dispositivos:
- dispositivos = Dispositivo.objects.filter(
- q).select_related(*DISPOSITIVO_SELECT_RELATED_EDIT)
+ dispositivos = Dispositivo.objects.filter(q).select_related(
+ *DISPOSITIVO_SELECT_RELATED_EDIT
+ )
- dispositivos_alterados = Dispositivo.objects.filter(
- ta_publicado_id=ta_id)
+ dispositivos_alterados = Dispositivo.objects.filter(ta_publicado_id=ta_id)
dispositivos_alteradores = Dispositivo.objects.filter(
- dispositivos_alterados_set__ta_id=ta_id)
+ dispositivos_alterados_set__ta_id=ta_id
+ )
- dpts = list(dispositivos) + \
- list(dispositivos_de_alteracao) + \
- list(dispositivos_alterados) + \
- list(dispositivos_alteradores)
+ dpts = (
+ list(dispositivos)
+ + list(dispositivos_de_alteracao)
+ + list(dispositivos_alterados)
+ + list(dispositivos_alteradores)
+ )
tas_pub = [d.ta_publicado for d in dispositivos if d.ta_publicado]
tas_pub = set(tas_pub)
@@ -1319,66 +1487,74 @@ class TextEditView(CompMixin, TemplateView):
for ta in tas_pub:
lista_ta_publicado[ta.pk] = str(ta)
- dpts = {d.pk: {
- 'dpt': d,
- 'filhos': [],
- 'alts': [],
- 'pai': None,
- 'st': None, # dispositivo substituido
- 'sq': None, # dispositivo subsequente
- 'da': None, # dispositivo atualizador
- 'td': tds[d.tipo_dispositivo_id], # tipo do dispositivo
- 'na': self.nota_alteracao(d, lista_ta_publicado)\
- if d.ta_id == ta_id else None
- } for d in dpts}
+ dpts = {
+ d.pk: {
+ "dpt": d,
+ "filhos": [],
+ "alts": [],
+ "pai": None,
+ "st": None, # dispositivo substituido
+ "sq": None, # dispositivo subsequente
+ "da": None, # dispositivo atualizador
+ "td": tds[d.tipo_dispositivo_id], # tipo do dispositivo
+ "na": self.nota_alteracao(d, lista_ta_publicado)
+ if d.ta_id == ta_id
+ else None,
+ }
+ for d in dpts
+ }
apagar = []
for d in dispositivos:
try:
if d.dispositivo_substituido_id:
- dpts[d.pk]['st'] = dpts[d.dispositivo_substituido_id]
+ dpts[d.pk]["st"] = dpts[d.dispositivo_substituido_id]
except:
pass
try:
if d.dispositivo_subsequente_id:
- dpts[d.pk]['sq'] = dpts[d.dispositivo_subsequente_id]
+ dpts[d.pk]["sq"] = dpts[d.dispositivo_subsequente_id]
except:
pass
try:
if d.dispositivo_atualizador_id:
- dpts[d.pk]['da'] = dpts[d.dispositivo_atualizador_id]
+ dpts[d.pk]["da"] = dpts[d.dispositivo_atualizador_id]
except:
pass
try:
if d.dispositivo_pai_id:
- """ Pode não ser possível vincular a estrutura do pai
+ """Pode não ser possível vincular a estrutura do pai
devido a busca de bloco não envolver o pai do bloco,
por isso os try's except's"""
- dpts[d.pk]['pai'] = dpts[d.dispositivo_pai_id]
+ dpts[d.pk]["pai"] = dpts[d.dispositivo_pai_id]
- if tds[d.tipo_dispositivo_id].\
- dispositivo_de_alteracao and not\
- tds[d.tipo_dispositivo_id].\
- dispositivo_de_articulacao:
+ if (
+ tds[d.tipo_dispositivo_id].dispositivo_de_alteracao
+ and not tds[d.tipo_dispositivo_id].dispositivo_de_articulacao
+ ):
apagar.append(d.pk)
else:
- dpts[d.dispositivo_pai_id]['filhos'].append(dpts[d.pk])
+ dpts[d.dispositivo_pai_id]["filhos"].append(dpts[d.pk])
apagar.append(d.pk)
except:
pass
try:
- if tds[d.tipo_dispositivo_id].dispositivo_de_alteracao and\
- tds[d.tipo_dispositivo_id].dispositivo_de_articulacao:
-
- alts = Dispositivo.objects.values_list(
- 'pk', flat=True).order_by(
- 'ordem_bloco_atualizador').filter(
- Q(dispositivo_pai_id=d.pk) |
- Q(dispositivo_atualizador_id=d.pk))
+ if (
+ tds[d.tipo_dispositivo_id].dispositivo_de_alteracao
+ and tds[d.tipo_dispositivo_id].dispositivo_de_articulacao
+ ):
+ alts = (
+ Dispositivo.objects.values_list("pk", flat=True)
+ .order_by("ordem_bloco_atualizador")
+ .filter(
+ Q(dispositivo_pai_id=d.pk)
+ | Q(dispositivo_atualizador_id=d.pk)
+ )
+ )
for dAlt in alts:
- dpts[d.pk]['alts'].append(dpts[dAlt])
- dpts[dAlt]['da'] = dpts[d.pk]
+ dpts[d.pk]["alts"].append(dpts[dAlt])
+ dpts[dAlt]["da"] = dpts[d.pk]
except:
pass
@@ -1398,45 +1574,52 @@ class TextEditView(CompMixin, TemplateView):
if d.auto_inserido:
d = d.dispositivo_pai
- ta_publicado = lista_ta_publicado[dispositivo.ta_publicado_id] if\
- lista_ta_publicado else dispositivo.ta_publicado
+ ta_publicado = (
+ lista_ta_publicado[dispositivo.ta_publicado_id]
+ if lista_ta_publicado
+ else dispositivo.ta_publicado
+ )
if dispositivo.dispositivo_de_revogacao:
- return _('Revogado pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Revogado pelo %s - %s.") % (d, ta_publicado)
elif not dispositivo.dispositivo_substituido_id:
- return _('Inclusão feita pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Inclusão feita pelo %s - %s.") % (d, ta_publicado)
else:
- return _('Alteração feita pelo %s - %s.') % (
- d, ta_publicado)
+ return _("Alteração feita pelo %s - %s.") % (d, ta_publicado)
- return ''
+ return ""
def materia_da_norma_deste_texto_articulado(self):
- NormaJuridica = apps.get_model(
- 'norma', 'NormaJuridica')
+ NormaJuridica = apps.get_model("norma", "NormaJuridica")
ta = self.ta
- if isinstance(ta.content_object, NormaJuridica) and\
- ta.content_object.materia:
+ if isinstance(ta.content_object, NormaJuridica) and ta.content_object.materia:
return ta.content_object.materia
return None
def runBase(self):
- result = Dispositivo.objects.filter(ta_id=self.kwargs['ta_id'])
+ result = Dispositivo.objects.filter(ta_id=self.kwargs["ta_id"])
if not result.exists():
# FIXME a inserção básica deve ser refatorada para não depender
# das classes css
ta = self.object
- td = TipoDispositivo.objects.filter(class_css='articulacao')[0]
+ td = TipoDispositivo.objects.filter(class_css="articulacao")[0]
a = Dispositivo()
a.nivel = 0
a.ordem = Dispositivo.INTERVALO_ORDEM
a.ordem_bloco_atualizador = 0
- a.set_numero_completo([1, 0, 0, 0, 0, 0, ])
+ a.set_numero_completo(
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
a.ta = ta
a.tipo_dispositivo = td
a.inicio_vigencia = ta.data
@@ -1445,12 +1628,21 @@ class TextEditView(CompMixin, TemplateView):
return
- td = TipoDispositivo.objects.filter(class_css='ementa')[0]
+ td = TipoDispositivo.objects.filter(class_css="ementa")[0]
e = Dispositivo()
e.nivel = 1
e.ordem = a.ordem + Dispositivo.INTERVALO_ORDEM
e.ordem_bloco_atualizador = 0
- e.set_numero_completo([1, 0, 0, 0, 0, 0, ])
+ e.set_numero_completo(
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
e.ta = ta
e.tipo_dispositivo = td
e.inicio_vigencia = ta.data
@@ -1463,27 +1655,37 @@ class TextEditView(CompMixin, TemplateView):
a.nivel = 0
a.ordem = e.ordem + Dispositivo.INTERVALO_ORDEM
a.ordem_bloco_atualizador = 0
- a.set_numero_completo([2, 0, 0, 0, 0, 0, ])
+ a.set_numero_completo(
+ [
+ 2,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
a.save()
class ActionsCommonsMixin:
-
def set_message(self, data, _type, message, time=None, modal=False):
- data['message'] = {
- 'type': _type,
- 'value': str(message)}
+ data["message"] = {"type": _type, "value": str(message)}
if time:
- data['message']['time'] = time
- data['message']['modal'] = modal
+ data["message"]["time"] = time
+ data["message"]["modal"] = modal
return
def get_json_for_refresh(self, dp, dpauto=None):
-
if dp.tipo_dispositivo.contagem_continua:
pais = []
if dp.dispositivo_pai is None:
- data = {'pk': dp.pk, 'pai': [-1, ]}
+ data = {
+ "pk": dp.pk,
+ "pai": [
+ -1,
+ ],
+ }
else:
pkfilho = dp.pk
dp = dp.dispositivo_pai
@@ -1495,12 +1697,12 @@ class ActionsCommonsMixin:
ta_id=dp.ta_id,
ordem__gte=dp.ordem,
ordem__lt=proxima_articulacao.ordem,
- nivel__lte=dp.nivel)
+ nivel__lte=dp.nivel,
+ )
else:
parents = Dispositivo.objects.filter(
- ta_id=dp.ta_id,
- ordem__gte=dp.ordem,
- nivel__lte=dp.nivel)
+ ta_id=dp.ta_id, ordem__gte=dp.ordem, nivel__lte=dp.nivel
+ )
nivel = sys.maxsize
for p in parents:
@@ -1508,38 +1710,39 @@ class ActionsCommonsMixin:
continue
pais.append(p.pk)
nivel = p.nivel
- data = {
- 'pk': pkfilho if not dpauto else dpauto.pk, 'pai': pais}
+ data = {"pk": pkfilho if not dpauto else dpauto.pk, "pai": pais}
else:
- data = {'pk': dp.pk if not dpauto else dpauto.pk, 'pai': [
- dp.dispositivo_pai.pk, ]}
+ data = {
+ "pk": dp.pk if not dpauto else dpauto.pk,
+ "pai": [
+ dp.dispositivo_pai.pk,
+ ],
+ }
return data
class ActionDragAndMoveDispositivoAlteradoMixin(ActionsCommonsMixin):
-
def json_drag_move_dpt_alterado(self, context):
-
- bloco = Dispositivo.objects.get(pk=self.request.GET['bloco_pk'])
- dpt = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
+ bloco = Dispositivo.objects.get(pk=self.request.GET["bloco_pk"])
+ dpt = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
if dpt.tipo_dispositivo.dispositivo_de_alteracao:
dpt.dispositivo_pai = bloco
else:
dpt.dispositivo_atualizador = bloco
- filhos = Dispositivo.objects.order_by(
- 'ordem_bloco_atualizador').filter(
- Q(dispositivo_pai_id=bloco.pk) |
- Q(dispositivo_atualizador_id=bloco.pk))
+ filhos = Dispositivo.objects.order_by("ordem_bloco_atualizador").filter(
+ Q(dispositivo_pai_id=bloco.pk) | Q(dispositivo_atualizador_id=bloco.pk)
+ )
if not filhos.exists():
dpt.ordem_bloco_atualizador = Dispositivo.INTERVALO_ORDEM
else:
- index = int(self.request.GET['index'])
- fpks = filhos.values_list(
- 'pk', flat=True).order_by('ordem_bloco_atualizador')
+ index = int(self.request.GET["index"])
+ fpks = filhos.values_list("pk", flat=True).order_by(
+ "ordem_bloco_atualizador"
+ )
index_dpt = 0
try:
@@ -1547,17 +1750,15 @@ class ActionDragAndMoveDispositivoAlteradoMixin(ActionsCommonsMixin):
except:
pass
- filho_index = filhos[
- index if index_dpt >= index
- else index + 1] if (
- index if index_dpt >= index
- else index + 1) < filhos.count() else filhos.last()
+ filho_index = (
+ filhos[index if index_dpt >= index else index + 1]
+ if (index if index_dpt >= index else index + 1) < filhos.count()
+ else filhos.last()
+ )
if filhos.last() == filho_index:
- dpt.ordem_bloco_atualizador = \
- filho_index.ordem_bloco_atualizador + 1
+ dpt.ordem_bloco_atualizador = filho_index.ordem_bloco_atualizador + 1
else:
- dpt.ordem_bloco_atualizador = \
- filho_index.ordem_bloco_atualizador - 1
+ dpt.ordem_bloco_atualizador = filho_index.ordem_bloco_atualizador - 1
dpt.save()
bloco.ordenar_bloco_alteracao()
@@ -1566,20 +1767,20 @@ class ActionDragAndMoveDispositivoAlteradoMixin(ActionsCommonsMixin):
class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
-
logger = logging.getLogger(__name__)
def json_delete_item_dispositivo(self, context):
return self.json_delete_bloco_dispositivo(context, bloco=False)
def json_delete_bloco_dispositivo(self, context, bloco=True):
- base = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
+ base = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
ta_base = base.ta
- base_anterior = Dispositivo.objects.order_by('-ordem').filter(
- ta_id=base.ta_id,
- ordem__lt=base.ordem
- ).first()
+ base_anterior = (
+ Dispositivo.objects.order_by("-ordem")
+ .filter(ta_id=base.ta_id, ordem__lt=base.ordem)
+ .first()
+ )
data = {}
if not base_anterior or base == base.get_raiz():
@@ -1589,34 +1790,38 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
data = self.get_json_for_refresh(base_anterior)
if base == base_anterior:
- data['pk'] = base.pk
- self.set_message(data, 'danger', _(
- 'Base Inicial não pode ser removida!'), modal=True)
+ data["pk"] = base.pk
+ self.set_message(
+ data, "danger", _("Base Inicial não pode ser removida!"), modal=True
+ )
else:
if base != base.get_raiz():
- data['pai'] = [base.get_raiz().pk]
+ data["pai"] = [base.get_raiz().pk]
- if ta_base.id != int(self.kwargs['ta_id']):
- data['pai'] = [base.dispositivo_atualizador.pk]
- data['pk'] = base.dispositivo_atualizador.pk
+ if ta_base.id != int(self.kwargs["ta_id"]):
+ data["pai"] = [base.dispositivo_atualizador.pk]
+ data["pk"] = base.dispositivo_atualizador.pk
try:
with transaction.atomic():
message = str(self.remover_dispositivo(base, bloco))
if message:
- self.set_message(data, 'warning', message, modal=True)
+ self.set_message(data, "warning", message, modal=True)
else:
- self.set_message(data, 'success', _(
- 'Exclusão efetuada com sucesso!'), modal=True)
+ self.set_message(
+ data,
+ "success",
+ _("Exclusão efetuada com sucesso!"),
+ modal=True,
+ )
ta_base.reagrupar_ordem_de_dispositivos()
except Exception as e:
- data['pk'] = self.kwargs['dispositivo_id']
- self.set_message(data, 'danger', str(e), modal=True)
+ data["pk"] = self.kwargs["dispositivo_id"]
+ self.set_message(data, "danger", str(e), modal=True)
return data
def remover_dispositivo(self, base, bloco):
-
if base.tipo_dispositivo.dispositivo_de_alteracao:
bloco = False
for d in base.dispositivos_alterados_set.all():
@@ -1649,7 +1854,7 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
p.dispositivos_filhos_set.add(d)
p.save()
except Exception as e:
- self.logger.error("user=" + username + '. ' + str(e))
+ self.logger.error("user=" + username + ". " + str(e))
print(e)
base.delete()
else:
@@ -1661,7 +1866,7 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
# inserções automáticas são excluidas junto com sua base,
# independente da escolha do usuário
- """ TODO: Criar possibilidade de transferência de filhos
+ """TODO: Criar possibilidade de transferência de filhos
de dispositivos automáticos
ex: na exclusão de artigos, na versão atual,
os caputs serão excluidos automáticamente mesmo que a
@@ -1677,79 +1882,122 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
# possível dos parents do dispostivo
# imediatamente anterior ao dispositivo base
- anterior = Dispositivo.objects.order_by('-ordem').filter(
- ta_id=base.ta_id,
- ordem__lt=d.ordem).exclude(
- pk=base.pk).exclude(
- dispositivo_pai=base).first()
+ anterior = (
+ Dispositivo.objects.order_by("-ordem")
+ .filter(ta_id=base.ta_id, ordem__lt=d.ordem)
+ .exclude(pk=base.pk)
+ .exclude(dispositivo_pai=base)
+ .first()
+ )
if not anterior:
- self.logger.error("user=" + username + ". Não é possível excluir este Dispositivo (id={}) sem"
- " excluir toda a sua estrutura!!!".format(base.id))
+ self.logger.error(
+ "user="
+ + username
+ + ". Não é possível excluir este Dispositivo (id={}) sem"
+ " excluir toda a sua estrutura!!!".format(base.id)
+ )
raise Exception(
- _('Não é possível excluir este Dispositivo sem'
- ' excluir toda a sua estrutura!!!'))
+ _(
+ "Não é possível excluir este Dispositivo sem"
+ " excluir toda a sua estrutura!!!"
+ )
+ )
if anterior.tipo_dispositivo == d.tipo_dispositivo:
d.dispositivo_pai = anterior.dispositivo_pai
d.nivel = anterior.nivel
if not d.tipo_dispositivo.contagem_continua:
- d.set_numero_completo(
- anterior.get_numero_completo())
+ d.set_numero_completo(anterior.get_numero_completo())
if d.dispositivo_substituido != anterior:
d.transform_in_next()
d.rotulo = d.rotulo_padrao()
else:
- parents = [anterior, ] + anterior.get_parents()
+ parents = [
+ anterior,
+ ] + anterior.get_parents()
for candidato in parents:
if candidato == base:
- self.logger.error("user=" + username + ". Não é possível excluir este "
- "Dispositivo (id={}) sem "
- "excluir toda a sua estrutura!!!".format(candidato.id))
+ self.logger.error(
+ "user="
+ + username
+ + ". Não é possível excluir este "
+ "Dispositivo (id={}) sem "
+ "excluir toda a sua estrutura!!!".format(
+ candidato.id
+ )
+ )
raise Exception(
- _('Não é possível excluir este '
- 'Dispositivo sem '
- 'excluir toda a sua estrutura!!!'))
- if (candidato.tipo_dispositivo ==
- d.tipo_dispositivo):
+ _(
+ "Não é possível excluir este "
+ "Dispositivo sem "
+ "excluir toda a sua estrutura!!!"
+ )
+ )
+ if candidato.tipo_dispositivo == d.tipo_dispositivo:
d.dispositivo_pai = candidato.dispositivo_pai
d.nivel = candidato.nivel
if not d.tipo_dispositivo.contagem_continua:
d.set_numero_completo(
- candidato.get_numero_completo())
+ candidato.get_numero_completo()
+ )
if d.dispositivo_substituido != candidato:
d.transform_in_next()
d.rotulo = d.rotulo_padrao()
break
- elif (candidato.tipo_dispositivo ==
- d.dispositivo_pai.tipo_dispositivo):
+ elif (
+ candidato.tipo_dispositivo
+ == d.dispositivo_pai.tipo_dispositivo
+ ):
d.dispositivo_pai = candidato
d.nivel = candidato.nivel + 1
break
elif d.tipo_dispositivo.possiveis_pais.filter(
- pai=candidato.tipo_dispositivo,
- perfil__padrao=True).exists():
+ pai=candidato.tipo_dispositivo, perfil__padrao=True
+ ).exists():
d.dispositivo_pai = candidato
- if ';' in d.tipo_dispositivo.\
- rotulo_prefixo_texto:
- d.set_numero_completo([0, 0, 0, 0, 0, 0, ])
+ if ";" in d.tipo_dispositivo.rotulo_prefixo_texto:
+ d.set_numero_completo(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
else:
- d.set_numero_completo([1, 0, 0, 0, 0, 0, ])
+ d.set_numero_completo(
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
d.nivel = candidato.nivel + 1
d.rotulo = d.rotulo_padrao()
break
else:
- self.logger.error("user=" + username + ". Não é possível excluir este "
- "Dispositivo (id={}) sem excluir toda "
- "a sua estrutura!!!".format(candidato.id))
+ self.logger.error(
+ "user=" + username + ". Não é possível excluir este "
+ "Dispositivo (id={}) sem excluir toda "
+ "a sua estrutura!!!".format(candidato.id)
+ )
raise Exception(
- _('Não é possível excluir este '
- 'Dispositivo sem '
- 'excluir toda a sua estrutura!!!'))
+ _(
+ "Não é possível excluir este "
+ "Dispositivo sem "
+ "excluir toda a sua estrutura!!!"
+ )
+ )
if not parents:
d.dispositivo_pai = anterior
@@ -1764,22 +2012,24 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
# Localizar irmaos posteriores do mesmo tipo de base
# se não DCC
if not base.tipo_dispositivo.contagem_continua:
- irmaos_posteriores = pai_base.dispositivos_filhos_set.\
- filter(
- ordem__gt=base_ordem,
- tipo_dispositivo=base.tipo_dispositivo)
+ irmaos_posteriores = pai_base.dispositivos_filhos_set.filter(
+ ordem__gt=base_ordem, tipo_dispositivo=base.tipo_dispositivo
+ )
# se DCC
else:
irmaos_posteriores = Dispositivo.objects.order_by(
- 'ordem').filter(
+ "ordem"
+ ).filter(
ta_id=base.ta_id,
ordem__gt=base_ordem,
- tipo_dispositivo_id=base.tipo_dispositivo_id)
+ tipo_dispositivo_id=base.tipo_dispositivo_id,
+ )
if proxima_articulacao:
irmaos_posteriores = irmaos_posteriores.exclude(
- ordem__gte=proxima_articulacao.ordem)
+ ordem__gte=proxima_articulacao.ordem
+ )
# excluir e renumerar irmaos
profundidade_base = base.get_profundidade()
@@ -1788,41 +2038,48 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
for irmao in irmaos_posteriores:
try:
- irmao.transform_in_prior(
- profundidade=profundidade_base)
+ irmao.transform_in_prior(profundidade=profundidade_base)
irmao.rotulo = irmao.rotulo_padrao()
irmao.save()
except Exception as e:
- self.logger.error(
- "user=" + username + "." + str(e))
+ self.logger.error("user=" + username + "." + str(e))
break
- irmaos = pai_base.dispositivos_filhos_set.\
- filter(tipo_dispositivo=base.tipo_dispositivo)
+ irmaos = pai_base.dispositivos_filhos_set.filter(
+ tipo_dispositivo=base.tipo_dispositivo
+ )
- if (irmaos.count() == 1 and
- ';' in irmaos[0].
- tipo_dispositivo.rotulo_prefixo_texto):
+ if (
+ irmaos.count() == 1
+ and ";" in irmaos[0].tipo_dispositivo.rotulo_prefixo_texto
+ ):
i = irmaos[0]
- i.set_numero_completo([0, 0, 0, 0, 0, 0, ])
+ i.set_numero_completo(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
i.rotulo = i.rotulo_padrao(local_insert=1)
i.save()
- if not irmaos.exists() and \
- auto_inserido_base and \
- pai_base.nivel:
+ if not irmaos.exists() and auto_inserido_base and pai_base.nivel:
self.remover_dispositivo(pai_base, False)
else:
# Renumerar Dispostivos de Contagem Contínua
# de dentro da base se pai
- dcc = Dispositivo.objects.order_by('ordem').filter(
+ dcc = Dispositivo.objects.order_by("ordem").filter(
ta_id=base.ta_id,
ordem__gt=base.ordem,
- tipo_dispositivo__contagem_continua=True)
+ tipo_dispositivo__contagem_continua=True,
+ )
if proxima_articulacao:
- dcc = dcc.exclude(
- ordem__gte=proxima_articulacao.ordem)
+ dcc = dcc.exclude(ordem__gte=proxima_articulacao.ordem)
base_adicao = {}
@@ -1834,25 +2091,27 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
dcc = list(dcc)
for d in dcc: # ultimo DCC do tipo encontrado
-
if d.tipo_dispositivo.class_css not in base_adicao:
- ultimo_dcc = Dispositivo.objects.order_by(
- 'ordem').filter(
- ta_id=base.ta_id,
- ordem__lt=base.ordem,
- ordem__gt=nivel_zero_anterior,
- tipo_dispositivo__contagem_continua=True,
- tipo_dispositivo=d.tipo_dispositivo).last()
+ ultimo_dcc = (
+ Dispositivo.objects.order_by("ordem")
+ .filter(
+ ta_id=base.ta_id,
+ ordem__lt=base.ordem,
+ ordem__gt=nivel_zero_anterior,
+ tipo_dispositivo__contagem_continua=True,
+ tipo_dispositivo=d.tipo_dispositivo,
+ )
+ .last()
+ )
if not ultimo_dcc:
break
base_adicao[
- d.tipo_dispositivo.class_css] = ultimo_dcc.\
- dispositivo0
+ d.tipo_dispositivo.class_css
+ ] = ultimo_dcc.dispositivo0
- d.dispositivo0 += base_adicao[
- d.tipo_dispositivo.class_css]
+ d.dispositivo0 += base_adicao[d.tipo_dispositivo.class_css]
d.rotulo = d.rotulo_padrao()
dcc.reverse()
@@ -1863,44 +2122,47 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
# em Bloco
else:
-
# Religar numeração de dispositivos de contagem contínua
# que serão excluidos
# pbi - proxima base independente
- pbi = Dispositivo.objects.\
- order_by('ordem').filter(
- ta_id=base.ta_id,
- ordem__gt=base_ordem,
- nivel__lte=base.nivel).first()
+ pbi = (
+ Dispositivo.objects.order_by("ordem")
+ .filter(
+ ta_id=base.ta_id, ordem__gt=base_ordem, nivel__lte=base.nivel
+ )
+ .first()
+ )
if pbi:
- dcc_a_excluir = Dispositivo.objects.order_by(
- 'ordem').filter(
+ dcc_a_excluir = Dispositivo.objects.order_by("ordem").filter(
ta_id=base.ta_id,
ordem__gte=base_ordem,
ordem__lt=pbi.ordem,
- tipo_dispositivo__contagem_continua=True)
+ tipo_dispositivo__contagem_continua=True,
+ )
if proxima_articulacao:
dcc_a_excluir = dcc_a_excluir.exclude(
- ordem__gte=proxima_articulacao.ordem)
+ ordem__gte=proxima_articulacao.ordem
+ )
religado = {}
for d in dcc_a_excluir:
if d.tipo_dispositivo.class_css in religado:
continue
- religado[
- d.tipo_dispositivo.class_css] = d.dispositivo0
+ religado[d.tipo_dispositivo.class_css] = d.dispositivo0
dcc_a_religar = Dispositivo.objects.filter(
ta_id=d.ta_id,
ordem__gte=pbi.ordem,
- tipo_dispositivo=d.tipo_dispositivo)
+ tipo_dispositivo=d.tipo_dispositivo,
+ )
if proxima_articulacao:
dcc_a_religar = dcc_a_religar.exclude(
- ordem__gte=proxima_articulacao.ordem)
+ ordem__gte=proxima_articulacao.ordem
+ )
primeiro_a_religar = True
profundidade = d.get_profundidade()
@@ -1917,8 +2179,7 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
try:
dr.save(clean=base != dr)
except Exception as e:
- self.logger.error(
- "user=" + username + ". " + str(e))
+ self.logger.error("user=" + username + ". " + str(e))
break
# Pode não ser religavável
@@ -1938,7 +2199,8 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
if base.tipo_dispositivo.dispositivo_de_alteracao:
dpts = base.dispositivos_alterados_set.all().order_by(
- '-ordem_bloco_atualizador')
+ "-ordem_bloco_atualizador"
+ )
for dpt in dpts:
try:
self.remover_dispositivo(dpt, False)
@@ -1956,49 +2218,53 @@ class ActionDeleteDispositivoMixin(ActionsCommonsMixin):
continua internos extra bloco.
Depois do bloco limpo, a função é chamada novamente para
excluir realmente a escolha do usuário
- e religar seus irmaos
+ e religar seus irmaos
"""
self.remover_dispositivo(base, False)
- return ''
+ return ""
class ActionDispositivoCreateMixin(ActionsCommonsMixin):
-
logger = logging.getLogger(__name__)
def allowed_inserts(self, _base=None):
request = self.request
try:
base = Dispositivo.objects.get(
- pk=self.kwargs['dispositivo_id'] if not _base else _base)
+ pk=self.kwargs["dispositivo_id"] if not _base else _base
+ )
result = [
{
- 'tipo_insert': force_str("{} {}".format(_('Inserir Após'), base.tipo_dispositivo.nome)),
- 'icone': '↷ ',
- 'action': 'json_add_next',
- 'itens': []},
+ "tipo_insert": force_str(
+ "{} {}".format(_("Inserir Após"), base.tipo_dispositivo.nome)
+ ),
+ "icone": "↷ ",
+ "action": "json_add_next",
+ "itens": [],
+ },
{
- 'tipo_insert': force_str("{} {}".format(_('Inserir em'), base.tipo_dispositivo.nome)),
- 'icone': '⇲ ',
- 'action': 'json_add_in',
- 'itens': []
+ "tipo_insert": force_str(
+ "{} {}".format(_("Inserir em"), base.tipo_dispositivo.nome)
+ ),
+ "icone": "⇲ ",
+ "action": "json_add_in",
+ "itens": [],
},
{
- 'tipo_insert': force_str(_('Inserir Antes')),
- 'icone': '↶ ',
- 'action': 'json_add_prior',
- 'itens': []
- }
+ "tipo_insert": force_str(_("Inserir Antes")),
+ "icone": "↶ ",
+ "action": "json_add_prior",
+ "itens": [],
+ },
]
- perfil_pk = request.session['perfil_estrutural']
+ perfil_pk = request.session["perfil_estrutural"]
prox_possivel = Dispositivo.objects.filter(
- ordem__gt=base.ordem,
- nivel__lte=base.nivel,
- ta_id=base.ta_id)[:1]
+ ordem__gt=base.ordem, nivel__lte=base.nivel, ta_id=base.ta_id
+ )[:1]
if prox_possivel.exists():
prox_possivel = prox_possivel[0]
@@ -2010,20 +2276,20 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
parents.insert(0, base)
nivel = sys.maxsize
for dp in parents:
-
if dp.nivel >= nivel:
continue
if dp.auto_inserido:
continue
- if prox_possivel and \
- dp.tipo_dispositivo != base.tipo_dispositivo and\
- dp.nivel < prox_possivel.nivel and\
- not prox_possivel.tipo_dispositivo.permitido_inserir_in(
- dp.tipo_dispositivo,
- perfil_pk=perfil_pk):
-
+ if (
+ prox_possivel
+ and dp.tipo_dispositivo != base.tipo_dispositivo
+ and dp.nivel < prox_possivel.nivel
+ and not prox_possivel.tipo_dispositivo.permitido_inserir_in(
+ dp.tipo_dispositivo, perfil_pk=perfil_pk
+ )
+ ):
if dp.tipo_dispositivo != prox_possivel.tipo_dispositivo:
continue
@@ -2031,19 +2297,24 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
# um do mesmo para inserção antes
if dp == base:
- result[2]['itens'].append({
- 'class_css': dp.tipo_dispositivo.class_css,
- 'tipo_pk': dp.tipo_dispositivo.pk,
- 'variacao': 0,
- 'provavel': '%s (%s)' % (
- dp.rotulo_padrao(local_insert=1),
- dp.tipo_dispositivo.nome,),
- 'dispositivo_base': base.pk})
+ result[2]["itens"].append(
+ {
+ "class_css": dp.tipo_dispositivo.class_css,
+ "tipo_pk": dp.tipo_dispositivo.pk,
+ "variacao": 0,
+ "provavel": "%s (%s)"
+ % (
+ dp.rotulo_padrao(local_insert=1),
+ dp.tipo_dispositivo.nome,
+ ),
+ "dispositivo_base": base.pk,
+ }
+ )
if dp.dispositivo_pai:
flag_pv = dp.tipo_dispositivo.permitido_variacao(
- dp.dispositivo_pai.tipo_dispositivo,
- perfil_pk=perfil_pk)
+ dp.dispositivo_pai.tipo_dispositivo, perfil_pk=perfil_pk
+ )
else:
flag_pv = False
@@ -2060,30 +2331,42 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if not rt[0]:
break
flag_variacao += rt[1]
- r.append({'class_css': dp.tipo_dispositivo.class_css,
- 'tipo_pk': dp.tipo_dispositivo.pk,
- 'variacao': flag_variacao,
- 'provavel': '%s (%s)' % (
- dp.rotulo_padrao(local_insert),
- dp.tipo_dispositivo.nome,),
- 'dispositivo_base': base.pk})
+ r.append(
+ {
+ "class_css": dp.tipo_dispositivo.class_css,
+ "tipo_pk": dp.tipo_dispositivo.pk,
+ "variacao": flag_variacao,
+ "provavel": "%s (%s)"
+ % (
+ dp.rotulo_padrao(local_insert),
+ dp.tipo_dispositivo.nome,
+ ),
+ "dispositivo_base": base.pk,
+ }
+ )
flag_direcao = -1
r.reverse()
if not flag_pv:
- r = [r[0], ]
-
- if len(r) > 0 and dp.tipo_dispositivo.formato_variacao0 == \
- TipoDispositivo.FNCN:
- r = [r[0], ]
+ r = [
+ r[0],
+ ]
+
+ if (
+ len(r) > 0
+ and dp.tipo_dispositivo.formato_variacao0 == TipoDispositivo.FNCN
+ ):
+ r = [
+ r[0],
+ ]
if dp.tipo_dispositivo == base.tipo_dispositivo:
- result[0]['itens'] += r
+ result[0]["itens"] += r
else:
- result[0]['itens'] += r
- result[2]['itens'] += r
+ result[0]["itens"] += r
+ result[2]["itens"] += r
if nivel == 0:
break
@@ -2095,44 +2378,45 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if paradentro:
# Outros Tipos de Dispositivos PARA DENTRO
otds = TipoDispositivo.objects.order_by(
- '-contagem_continua', 'id').all()
+ "-contagem_continua", "id"
+ ).all()
else:
# Outros Tipos de Dispositivos PARA FORA
classes_ja_inseridas = []
- for c in result[0]['itens']:
- if c['class_css'] not in classes_ja_inseridas:
- classes_ja_inseridas.append(c['class_css'])
- for c in result[1]['itens']:
- if c['class_css'] not in classes_ja_inseridas:
- classes_ja_inseridas.append(c['class_css'])
- otds = TipoDispositivo.objects.order_by(
- '-contagem_continua', 'id').all().exclude(
- class_css__in=classes_ja_inseridas)
+ for c in result[0]["itens"]:
+ if c["class_css"] not in classes_ja_inseridas:
+ classes_ja_inseridas.append(c["class_css"])
+ for c in result[1]["itens"]:
+ if c["class_css"] not in classes_ja_inseridas:
+ classes_ja_inseridas.append(c["class_css"])
+ otds = (
+ TipoDispositivo.objects.order_by("-contagem_continua", "id")
+ .all()
+ .exclude(class_css__in=classes_ja_inseridas)
+ )
for td in otds:
-
if td.dispositivo_de_alteracao:
if not self.request.user.has_perm(
- 'compilacao.'
- 'change_dispositivo_registros_compilacao'):
+ "compilacao." "change_dispositivo_registros_compilacao"
+ ):
continue
if paradentro and not td.permitido_inserir_in(
- tipb,
- include_relative_autos=True,
- perfil_pk=perfil_pk):
+ tipb, include_relative_autos=True, perfil_pk=perfil_pk
+ ):
continue
base.tipo_dispositivo = td
if not paradentro:
-
flag_insercao = False
for possivelpai in parents:
if td.permitido_inserir_in(
possivelpai.tipo_dispositivo,
include_relative_autos=True,
- perfil_pk=perfil_pk):
+ perfil_pk=perfil_pk,
+ ):
flag_insercao = True
break
@@ -2144,24 +2428,26 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if prox_possivel:
if prox_possivel.nivel == base.nivel:
- if prox_possivel.tipo_dispositivo != td and\
- not prox_possivel.tipo_dispositivo.\
- permitido_inserir_in(
- td, perfil_pk=perfil_pk):
+ if (
+ prox_possivel.tipo_dispositivo != td
+ and not prox_possivel.tipo_dispositivo.permitido_inserir_in(
+ td, perfil_pk=perfil_pk
+ )
+ ):
continue
else:
- if possivelpai.tipo_dispositivo != \
- prox_possivel.tipo_dispositivo and\
- not prox_possivel.tipo_dispositivo.\
- permitido_inserir_in(
- possivelpai.tipo_dispositivo,
- perfil_pk=perfil_pk) and \
- possivelpai.nivel < \
- prox_possivel.nivel:
+ if (
+ possivelpai.tipo_dispositivo
+ != prox_possivel.tipo_dispositivo
+ and not prox_possivel.tipo_dispositivo.permitido_inserir_in(
+ possivelpai.tipo_dispositivo,
+ perfil_pk=perfil_pk,
+ )
+ and possivelpai.nivel < prox_possivel.nivel
+ ):
continue
base.dispositivo_pai = possivelpai
- Dispositivo.set_numero_for_add_in(
- possivelpai, base, td)
+ Dispositivo.set_numero_for_add_in(possivelpai, base, td)
else:
Dispositivo.set_numero_for_add_in(base, base, td)
@@ -2182,46 +2468,59 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if not rt[0]:
break
flag_variacao += rt[1]
- r.append({'class_css': td.class_css,
- 'tipo_pk': td.pk,
- 'variacao': flag_variacao,
- 'provavel': '%s (%s)' % (
- base.rotulo_padrao(local_insert),
- base.tipo_dispositivo.nome,),
- 'dispositivo_base': base.pk})
+ r.append(
+ {
+ "class_css": td.class_css,
+ "tipo_pk": td.pk,
+ "variacao": flag_variacao,
+ "provavel": "%s (%s)"
+ % (
+ base.rotulo_padrao(local_insert),
+ base.tipo_dispositivo.nome,
+ ),
+ "dispositivo_base": base.pk,
+ }
+ )
flag_direcao = -1
r.reverse()
- if len(r) > 0 and td.formato_variacao0 == \
- TipoDispositivo.FNCN:
- r = [r[0], ]
+ if len(r) > 0 and td.formato_variacao0 == TipoDispositivo.FNCN:
+ r = [
+ r[0],
+ ]
else:
if td.contagem_continua:
base.transform_in_next()
- r = [{'class_css': td.class_css,
- 'tipo_pk': td.pk,
- 'variacao': 0,
- 'provavel': '%s (%s)' % (
- base.rotulo_padrao(1, paradentro),
- td.nome,),
- 'dispositivo_base': base.pk}]
+ r = [
+ {
+ "class_css": td.class_css,
+ "tipo_pk": td.pk,
+ "variacao": 0,
+ "provavel": "%s (%s)"
+ % (
+ base.rotulo_padrao(1, paradentro),
+ td.nome,
+ ),
+ "dispositivo_base": base.pk,
+ }
+ ]
if paradentro == 1:
- result[1]['itens'] += r
+ result[1]["itens"] += r
else:
- result[2]['itens'] += r
- result[0]['itens'] += r
+ result[2]["itens"] += r
+ result[0]["itens"] += r
# FIXME para liberar as opções de inserção antes,
# o método json_add_prior deve ser implementado
if len(result) > 2:
result.pop()
- result[0]['itens'] = result[1]['itens'] + result[0]['itens']
- result[0]['tipo_insert'] = 'Inserção'
- result[1]['itens'] = []
+ result[0]["itens"] = result[1]["itens"] + result[0]["itens"]
+ result[0]["tipo_insert"] = "Inserção"
+ result[1]["itens"] = []
return result
@@ -2234,22 +2533,21 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
def json_set_dvt(self, context):
# Dispositivo de Vigência do Texto Original e de Dpts Alterados
- dvt = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
+ dvt = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
if dvt.auto_inserido:
dvt = dvt.dispositivo_pai
try:
- Dispositivo.objects.filter(
- ta=dvt.ta, ta_publicado__isnull=True
- ).update(
+ Dispositivo.objects.filter(ta=dvt.ta, ta_publicado__isnull=True).update(
dispositivo_vigencia=dvt,
inicio_vigencia=dvt.inicio_vigencia,
- inicio_eficacia=dvt.inicio_eficacia)
+ inicio_eficacia=dvt.inicio_eficacia,
+ )
- Dispositivo.objects.filter(ta_publicado=dvt.ta
- ).update(
+ Dispositivo.objects.filter(ta_publicado=dvt.ta).update(
dispositivo_vigencia=dvt,
inicio_vigencia=dvt.inicio_vigencia,
- inicio_eficacia=dvt.inicio_eficacia)
+ inicio_eficacia=dvt.inicio_eficacia,
+ )
dps = Dispositivo.objects.filter(dispositivo_vigencia=dvt)
for d in dps:
@@ -2265,22 +2563,31 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
d.fim_eficacia = ds.inicio_eficacia - timedelta(days=1)
d.save()
- data = {'pk': dvt.pk,
- 'pai': [dvt.pk, ]}
- self.set_message(data, 'success',
- _('Dispositivo de Vigência atualizado '
- 'com sucesso!!!'))
+ data = {
+ "pk": dvt.pk,
+ "pai": [
+ dvt.pk,
+ ],
+ }
+ self.set_message(
+ data,
+ "success",
+ _("Dispositivo de Vigência atualizado " "com sucesso!!!"),
+ )
return data
except Exception as e:
data = {}
username = self.request.user.username
- self.logger.error("user=" + username + ". Ocorreu um erro ({}) na atualização do "
- "Dispositivo de Vigência".format(str(e)))
- self.set_message(data,
- 'success',
- _('Ocorreu um erro na atualização do '
- 'Dispositivo de Vigência'))
+ self.logger.error(
+ "user=" + username + ". Ocorreu um erro ({}) na atualização do "
+ "Dispositivo de Vigência".format(str(e))
+ )
+ self.set_message(
+ data,
+ "success",
+ _("Ocorreu um erro na atualização do " "Dispositivo de Vigência"),
+ )
return data
@@ -2288,41 +2595,47 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
return {}
def json_add_in(self, context):
- return self.json_add_next(context, local_add='json_add_in')
+ return self.json_add_next(context, local_add="json_add_in")
def json_add_next(
self,
- context, local_add='json_add_next',
+ context,
+ local_add="json_add_next",
create_auto_inserts=True,
- registro_inclusao=False
+ registro_inclusao=False,
):
-
try:
-
dp_auto_insert = None
- base = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
+ base = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
if base.dispositivo_atualizador:
registro_inclusao = True
- tipo = TipoDispositivo.objects.get(pk=context['tipo_pk'])
- pub_last = Publicacao.objects.order_by(
- 'data', 'hora').filter(ta=base.ta).last()
+ tipo = TipoDispositivo.objects.get(pk=context["tipo_pk"])
+ pub_last = (
+ Publicacao.objects.order_by("data", "hora").filter(ta=base.ta).last()
+ )
- variacao = int(context['variacao'])
- parents = [base, ] + base.get_parents()
+ variacao = int(context["variacao"])
+ parents = [
+ base,
+ ] + base.get_parents()
- if 'perfil_pk' not in context:
+ if "perfil_pk" not in context:
perfil_padrao = PerfilEstruturalTextoArticulado.objects.filter(
- padrao=True).first()
+ padrao=True
+ ).first()
if perfil_padrao:
- context['perfil_pk'] = perfil_padrao.pk
+ context["perfil_pk"] = perfil_padrao.pk
else:
- raise Exception('Não existe perfil padrão!')
+ raise Exception("Não existe perfil padrão!")
perfil_parents = PerfilEstruturalTextoArticulado.objects.get(
- pk=context['perfil_pk'])
- perfil_parents = perfil_parents.parents + [perfil_parents, ]
+ pk=context["perfil_pk"]
+ )
+ perfil_parents = perfil_parents.parents + [
+ perfil_parents,
+ ]
perfil_parents.reverse()
dp_irmao = None
@@ -2333,41 +2646,74 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
break
if tipo.permitido_inserir_in(
- dp.tipo_dispositivo,
- perfil_pk=context['perfil_pk']):
+ dp.tipo_dispositivo, perfil_pk=context["perfil_pk"]
+ ):
dp_pai = dp
break
dp_pai = dp
if dp_irmao is not None:
dp = Dispositivo.new_instance_based_on(
- dp_irmao, tipo, base_alteracao=base)
+ dp_irmao, tipo, base_alteracao=base
+ )
dp.transform_in_next(variacao)
else:
# Inserção sem precedente
dp = Dispositivo.new_instance_based_on(
- dp_pai, tipo, base_alteracao=base)
+ dp_pai, tipo, base_alteracao=base
+ )
dp.dispositivo_pai = dp_pai
dp.nivel += 1
if tipo.contagem_continua:
- ultimo_irmao = Dispositivo.objects.order_by(
- '-ordem').filter(
- ordem__lte=base.ordem,
- ordem__gte=parents[-1].ordem,
- tipo_dispositivo_id=tipo.pk,
- ta_id=base.ta_id).first()
+ ultimo_irmao = (
+ Dispositivo.objects.order_by("-ordem")
+ .filter(
+ ordem__lte=base.ordem,
+ ordem__gte=parents[-1].ordem,
+ tipo_dispositivo_id=tipo.pk,
+ ta_id=base.ta_id,
+ )
+ .first()
+ )
dp.set_numero_completo(
- [1, 0, 0, 0, 0, 0, ] if not ultimo_irmao else
- ultimo_irmao.get_numero_completo())
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ if not ultimo_irmao
+ else ultimo_irmao.get_numero_completo()
+ )
if ultimo_irmao:
dp.transform_in_next(variacao)
else:
- if ';' in tipo.rotulo_prefixo_texto:
- dp.set_numero_completo([0, 0, 0, 0, 0, 0, ])
+ if ";" in tipo.rotulo_prefixo_texto:
+ dp.set_numero_completo(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
else:
- dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
+ dp.set_numero_completo(
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
if dp.dispositivo_atualizador:
registro_inclusao = True
@@ -2376,38 +2722,50 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if dp.dispositivo_pai:
for perfil in perfil_parents:
pp = dp.tipo_dispositivo.possiveis_pais.filter(
- pai_id=dp.dispositivo_pai.tipo_dispositivo_id,
- perfil=perfil)
+ pai_id=dp.dispositivo_pai.tipo_dispositivo_id, perfil=perfil
+ )
if pp.exists() and pp[0].quantidade_permitida >= 0:
qtd_existente = Dispositivo.objects.filter(
ta_id=dp.ta_id,
tipo_dispositivo_id=dp.tipo_dispositivo_id,
- dispositivo_pai=dp.dispositivo_pai).count()
+ dispositivo_pai=dp.dispositivo_pai,
+ ).count()
if qtd_existente >= pp[0].quantidade_permitida:
- data = {'pk': None
- if base.dispositivo_pai else
- base.pk,
- 'pai': [
- base.dispositivo_pai.pk if
- base.dispositivo_pai else
- base.pk,
- ]}
- self.set_message(data, 'danger',
- _('Limite de inserções de '
- 'dispositivos deste tipo '
- 'foi excedido.'), time=6000)
+ data = {
+ "pk": None if base.dispositivo_pai else base.pk,
+ "pai": [
+ base.dispositivo_pai.pk
+ if base.dispositivo_pai
+ else base.pk,
+ ],
+ }
+ self.set_message(
+ data,
+ "danger",
+ _(
+ "Limite de inserções de "
+ "dispositivos deste tipo "
+ "foi excedido."
+ ),
+ time=6000,
+ )
return data
- ordem = base.criar_espaco(
- espaco_a_criar=1, local=local_add)
+ ordem = base.criar_espaco(espaco_a_criar=1, local=local_add)
dp.rotulo = dp.rotulo_padrao()
dp.ordem = ordem
if not registro_inclusao:
- dp.incrementar_irmaos(variacao, [local_add, ], force=False)
+ dp.incrementar_irmaos(
+ variacao,
+ [
+ local_add,
+ ],
+ force=False,
+ )
dp.publicacao = pub_last
@@ -2417,8 +2775,8 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
if create_auto_inserts:
for perfil in perfil_parents:
tipos_dp_auto_insert = tipo.filhos_permitidos.filter(
- filho_de_insercao_automatica=True,
- perfil=perfil)
+ filho_de_insercao_automatica=True, perfil=perfil
+ )
for tipoauto in tipos_dp_auto_insert:
qtdp = tipoauto.quantidade_permitida
@@ -2426,7 +2784,7 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
qtdp -= Dispositivo.objects.filter(
ta_id=dp.ta_id,
dispositivo_pai_id=dp.id,
- tipo_dispositivo_id=tipoauto.filho_permitido.pk
+ tipo_dispositivo_id=tipoauto.filho_permitido.pk,
).count()
if qtdp > 0:
count_auto_insert += 1
@@ -2438,9 +2796,9 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
# Inserção automática
if count_auto_insert:
-
ordem = dp.criar_espaco(
- espaco_a_criar=count_auto_insert, local='json_add_in')
+ espaco_a_criar=count_auto_insert, local="json_add_in"
+ )
dp_pk = dp.pk
dp.ordem = ordem
@@ -2449,12 +2807,30 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp.dispositivo_pai_id = dp_pk
dp.pk = None
dp.tipo_dispositivo = tipoauto.filho_permitido
- if ';' in dp.tipo_dispositivo.rotulo_prefixo_texto:
- dp.set_numero_completo([0, 0, 0, 0, 0, 0, ])
+ if ";" in dp.tipo_dispositivo.rotulo_prefixo_texto:
+ dp.set_numero_completo(
+ [
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
else:
- dp.set_numero_completo([1, 0, 0, 0, 0, 0, ])
+ dp.set_numero_completo(
+ [
+ 1,
+ 0,
+ 0,
+ 0,
+ 0,
+ 0,
+ ]
+ )
dp.rotulo = dp.rotulo_padrao()
- dp.texto = ''
+ dp.texto = ""
dp.publicacao = pub_last
dp.auto_inserido = True
@@ -2468,32 +2844,33 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
dp.ordem_bloco_atualizador = 0
dp.save(clean=False)
- ''' Reenquadrar todos os dispositivos que possuem pai
+ """ Reenquadrar todos os dispositivos que possuem pai
antes da inserção atual e que são inferiores a dp,
- redirecionando para o novo pai'''
+ redirecionando para o novo pai"""
nivel = sys.maxsize
flag_niveis = False
if not dp.tipo_dispositivo.dispositivo_de_alteracao:
possiveis_filhos = Dispositivo.objects.filter(
- ordem__gt=dp.ordem,
- ta_id=dp.ta_id)
+ ordem__gt=dp.ordem, ta_id=dp.ta_id
+ )
for filho in possiveis_filhos:
-
if filho.nivel > nivel:
continue
- if not filho.dispositivo_pai or\
- filho.dispositivo_pai.ordem >= dp.ordem:
+ if (
+ not filho.dispositivo_pai
+ or filho.dispositivo_pai.ordem >= dp.ordem
+ ):
continue
nivel = filho.nivel
if not filho.tipo_dispositivo.permitido_inserir_in(
- dp.tipo_dispositivo,
- perfil_pk=context['perfil_pk']):
+ dp.tipo_dispositivo, perfil_pk=context["perfil_pk"]
+ ):
continue
filho.dispositivo_pai = dp
@@ -2505,15 +2882,13 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
numtipos = {}
- ''' Renumerar filhos imediatos que
- não possuam contagem continua'''
+ """ Renumerar filhos imediatos que
+ não possuam contagem continua"""
if flag_niveis:
- filhos = Dispositivo.objects.filter(
- dispositivo_pai_id=dp.pk)
+ filhos = Dispositivo.objects.filter(dispositivo_pai_id=dp.pk)
for filho in filhos:
-
if filho.tipo_dispositivo.contagem_continua:
continue
@@ -2522,12 +2897,13 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
numtipos[filho.tipo_dispositivo.class_css] += 1
else:
t = filho.tipo_dispositivo
- prefixo = t.rotulo_prefixo_texto.split(';')
+ prefixo = t.rotulo_prefixo_texto.split(";")
if len(prefixo) > 1:
count_irmaos_m_tipo = Dispositivo.objects.filter(
~Q(pk=filho.pk),
tipo_dispositivo=t,
- dispositivo_pai=filho.dispositivo_pai)[:1]
+ dispositivo_pai=filho.dispositivo_pai,
+ )[:1]
if count_irmaos_m_tipo.exists():
numtipos[filho.tipo_dispositivo.class_css] = 1
@@ -2536,50 +2912,56 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
else:
numtipos[filho.tipo_dispositivo.class_css] = 1
- filho.dispositivo0 = numtipos[
- filho.tipo_dispositivo.class_css]
+ filho.dispositivo0 = numtipos[filho.tipo_dispositivo.class_css]
filho.rotulo = filho.rotulo_padrao()
filho.save()
- ''' Renumerar dispositivos de
+ """ Renumerar dispositivos de
contagem continua, caso a inserção seja uma articulação.
- Desde que não seja um registro de inclusão através de compilação'''
+ Desde que não seja um registro de inclusão através de compilação"""
if dp.nivel == 0 and not registro_inclusao:
-
proxima_articulacao = dp.select_next_root()
if not proxima_articulacao:
- filhos_continuos = list(Dispositivo.objects.filter(
- ordem__gt=dp.ordem,
- ta_id=dp.ta_id,
- tipo_dispositivo__contagem_continua=True))
+ filhos_continuos = list(
+ Dispositivo.objects.filter(
+ ordem__gt=dp.ordem,
+ ta_id=dp.ta_id,
+ tipo_dispositivo__contagem_continua=True,
+ )
+ )
else:
- filhos_continuos = list(Dispositivo.objects.filter(
- ordem__gt=dp.ordem,
- ordem__lt=proxima_articulacao.ordem,
- ta_id=dp.ta_id,
- tipo_dispositivo__contagem_continua=True))
+ filhos_continuos = list(
+ Dispositivo.objects.filter(
+ ordem__gt=dp.ordem,
+ ordem__lt=proxima_articulacao.ordem,
+ ta_id=dp.ta_id,
+ tipo_dispositivo__contagem_continua=True,
+ )
+ )
base_reducao = {}
for filho in filhos_continuos:
if filho.tipo_dispositivo.class_css not in base_reducao:
- base_reducao[filho.tipo_dispositivo.class_css] = \
+ base_reducao[filho.tipo_dispositivo.class_css] = (
filho.dispositivo0 - 1
+ )
- filho.dispositivo0 -= base_reducao[
- filho.tipo_dispositivo.class_css]
+ filho.dispositivo0 -= base_reducao[filho.tipo_dispositivo.class_css]
filho.rotulo = filho.rotulo_padrao()
filho.save()
- ''' Reordenar bloco atualizador caso a inserção seja
- dentro de um bloco de alteração'''
+ """ Reordenar bloco atualizador caso a inserção seja
+ dentro de um bloco de alteração"""
- if dp.tipo_dispositivo.dispositivo_de_alteracao and\
- not dp.tipo_dispositivo.dispositivo_de_articulacao:
+ if (
+ dp.tipo_dispositivo.dispositivo_de_alteracao
+ and not dp.tipo_dispositivo.dispositivo_de_articulacao
+ ):
dp.dispositivo_pai.ordenar_bloco_alteracao()
if dp_auto_insert is None:
@@ -2597,37 +2979,42 @@ class ActionDispositivoCreateMixin(ActionsCommonsMixin):
return {}
-class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
- ActionDeleteDispositivoMixin,
- ActionDispositivoCreateMixin):
+class ActionsEditMixin(
+ ActionDragAndMoveDispositivoAlteradoMixin,
+ ActionDeleteDispositivoMixin,
+ ActionDispositivoCreateMixin,
+):
logger = logging.getLogger(__name__)
def render_to_json_response(self, context, **response_kwargs):
+ action = getattr(self, context["action"])
- action = getattr(self, context['action'])
-
- if 'tipo_pk' in self.request.GET:
- context['tipo_pk'] = self.request.GET['tipo_pk']
+ if "tipo_pk" in self.request.GET:
+ context["tipo_pk"] = self.request.GET["tipo_pk"]
- if 'variacao' in self.request.GET:
- context['variacao'] = self.request.GET['variacao']
+ if "variacao" in self.request.GET:
+ context["variacao"] = self.request.GET["variacao"]
- if 'pk_bloco' in self.request.GET:
- context['pk_bloco'] = self.request.GET['pk_bloco']
+ if "pk_bloco" in self.request.GET:
+ context["pk_bloco"] = self.request.GET["pk_bloco"]
- if 'perfil_estrutural' in self.request.session:
- context['perfil_pk'] = self.request.session['perfil_estrutural']
+ if "perfil_estrutural" in self.request.session:
+ context["perfil_pk"] = self.request.session["perfil_estrutural"]
data = action(context)
- if 'message' in context and 'message' not in data:
- data['message'] = context['message']
+ if "message" in context and "message" not in data:
+ data["message"] = context["message"]
return JsonResponse(data, safe=False)
def json_get_perfis(self, context):
- data = {'pk': self.kwargs['dispositivo_id'],
- 'pai': [self.kwargs['dispositivo_id'], ]}
+ data = {
+ "pk": self.kwargs["dispositivo_id"],
+ "pai": [
+ self.kwargs["dispositivo_id"],
+ ],
+ }
return data
@@ -2636,45 +3023,48 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
request = self.request
ta = None
- if hasattr(self, 'object') and isinstance(self.object, Dispositivo):
+ if hasattr(self, "object") and isinstance(self.object, Dispositivo):
ta = self.object.ta
- elif hasattr(self, 'object') and isinstance(
- self.object, TextoArticulado):
+ elif hasattr(self, "object") and isinstance(self.object, TextoArticulado):
ta = self.object
else:
- ta_id = self.kwargs.get('ta_id', 0)
+ ta_id = self.kwargs.get("ta_id", 0)
if ta_id:
ta = TextoArticulado.objects.get(pk=ta_id)
if ta:
- if ta.content_object and hasattr(ta.content_object, 'perfis'):
+ if ta.content_object and hasattr(ta.content_object, "perfis"):
qs = ta.content_object.perfis
else:
qs = ta.tipo_ta.perfis.all()
- perfil_get = request.GET.get('perfil_pk', 0)
+ perfil_get = request.GET.get("perfil_pk", 0)
if perfil_get and qs.filter(id=perfil_get).exists():
- request.session['perfil_estrutural'] = int(perfil_get)
+ request.session["perfil_estrutural"] = int(perfil_get)
return qs
- perfil_session = request.session.get('perfil_estrutural', perfil_get)
+ perfil_session = request.session.get("perfil_estrutural", perfil_get)
if perfil_session and qs.filter(id=perfil_session).exists():
- request.session['perfil_estrutural'] = int(perfil_session)
+ request.session["perfil_estrutural"] = int(perfil_session)
return qs
if qs.exists():
- request.session['perfil_estrutural'] = qs.first().id
+ request.session["perfil_estrutural"] = qs.first().id
return qs
- def json_add_next_registra_inclusao(
- self, context, local_add='json_add_next'):
-
- bloco_alteracao = Dispositivo.objects.get(pk=context['pk_bloco'])
+ def json_add_next_registra_inclusao(self, context, local_add="json_add_next"):
+ bloco_alteracao = Dispositivo.objects.get(pk=context["pk_bloco"])
data = {}
- data.update({'pk': bloco_alteracao.pk,
- 'pai': [bloco_alteracao.pk, ]})
+ data.update(
+ {
+ "pk": bloco_alteracao.pk,
+ "pai": [
+ bloco_alteracao.pk,
+ ],
+ }
+ )
"""if bloco_alteracao.inicio_vigencia < base.inicio_vigencia:
self.set_message(
@@ -2684,14 +3074,15 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
'alteração não pode ser retroativo!'), time=10000)
return data"""
- data = self.json_add_next(context,
- local_add=local_add,
- create_auto_inserts=True,
- registro_inclusao=True)
-
- if data and data['pk']:
+ data = self.json_add_next(
+ context,
+ local_add=local_add,
+ create_auto_inserts=True,
+ registro_inclusao=True,
+ )
- ndp = Dispositivo.objects.get(pk=data['pk'])
+ if data and data["pk"]:
+ ndp = Dispositivo.objects.get(pk=data["pk"])
ndp.dispositivo_atualizador = bloco_alteracao
ndp.ta_publicado = bloco_alteracao.ta
@@ -2704,47 +3095,58 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
ndp.inicio_eficacia = bloco_alteracao.inicio_eficacia
ndp.inicio_vigencia = bloco_alteracao.inicio_vigencia
- dispositivos_do_bloco = \
- bloco_alteracao.dispositivos_alterados_set.order_by(
- 'ordem_bloco_atualizador')
+ dispositivos_do_bloco = bloco_alteracao.dispositivos_alterados_set.order_by(
+ "ordem_bloco_atualizador"
+ )
if dispositivos_do_bloco.exists():
- ndp.ordem_bloco_atualizador = dispositivos_do_bloco.last(
- ).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM
+ ndp.ordem_bloco_atualizador = (
+ dispositivos_do_bloco.last().ordem_bloco_atualizador
+ + Dispositivo.INTERVALO_ORDEM
+ )
ndp.save()
bloco_alteracao.ordenar_bloco_alteracao()
- data.update({'pk': ndp.pk,
- 'pai': [bloco_alteracao.pk, ]})
+ data.update(
+ {
+ "pk": ndp.pk,
+ "pai": [
+ bloco_alteracao.pk,
+ ],
+ }
+ )
else:
- data.update({'pk': bloco_alteracao.pk,
- 'pai': [bloco_alteracao.pk, ]})
+ data.update(
+ {
+ "pk": bloco_alteracao.pk,
+ "pai": [
+ bloco_alteracao.pk,
+ ],
+ }
+ )
self.set_message(
- data, 'danger',
- _('Não é possível incluir seu Registro de Inclusão, '
- 'verifique a opção escolhida e as variações possíveis!'),
- time=10000)
+ data,
+ "danger",
+ _(
+ "Não é possível incluir seu Registro de Inclusão, "
+ "verifique a opção escolhida e as variações possíveis!"
+ ),
+ time=10000,
+ )
return data
def json_add_in_registra_inclusao(self, context):
- return self.json_add_next_registra_inclusao(
- context, local_add='json_add_in')
+ return self.json_add_next_registra_inclusao(context, local_add="json_add_in")
def registra_revogacao(self, bloco_alteracao, dsp_a_rev, em_bloco=False):
-
return self.registra_alteracao(
- bloco_alteracao,
- dsp_a_rev,
- revogacao=True,
- em_bloco=em_bloco
+ bloco_alteracao, dsp_a_rev, revogacao=True, em_bloco=em_bloco
)
- def registra_alteracao(self,
- bloco_alteracao,
- dsp_a_alterar,
- revogacao=False,
- em_bloco=False):
+ def registra_alteracao(
+ self, bloco_alteracao, dsp_a_alterar, revogacao=False, em_bloco=False
+ ):
"""
Caracteristicas:
1 - Se é um dispositivo simples e sem subsequente
@@ -2767,35 +3169,48 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
"""
data = {}
- data.update({'pk': bloco_alteracao.pk,
- 'pai': [bloco_alteracao.pk, ]})
+ data.update(
+ {
+ "pk": bloco_alteracao.pk,
+ "pai": [
+ bloco_alteracao.pk,
+ ],
+ }
+ )
if isinstance(dsp_a_alterar, list):
-
parents = map(lambda x: x.id, bloco_alteracao.get_parents())
- parents = set(map(lambda x: int(x), dsp_a_alterar)) & \
- set(parents)
+ parents = set(map(lambda x: int(x), dsp_a_alterar)) & set(parents)
if parents:
self.set_message(
- data, 'danger',
- _('Não é possível incluir em um Bloco de Alteração '
- 'um dispositivo ao qual o próprio bloco pertence!'), time=10000)
+ data,
+ "danger",
+ _(
+ "Não é possível incluir em um Bloco de Alteração "
+ "um dispositivo ao qual o próprio bloco pertence!"
+ ),
+ time=10000,
+ )
return data
dsps = Dispositivo.objects.filter(id__in=dsp_a_alterar)
dsps_ids = set()
for d in dsps:
-
if d.ta == bloco_alteracao.ta:
self.set_message(
- data, 'danger',
- _('Não é possível incluir em um Bloco de Alteração '
- 'um dispositivo do Texto Articulado ao qual o bloco '
- 'também é pertencente! '
- 'Blocos de Alteração '
- 'devem ser utilizados para registrar mudanças em '
- 'textos anteriores a este, não neste mesmo em simutâneo.'), time=20000)
+ data,
+ "danger",
+ _(
+ "Não é possível incluir em um Bloco de Alteração "
+ "um dispositivo do Texto Articulado ao qual o bloco "
+ "também é pertencente! "
+ 'Blocos de Alteração '
+ "devem ser utilizados para registrar mudanças em "
+ "textos anteriores a este, não neste mesmo em simutâneo."
+ ),
+ time=20000,
+ )
return data
ds = d
@@ -2809,58 +3224,56 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
if em_bloco:
proximo_bloco = Dispositivo.objects.filter(
- ordem__gt=ds.ordem,
- nivel__lte=ds.nivel,
- ta_id=ds.ta_id).first()
+ ordem__gt=ds.ordem, nivel__lte=ds.nivel, ta_id=ds.ta_id
+ ).first()
params = {
- 'ta_id': ds.ta_id,
- 'nivel__gte': ds.nivel,
- 'ordem__gte': ds.ordem,
- 'dispositivo_subsequente__isnull': True,
+ "ta_id": ds.ta_id,
+ "nivel__gte": ds.nivel,
+ "ordem__gte": ds.ordem,
+ "dispositivo_subsequente__isnull": True,
}
if revogacao:
params.update(
{
- 'dispositivo_de_revogacao': False,
- 'tipo_dispositivo__dispositivo_de_articulacao': False
+ "dispositivo_de_revogacao": False,
+ "tipo_dispositivo__dispositivo_de_articulacao": False,
}
-
)
if proximo_bloco:
- params['ordem__lt'] = proximo_bloco.ordem
+ params["ordem__lt"] = proximo_bloco.ordem
- bloco = Dispositivo.objects.filter(
- **params).values_list('id', 'auto_inserido')
+ bloco = Dispositivo.objects.filter(**params).values_list(
+ "id", "auto_inserido"
+ )
for id, auto in bloco:
if auto:
- dsp_pai = Dispositivo.objects.filter(
- pk=id
- ).values_list('dispositivo_pai', flat=True).first()
+ dsp_pai = (
+ Dispositivo.objects.filter(pk=id)
+ .values_list("dispositivo_pai", flat=True)
+ .first()
+ )
if dsp_pai in dsps_ids:
dsps_ids.remove(dsp_pai)
dsps_ids.add(id)
- dsps_ids = Dispositivo.objects.filter(
- id__in=dsps_ids
- ).values_list('id', flat="True").order_by('ordem')
+ dsps_ids = (
+ Dispositivo.objects.filter(id__in=dsps_ids)
+ .values_list("id", flat="True")
+ .order_by("ordem")
+ )
with transaction.atomic():
for dsp in dsps_ids:
data.update(
- self.registra_alteracao(
- bloco_alteracao,
- dsp,
- revogacao
- )
+ self.registra_alteracao(bloco_alteracao, dsp, revogacao)
)
- if 'message' in data and 'danger' in data['message']['type']:
+ if "message" in data and "danger" in data["message"]["type"]:
return data
return data
- dsp_a_alterar = Dispositivo.objects.get(
- pk=dsp_a_alterar)
+ dsp_a_alterar = Dispositivo.objects.get(pk=dsp_a_alterar)
history = dsp_a_alterar.history()
@@ -2869,26 +3282,35 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
dsp_a_alterar = d
break
- if (dsp_a_alterar.inicio_vigencia >
- bloco_alteracao.inicio_vigencia):
+ if dsp_a_alterar.inicio_vigencia > bloco_alteracao.inicio_vigencia:
self.set_message(
- data, 'danger',
- _('Não é possível alterar um Dispositivo com início de '
- 'Vigência posterior a data de Vigência do Dispositivo '
- 'Alterador!'), time=10000)
+ data,
+ "danger",
+ _(
+ "Não é possível alterar um Dispositivo com início de "
+ "Vigência posterior a data de Vigência do Dispositivo "
+ "Alterador!"
+ ),
+ time=10000,
+ )
return data
- if dsp_a_alterar.tipo_dispositivo.dispositivo_de_articulacao\
- and not revogacao:
+ if dsp_a_alterar.tipo_dispositivo.dispositivo_de_articulacao and not revogacao:
self.set_message(
- data, 'warning',
- _('Registrar alteração de um dispositivo de articulação '
- 'só é relevante para o caso de alterações de rótulo. '
- 'Se não é este o caso, a alteração deve ser específica '
- 'para o dispositivo que se quer alterar.'), modal=True)
+ data,
+ "warning",
+ _(
+ "Registrar alteração de um dispositivo de articulação "
+ "só é relevante para o caso de alterações de rótulo. "
+ "Se não é este o caso, a alteração deve ser específica "
+ "para o dispositivo que se quer alterar."
+ ),
+ modal=True,
+ )
ndp = Dispositivo.new_instance_based_on(
- dsp_a_alterar, dsp_a_alterar.tipo_dispositivo)
+ dsp_a_alterar, dsp_a_alterar.tipo_dispositivo
+ )
ndp.auto_inserido = dsp_a_alterar.auto_inserido
ndp.rotulo = dsp_a_alterar.rotulo
ndp.publicacao = bloco_alteracao.publicacao
@@ -2910,7 +3332,8 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
try:
ordem = dsp_a_alterar.criar_espaco(
- espaco_a_criar=1, local='json_add_in_with_auto')
+ espaco_a_criar=1, local="json_add_in_with_auto"
+ )
ndp.ordem = ordem
ndp.dispositivo_atualizador = bloco_alteracao
@@ -2923,19 +3346,19 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
ndp.dispositivo_subsequente = n
if n:
- ndp.fim_eficacia = n.inicio_eficacia - \
- timedelta(days=1)
- ndp.fim_vigencia = n.inicio_vigencia - \
- timedelta(days=1)
+ ndp.fim_eficacia = n.inicio_eficacia - timedelta(days=1)
+ ndp.fim_vigencia = n.inicio_vigencia - timedelta(days=1)
# Coloca o novo dispostivo no final do bloco
- dispositivos_do_bloco = \
- bloco_alteracao.dispositivos_alterados_set.order_by(
- 'ordem_bloco_atualizador')
+ dispositivos_do_bloco = bloco_alteracao.dispositivos_alterados_set.order_by(
+ "ordem_bloco_atualizador"
+ )
if dispositivos_do_bloco.exists():
- ndp.ordem_bloco_atualizador = dispositivos_do_bloco.last(
- ).ordem_bloco_atualizador + Dispositivo.INTERVALO_ORDEM
+ ndp.ordem_bloco_atualizador = (
+ dispositivos_do_bloco.last().ordem_bloco_atualizador
+ + Dispositivo.INTERVALO_ORDEM
+ )
else:
ndp.ordem_bloco_atualizador = Dispositivo.INTERVALO_ORDEM
@@ -2962,59 +3385,73 @@ class ActionsEditMixin(ActionDragAndMoveDispositivoAlteradoMixin,
# bloco_alteracao.ordenar_bloco_alteracao()
if not revogacao:
- if 'message' not in data:
+ if "message" not in data:
self.set_message(
- data, 'success',
- _('Dispositivo de Alteração adicionado com sucesso.'))
+ data,
+ "success",
+ _("Dispositivo de Alteração adicionado com sucesso."),
+ )
else:
self.set_message(
- data, 'success',
- _('Dispositivo de Revogação adicionado com sucesso.'))
+ data,
+ "success",
+ _("Dispositivo de Revogação adicionado com sucesso."),
+ )
# data.update({'pk': ndp.pk,
# 'pai': [bloco_alteracao.pk, ]})
except ValidationError as ve:
self.set_message(
- data, 'danger',
- _('O dispositivo ({} - {}) já existe neste bloco.'.format(
- ndp.tipo_dispositivo,
- ndp.get_nomenclatura_completa())), time=10000)
+ data,
+ "danger",
+ _(
+ "O dispositivo ({} - {}) já existe neste bloco.".format(
+ ndp.tipo_dispositivo, ndp.get_nomenclatura_completa()
+ )
+ ),
+ time=10000,
+ )
except Exception as e:
username = self.request.user.username
self.logger.error("user=" + username + ". " + str(e))
self.set_message(
- data, 'danger',
- _('Não é foi possível registrar sua solicitação!'), time=10000)
+ data,
+ "danger",
+ _("Não é foi possível registrar sua solicitação!"),
+ time=10000,
+ )
return data
-class DispositivoDinamicEditView(
- ActionsEditMixin, TextEditView, UpdateView):
- template_name = 'compilacao/text_edit_bloco.html'
+class DispositivoDinamicEditView(ActionsEditMixin, TextEditView, UpdateView):
+ template_name = "compilacao/text_edit_bloco.html"
model = Dispositivo
form_class = DispositivoEdicaoBasicaForm
def get_initial(self):
initial = UpdateView.get_initial(self)
- if 'action' in self.request.GET:
- initial.update({'editor_type': self.request.GET['action']})
+ if "action" in self.request.GET:
+ initial.update({"editor_type": self.request.GET["action"]})
- if self.action.startswith('get_form_'):
- if self.action.endswith('_radio_allowed_inserts'):
- initial.update({'allowed_inserts': self.allowed_inserts()})
+ if self.action.startswith("get_form_"):
+ if self.action.endswith("_radio_allowed_inserts"):
+ initial.update({"allowed_inserts": self.allowed_inserts()})
- initial.update({'texto_articulado_do_editor':
- self.kwargs['ta_id']})
+ initial.update({"texto_articulado_do_editor": self.kwargs["ta_id"]})
- initial.update({'dispositivo_search_form': reverse_lazy(
- 'sapl.compilacao:dispositivo_search_form')})
+ initial.update(
+ {
+ "dispositivo_search_form": reverse_lazy(
+ "sapl.compilacao:dispositivo_search_form"
+ )
+ }
+ )
return initial
def get_form(self, form_class=None):
-
- if self.action and self.action.startswith('get_form_'):
+ if self.action and self.action.startswith("get_form_"):
if form_class is None:
form_class = self.get_form_class()
return form_class(**self.get_form_kwargs())
@@ -3022,152 +3459,155 @@ class DispositivoDinamicEditView(
return None
def get(self, request, *args, **kwargs):
-
- if 'action' not in request.GET:
+ if "action" not in request.GET:
self.action = None
- self.template_name = 'compilacao/text_edit_bloco.html'
+ self.template_name = "compilacao/text_edit_bloco.html"
return TextEditView.get(self, request, *args, **kwargs)
- self.object = Dispositivo.objects.get(pk=self.kwargs['dispositivo_id'])
+ self.object = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
perfil_estrutural_list = self.update_perfis()
- self.template_name = 'compilacao/ajax_form.html'
- self.action = request.GET['action']
+ self.template_name = "compilacao/ajax_form.html"
+ self.action = request.GET["action"]
- if self.action.startswith('get_form_'):
- if self.action.endswith('_base'):
+ if self.action.startswith("get_form_"):
+ if self.action.endswith("_base"):
self.form_class = DispositivoEdicaoBasicaForm
- elif self.action.endswith('_alteracao'):
+ elif self.action.endswith("_alteracao"):
self.form_class = DispositivoRegistroAlteracaoForm
- elif self.action.endswith('_revogacao'):
+ elif self.action.endswith("_revogacao"):
self.form_class = DispositivoRegistroRevogacaoForm
- elif self.action.endswith('_inclusao'):
+ elif self.action.endswith("_inclusao"):
self.form_class = DispositivoRegistroInclusaoForm
context = self.get_context_data()
return self.render_to_response(context)
- elif self.action.startswith('get_actions'):
+ elif self.action.startswith("get_actions"):
self.form_class = None
- ta_id = self.kwargs['ta_id']
+ ta_id = self.kwargs["ta_id"]
context = {}
- context['object'] = self.object
+ context["object"] = self.object
- if self.action.endswith('_allowed_inserts_registro_inclusao'):
- self.template_name = ('compilacao/'
- 'ajax_actions_registro_inclusao.html')
- context['allowed_inserts'] = self.allowed_inserts()
+ if self.action.endswith("_allowed_inserts_registro_inclusao"):
+ self.template_name = "compilacao/" "ajax_actions_registro_inclusao.html"
+ context["allowed_inserts"] = self.allowed_inserts()
else:
- self.template_name = ('compilacao/'
- 'ajax_actions_dinamic_edit.html')
+ self.template_name = "compilacao/" "ajax_actions_dinamic_edit.html"
if ta_id == str(self.object.ta_id):
- context['perfil_estrutural_list'] = perfil_estrutural_list
- context['allowed_inserts'] = self.allowed_inserts()
+ context["perfil_estrutural_list"] = perfil_estrutural_list
+ context["allowed_inserts"] = self.allowed_inserts()
return self.render_to_response(context)
- elif self.action.startswith('json_'):
+ elif self.action.startswith("json_"):
context = self.get_context_data()
return self.render_to_json_response(context)
return JsonResponse({}, safe=False)
def post(self, request, *args, **kwargs):
+ d = Dispositivo.objects.get(pk=self.kwargs["dispositivo_id"])
- d = Dispositivo.objects.get(
- pk=self.kwargs['dispositivo_id'])
-
- formtype = request.POST['formtype']
- if formtype == 'get_form_alteracao':
-
+ formtype = request.POST["formtype"]
+ if formtype == "get_form_alteracao":
data = self.registra_alteracao(
- d, request.POST.getlist('dispositivo_alterado[]', []))
-
- elif formtype == 'get_form_revogacao':
+ d, request.POST.getlist("dispositivo_alterado[]", [])
+ )
+ elif formtype == "get_form_revogacao":
data = self.registra_revogacao(
d,
- request.POST.getlist('dispositivo_revogado[]', []),
- request.POST.get("revogacao_em_bloco") == "True"
+ request.POST.getlist("dispositivo_revogado[]", []),
+ request.POST.get("revogacao_em_bloco") == "True",
)
- if formtype == 'get_form_inclusao':
-
+ if formtype == "get_form_inclusao":
dispositivo_base_para_inclusao = Dispositivo.objects.get(
- pk=request.POST['dispositivo_base_para_inclusao'])
+ pk=request.POST["dispositivo_base_para_inclusao"]
+ )
data = self.registra_inclusao(d, dispositivo_base_para_inclusao)
- elif formtype == 'get_form_base':
- texto = request.POST['texto'].strip()
- texto_atualizador = request.POST['texto_atualizador'].strip()
- texto_atualizador = texto_atualizador \
- if texto != texto_atualizador else ''
- visibilidade = request.POST['visibilidade']
+ elif formtype == "get_form_base":
+ texto = request.POST["texto"].strip()
+ texto_atualizador = request.POST["texto_atualizador"].strip()
+ texto_atualizador = texto_atualizador if texto != texto_atualizador else ""
+ visibilidade = request.POST["visibilidade"]
d_texto = d.texto
d.texto = texto.strip()
d.texto_atualizador = texto_atualizador.strip()
- d.visibilidade = not visibilidade or visibilidade == 'True'
+ d.visibilidade = not visibilidade or visibilidade == "True"
d.save()
- if texto != '' and d.ta_id == int(self.kwargs['ta_id']):
+ if texto != "" and d.ta_id == int(self.kwargs["ta_id"]):
dnext = Dispositivo.objects.filter(
ta_id=d.ta_id,
ordem__gt=d.ordem,
- texto='',
- tipo_dispositivo__dispositivo_de_articulacao=False)[:1]
+ texto="",
+ tipo_dispositivo__dispositivo_de_articulacao=False,
+ )[:1]
if not dnext.exists():
dnext = []
dnext.append(d)
- pais = [d.dispositivo_pai_id, ]
+ pais = [
+ d.dispositivo_pai_id,
+ ]
else:
-
if dnext[0].nivel > d.nivel:
- pais = [d.pk, ]
+ pais = [
+ d.pk,
+ ]
else:
if dnext[0].dispositivo_pai_id == d.dispositivo_pai_id:
- pais = [dnext[0].dispositivo_pai_id, ]
- else:
pais = [
dnext[0].dispositivo_pai_id,
- d.dispositivo_pai_id]
+ ]
+ else:
+ pais = [dnext[0].dispositivo_pai_id, d.dispositivo_pai_id]
- data = {'pk': dnext[0].pk
- if not d_texto else 0, 'pai': pais}
- elif d.ta_id != int(self.kwargs['ta_id']):
- data = {'pk': 0,
- 'pai': [d.dispositivo_atualizador_id, ]}
+ data = {"pk": dnext[0].pk if not d_texto else 0, "pai": pais}
+ elif d.ta_id != int(self.kwargs["ta_id"]):
+ data = {
+ "pk": 0,
+ "pai": [
+ d.dispositivo_atualizador_id,
+ ],
+ }
else:
- data = {'pk': d.pk
- if not d_texto or not d.texto else 0, 'pai': [d.pk, ]}
+ data = {
+ "pk": d.pk if not d_texto or not d.texto else 0,
+ "pai": [
+ d.pk,
+ ],
+ }
- self.set_message(data, 'success',
- _('Dispositivo alterado com sucesso.'))
+ self.set_message(data, "success", _("Dispositivo alterado com sucesso."))
return JsonResponse(data, safe=False)
class DispositivoSearchFragmentFormView(ListView):
- template_name = 'compilacao/dispositivo_form_search_fragment.html'
+ template_name = "compilacao/dispositivo_form_search_fragment.html"
logger = logging.getLogger(__name__)
def get(self, request, *args, **kwargs):
-
- if 'action' in request.GET and request.GET['action'] == 'get_tipos':
+ if "action" in request.GET and request.GET["action"] == "get_tipos":
result = choice_model_type_foreignkey_in_extenal_views(
- id_tipo_ta=request.GET['tipo_ta'])
+ id_tipo_ta=request.GET["tipo_ta"]
+ )
itens = []
for i in result:
item = {}
- item[i[0] if i[0] else ''] = str(i[1])
+ item[i[0] if i[0] else ""] = str(i[1])
itens.append(item)
return JsonResponse(itens, safe=False)
@@ -3177,17 +3617,17 @@ class DispositivoSearchFragmentFormView(ListView):
result = []
try:
- tipo_model = self.request.GET.get('tipo_model', '')
- limit = int(self.request.GET.get('max_results', 100))
- tipo_ta = self.request.GET.get('tipo_ta', '')
- num_ta = self.request.GET.get('num_ta', '')
- ano_ta = self.request.GET.get('ano_ta', '')
- rotulo = self.request.GET.get('rotulo', '')
- str_texto = self.request.GET.get('texto', '')
- texto = str_texto.split(' ')
-
- tipo_resultado = self.request.GET.get('tipo_resultado', '')
- tipo_resultado = '' if tipo_resultado == 'False' else tipo_resultado
+ tipo_model = self.request.GET.get("tipo_model", "")
+ limit = int(self.request.GET.get("max_results", 100))
+ tipo_ta = self.request.GET.get("tipo_ta", "")
+ num_ta = self.request.GET.get("num_ta", "")
+ ano_ta = self.request.GET.get("ano_ta", "")
+ rotulo = self.request.GET.get("rotulo", "")
+ str_texto = self.request.GET.get("texto", "")
+ texto = str_texto.split(" ")
+
+ tipo_resultado = self.request.GET.get("tipo_resultado", "")
+ tipo_resultado = "" if tipo_resultado == "False" else tipo_resultado
model_class = None
@@ -3197,65 +3637,68 @@ class DispositivoSearchFragmentFormView(ListView):
if tipo_ta and tipo_model:
integrations_view_names = get_integrations_view_names()
for item in integrations_view_names:
- if hasattr(item, 'model_type_foreignkey') and\
- hasattr(item, 'model'):
- if (tipo_ta.content_type.model ==
- item.model.__name__.lower() and
- tipo_ta.content_type.app_label ==
- item.model._meta.app_label):
-
+ if hasattr(item, "model_type_foreignkey") and hasattr(
+ item, "model"
+ ):
+ if (
+ tipo_ta.content_type.model == item.model.__name__.lower()
+ and tipo_ta.content_type.app_label
+ == item.model._meta.app_label
+ ):
model_class = item.model
model_type_class = item.model_type_foreignkey
tipo_model = item.model_type_foreignkey.objects.get(
- pk=tipo_model)
+ pk=tipo_model
+ )
break
- column_field = ''
+ column_field = ""
if model_class:
for field in model_class._meta.fields:
if field.related_model == model_type_class:
column_field = field.column
break
- dts = self.request.GET.get('data_type_selection', '')
- df = self.request.GET.get('data_function', '')
+ dts = self.request.GET.get("data_type_selection", "")
+ df = self.request.GET.get("data_function", "")
- AND_CONTROLS = ''
- if dts == 'checkbox':
- AND_CONTROLS = 'AND td.dispositivo_de_alteracao = false'
+ AND_CONTROLS = ""
+ if dts == "checkbox":
+ AND_CONTROLS = "AND td.dispositivo_de_alteracao = false"
else:
- if df == 'alterador':
- AND_CONTROLS = '''AND td.dispositivo_de_alteracao = true
- AND td.dispositivo_de_articulacao = true'''
+ if df == "alterador":
+ AND_CONTROLS = """AND td.dispositivo_de_alteracao = true
+ AND td.dispositivo_de_articulacao = true"""
texto = list(map("d.texto ~* '{}'".format, texto))
- AND_TEXTO_ROTULO = ''
+ AND_TEXTO_ROTULO = ""
if str_texto and rotulo:
- AND_TEXTO_ROTULO = '''AND ( ({BUSCA_TEXTO} AND d.rotulo ~* '{BUSCA_ROTULO}') OR
+ AND_TEXTO_ROTULO = """AND ( ({BUSCA_TEXTO} AND d.rotulo ~* '{BUSCA_ROTULO}') OR
({BUSCA_TEXTO} AND d.rotulo = '' AND dp.rotulo ~* '{BUSCA_ROTULO}')
- )'''.format(
- BUSCA_TEXTO=' AND '.join(texto),
- BUSCA_ROTULO=rotulo
+ )""".format(
+ BUSCA_TEXTO=" AND ".join(texto), BUSCA_ROTULO=rotulo
)
elif str_texto:
- AND_TEXTO_ROTULO = ' AND %s' % ' AND '.join(texto)
+ AND_TEXTO_ROTULO = " AND %s" % " AND ".join(texto)
elif rotulo:
AND_TEXTO_ROTULO = "AND d.rotulo ~* '{BUSCA_ROTULO}'".format(
- BUSCA_ROTULO=rotulo)
+ BUSCA_ROTULO=rotulo
+ )
else:
- AND_TEXTO_ROTULO = ''
+ AND_TEXTO_ROTULO = ""
- jtms = '' # JOIN_TYPE_MODEL_SELECTED
- atms = '' # AND_TYPE_MODEL_SELECTED
+ jtms = "" # JOIN_TYPE_MODEL_SELECTED
+ atms = "" # AND_TYPE_MODEL_SELECTED
if tipo_model:
- jtms = 'JOIN {gfk_table} gfkt on (gfkt.id = ta.object_id)'.format(
- gfk_table=model_class._meta.db_table)
- atms = 'AND gfkt.{gfk_field_type} = {gfk_field_type_id}'.format(
+ jtms = "JOIN {gfk_table} gfkt on (gfkt.id = ta.object_id)".format(
+ gfk_table=model_class._meta.db_table
+ )
+ atms = "AND gfkt.{gfk_field_type} = {gfk_field_type_id}".format(
gfk_field_type=column_field,
gfk_field_type_id=tipo_model.id,
)
- sql = '''
+ sql = """
SELECT d.* FROM compilacao_dispositivo d
JOIN compilacao_dispositivo dp on (d.dispositivo_pai_id = dp.id)
JOIN compilacao_tipodispositivo td on (d.tipo_dispositivo_id = td.id)
@@ -3278,24 +3721,17 @@ class DispositivoSearchFragmentFormView(ListView):
ta.id desc,
d.ordem
{limit};
- '''.format(
-
- limit='limit {}'.format(limit) if limit else '',
-
+ """.format(
+ limit="limit {}".format(limit) if limit else "",
JOIN_TYPE_MODEL_SELECTED=jtms,
AND_TYPE_MODEL_SELECTED=atms,
-
- AND3_TIPO_TA="AND ta.tipo_ta_id = {}".format(
- tipo_ta.id) if tipo_ta else '',
-
- AND2_ANO="AND ta.ano = {}".format(
- ano_ta) if ano_ta else '',
-
- AND1_NUMERO="AND ta.numero ~* '{}'".format(
- num_ta) if num_ta else '',
-
- AND_TEXTO_ROTULO=AND_TEXTO_ROTULO if AND_TEXTO_ROTULO else '',
- AND_CONTROLS=AND_CONTROLS if AND_CONTROLS else ''
+ AND3_TIPO_TA="AND ta.tipo_ta_id = {}".format(tipo_ta.id)
+ if tipo_ta
+ else "",
+ AND2_ANO="AND ta.ano = {}".format(ano_ta) if ano_ta else "",
+ AND1_NUMERO="AND ta.numero ~* '{}'".format(num_ta) if num_ta else "",
+ AND_TEXTO_ROTULO=AND_TEXTO_ROTULO if AND_TEXTO_ROTULO else "",
+ AND_CONTROLS=AND_CONTROLS if AND_CONTROLS else "",
)
result = Dispositivo.objects.raw(sql)
@@ -3304,30 +3740,29 @@ class DispositivoSearchFragmentFormView(ListView):
ids = set()
def proc_dispositivos(ds):
-
for d in ds:
-
if d.id not in ids:
r.append(d)
ids.add(d.id)
- if tipo_resultado == 'I':
+ if tipo_resultado == "I":
if ds != result:
d.I = True
- proc_dispositivos(d.dispositivos_filhos_set.filter(
- tipo_dispositivo__dispositivo_de_alteracao=False
- ))
- elif tipo_resultado == 'S' and ds == result:
-
+ proc_dispositivos(
+ d.dispositivos_filhos_set.filter(
+ tipo_dispositivo__dispositivo_de_alteracao=False
+ )
+ )
+ elif tipo_resultado == "S" and ds == result:
seq = Dispositivo.objects.filter(
ta=d.ta,
ordem__gt=d.ordem,
nivel__gt=0,
- tipo_dispositivo__dispositivo_de_alteracao=False
+ tipo_dispositivo__dispositivo_de_alteracao=False,
)
proc_dispositivos(seq[:limit])
- elif tipo_resultado == 'S':
+ elif tipo_resultado == "S":
d.S = True
proc_dispositivos(result)
@@ -3342,46 +3777,49 @@ class DispositivoSearchFragmentFormView(ListView):
class DispositivoSearchModalView(FormView):
- template_name = 'compilacao/dispositivo_form_search.html'
+ template_name = "compilacao/dispositivo_form_search.html"
form_class = DispositivoSearchModalForm
class DispositivoEdicaoBasicaView(CompMixin, FormMessagesMixin, UpdateView):
model = Dispositivo
- template_name = 'compilacao/dispositivo_form_edicao_basica.html'
+ template_name = "compilacao/dispositivo_form_edicao_basica.html"
form_class = DispositivoEdicaoBasicaForm
- form_valid_message = _('Alterações no Dispositivo realizadas com sucesso!')
- form_invalid_message = _('Houve erro em registrar '
- 'as alterações no Dispositivo')
+ form_valid_message = _("Alterações no Dispositivo realizadas com sucesso!")
+ form_invalid_message = _("Houve erro em registrar " "as alterações no Dispositivo")
- permission_required = 'compilacao.change_dispositivo_edicao_avancada'
+ permission_required = "compilacao.change_dispositivo_edicao_avancada"
logger = logging.getLogger(__name__)
@property
def cancel_url(self):
- return reverse_lazy(
- 'sapl.compilacao:ta_text_edit',
- kwargs={'ta_id': self.kwargs['ta_id']}) + '#' + str(self.object.pk)
+ return (
+ reverse_lazy(
+ "sapl.compilacao:ta_text_edit", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
+ + "#"
+ + str(self.object.pk)
+ )
def get_success_url(self):
return reverse_lazy(
- 'sapl.compilacao:dispositivo_edit',
- kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
+ "sapl.compilacao:dispositivo_edit",
+ kwargs={"ta_id": self.kwargs["ta_id"], "pk": self.kwargs["pk"]},
+ )
def get_url_this_view(self):
- return 'sapl.compilacao:dispositivo_edit'
+ return "sapl.compilacao:dispositivo_edit"
def run_actions(self, request):
- if 'action' in request.GET and\
- request.GET['action'] == 'atualiza_rotulo':
+ if "action" in request.GET and request.GET["action"] == "atualiza_rotulo":
try:
- d = Dispositivo.objects.get(pk=self.kwargs['pk'])
- d.dispositivo0 = int(request.GET['dispositivo0'])
- d.dispositivo1 = int(request.GET['dispositivo1'])
- d.dispositivo2 = int(request.GET['dispositivo2'])
- d.dispositivo3 = int(request.GET['dispositivo3'])
- d.dispositivo4 = int(request.GET['dispositivo4'])
- d.dispositivo5 = int(request.GET['dispositivo5'])
+ d = Dispositivo.objects.get(pk=self.kwargs["pk"])
+ d.dispositivo0 = int(request.GET["dispositivo0"])
+ d.dispositivo1 = int(request.GET["dispositivo1"])
+ d.dispositivo2 = int(request.GET["dispositivo2"])
+ d.dispositivo3 = int(request.GET["dispositivo3"])
+ d.dispositivo4 = int(request.GET["dispositivo4"])
+ d.dispositivo5 = int(request.GET["dispositivo5"])
d.rotulo = d.rotulo_padrao()
numero = d.get_numero_completo()[1:]
@@ -3395,28 +3833,41 @@ class DispositivoEdicaoBasicaView(CompMixin, FormMessagesMixin, UpdateView):
numero[i] = 0
if zerar:
- d.set_numero_completo([d.dispositivo0, ] + numero)
+ d.set_numero_completo(
+ [
+ d.dispositivo0,
+ ]
+ + numero
+ )
d.rotulo = d.rotulo_padrao()
except Exception as e:
username = self.request.user.username
self.logger.error(
- "user=" + username + ". Ocorreu erro ({}) na atualização do rótulo.".format(str(e)))
- return True, JsonResponse({'message': str(
- _('Ocorreu erro na atualização do rótulo'))}, safe=False)
- return True, JsonResponse({
- 'rotulo': d.rotulo,
- 'dispositivo0': d.dispositivo0,
- 'dispositivo1': d.dispositivo1,
- 'dispositivo2': d.dispositivo2,
- 'dispositivo3': d.dispositivo3,
- 'dispositivo4': d.dispositivo4,
- 'dispositivo5': d.dispositivo5}, safe=False)
-
- return False, ''
+ "user="
+ + username
+ + ". Ocorreu erro ({}) na atualização do rótulo.".format(str(e))
+ )
+ return True, JsonResponse(
+ {"message": str(_("Ocorreu erro na atualização do rótulo"))},
+ safe=False,
+ )
+ return True, JsonResponse(
+ {
+ "rotulo": d.rotulo,
+ "dispositivo0": d.dispositivo0,
+ "dispositivo1": d.dispositivo1,
+ "dispositivo2": d.dispositivo2,
+ "dispositivo3": d.dispositivo3,
+ "dispositivo4": d.dispositivo4,
+ "dispositivo5": d.dispositivo5,
+ },
+ safe=False,
+ )
- def get(self, request, *args, **kwargs):
+ return False, ""
+ def get(self, request, *args, **kwargs):
flag_action, render_json_response = self.run_actions(request)
if flag_action:
return render_json_response
@@ -3426,77 +3877,89 @@ class DispositivoEdicaoBasicaView(CompMixin, FormMessagesMixin, UpdateView):
class DispositivoEdicaoVigenciaView(CompMixin, FormMessagesMixin, UpdateView):
model = Dispositivo
- template_name = 'compilacao/dispositivo_form_vigencia.html'
+ template_name = "compilacao/dispositivo_form_vigencia.html"
form_class = DispositivoEdicaoVigenciaForm
- form_valid_message = _('Alterações no Dispositivo realizadas com sucesso!')
- form_invalid_message = _('Houve erro em registrar '
- 'as alterações no Dispositivo')
+ form_valid_message = _("Alterações no Dispositivo realizadas com sucesso!")
+ form_invalid_message = _("Houve erro em registrar " "as alterações no Dispositivo")
- permission_required = 'compilacao.change_dispositivo_edicao_avancada'
+ permission_required = "compilacao.change_dispositivo_edicao_avancada"
@property
def cancel_url(self):
- return reverse_lazy(
- 'sapl.compilacao:ta_text_edit',
- kwargs={'ta_id': self.kwargs['ta_id']}) + '#' + str(self.object.pk)
+ return (
+ reverse_lazy(
+ "sapl.compilacao:ta_text_edit", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
+ + "#"
+ + str(self.object.pk)
+ )
def get_url_this_view(self):
- return 'sapl.compilacao:dispositivo_edit_vigencia'
+ return "sapl.compilacao:dispositivo_edit_vigencia"
def get_success_url(self):
return reverse_lazy(
- 'sapl.compilacao:dispositivo_edit_vigencia',
- kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
+ "sapl.compilacao:dispositivo_edit_vigencia",
+ kwargs={"ta_id": self.kwargs["ta_id"], "pk": self.kwargs["pk"]},
+ )
class DispositivoDefinidorVigenciaView(CompMixin, FormMessagesMixin, FormView):
model = Dispositivo
- template_name = 'compilacao/dispositivo_form_definidor_vigencia.html'
+ template_name = "compilacao/dispositivo_form_definidor_vigencia.html"
form_class = DispositivoDefinidorVigenciaForm
- form_valid_message = _('Alterações no Dispositivo realizadas com sucesso!')
- form_invalid_message = _('Houve erro em registrar '
- 'as alterações no Dispositivo')
+ form_valid_message = _("Alterações no Dispositivo realizadas com sucesso!")
+ form_invalid_message = _("Houve erro em registrar " "as alterações no Dispositivo")
- permission_required = ('compilacao.change_dispositivo_edicao_avancada',
- 'compilacao.change_dispositivo_de_vigencia_global')
+ permission_required = (
+ "compilacao.change_dispositivo_edicao_avancada",
+ "compilacao.change_dispositivo_de_vigencia_global",
+ )
logger = logging.getLogger(__name__)
def get_form_kwargs(self):
kwargs = FormView.get_form_kwargs(self)
- kwargs.update({
- 'pk': self.kwargs['pk'],
- })
+ kwargs.update(
+ {
+ "pk": self.kwargs["pk"],
+ }
+ )
return kwargs
@property
def cancel_url(self):
- return reverse_lazy(
- 'sapl.compilacao:ta_text_edit',
- kwargs={'ta_id': self.kwargs['ta_id']}) + '#' + str(self.object.pk)
+ return (
+ reverse_lazy(
+ "sapl.compilacao:ta_text_edit", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
+ + "#"
+ + str(self.object.pk)
+ )
def get_url_this_view(self):
- return 'sapl.compilacao:dispositivo_edit_definidor_vigencia'
+ return "sapl.compilacao:dispositivo_edit_definidor_vigencia"
def get_success_url(self):
return reverse_lazy(
- 'sapl.compilacao:dispositivo_edit_definidor_vigencia',
- kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
+ "sapl.compilacao:dispositivo_edit_definidor_vigencia",
+ kwargs={"ta_id": self.kwargs["ta_id"], "pk": self.kwargs["pk"]},
+ )
def get(self, request, *args, **kwargs):
- self.object = get_object_or_404(Dispositivo, pk=kwargs['pk'])
+ self.object = get_object_or_404(Dispositivo, pk=kwargs["pk"])
return FormView.get(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = FormView.get_context_data(self, **kwargs)
- context.update({'object': self.object})
+ context.update({"object": self.object})
return context
def post(self, request, *args, **kwargs):
- self.object = get_object_or_404(Dispositivo, pk=kwargs['pk'])
+ self.object = get_object_or_404(Dispositivo, pk=kwargs["pk"])
form = self.get_form()
if form.is_valid():
- dvs = form.cleaned_data['dispositivo_vigencia']
+ dvs = form.cleaned_data["dispositivo_vigencia"]
try:
with transaction.atomic():
self.object.dispositivos_vigencias_set.clear()
@@ -3514,31 +3977,35 @@ class DispositivoDefinidorVigenciaView(CompMixin, FormMessagesMixin, FormView):
class DispositivoEdicaoAlteracaoView(CompMixin, FormMessagesMixin, UpdateView):
model = Dispositivo
- template_name = 'compilacao/dispositivo_form_alteracao.html'
+ template_name = "compilacao/dispositivo_form_alteracao.html"
form_class = DispositivoEdicaoAlteracaoForm
- form_valid_message = _('Alterações no Dispositivo realizadas com sucesso!')
- form_invalid_message = _('Houve erro em registrar '
- 'as alterações no Dispositivo')
+ form_valid_message = _("Alterações no Dispositivo realizadas com sucesso!")
+ form_invalid_message = _("Houve erro em registrar " "as alterações no Dispositivo")
- permission_required = 'compilacao.change_dispositivo_registros_compilacao'
+ permission_required = "compilacao.change_dispositivo_registros_compilacao"
logger = logging.getLogger(__name__)
@property
def cancel_url(self):
- return reverse_lazy(
- 'sapl.compilacao:ta_text_edit',
- kwargs={'ta_id': self.kwargs['ta_id']}) + '#' + str(self.object.pk)
+ return (
+ reverse_lazy(
+ "sapl.compilacao:ta_text_edit", kwargs={"ta_id": self.kwargs["ta_id"]}
+ )
+ + "#"
+ + str(self.object.pk)
+ )
def get_url_this_view(self):
- return 'sapl.compilacao:dispositivo_edit_alteracao'
+ return "sapl.compilacao:dispositivo_edit_alteracao"
def get_success_url(self):
return reverse_lazy(
- 'sapl.compilacao:dispositivo_edit_alteracao',
- kwargs={'ta_id': self.kwargs['ta_id'], 'pk': self.kwargs['pk']})
+ "sapl.compilacao:dispositivo_edit_alteracao",
+ kwargs={"ta_id": self.kwargs["ta_id"], "pk": self.kwargs["pk"]},
+ )
def post(self, request, *args, **kwargs):
- self.object = get_object_or_404(Dispositivo, pk=kwargs['pk'])
+ self.object = get_object_or_404(Dispositivo, pk=kwargs["pk"])
form = self.get_form()
if form.is_valid():
@@ -3554,57 +4021,56 @@ class DispositivoEdicaoAlteracaoView(CompMixin, FormMessagesMixin, UpdateView):
class TextNotificacoesView(CompMixin, ListView, FormView):
- template_name = 'compilacao/text_notificacoes.html'
+ template_name = "compilacao/text_notificacoes.html"
form_class = TextNotificacoesForm
- permission_required = 'compilacao.view_dispositivo_notificacoes'
+ permission_required = "compilacao.view_dispositivo_notificacoes"
def get(self, request, *args, **kwargs):
- self.object = TextoArticulado.objects.get(pk=self.kwargs['ta_id'])
+ self.object = TextoArticulado.objects.get(pk=self.kwargs["ta_id"])
return super(TextNotificacoesView, self).get(request, *args, **kwargs)
def post(self, request, *args, **kwargs):
- self.object = TextoArticulado.objects.get(pk=self.kwargs['ta_id'])
+ self.object = TextoArticulado.objects.get(pk=self.kwargs["ta_id"])
return FormView.post(self, request, *args, **kwargs)
def get_context_data(self, **kwargs):
- if 'object' not in kwargs:
- kwargs['object'] = self.object
+ if "object" not in kwargs:
+ kwargs["object"] = self.object
return ListView.get_context_data(self, **kwargs)
def get_success_url(self):
- return reverse_lazy('sapl.compilacao:ta_text_notificacoes',
- kwargs=self.kwargs)
+ return reverse_lazy("sapl.compilacao:ta_text_notificacoes", kwargs=self.kwargs)
def get_initial(self):
initial = {}
- if self.request.method == 'POST':
- if 'type_notificacoes' in self.request.POST:
- self.request.session[
- 'type_notificacoes'] = self.request.POST.getlist(
- 'type_notificacoes')
+ if self.request.method == "POST":
+ if "type_notificacoes" in self.request.POST:
+ self.request.session["type_notificacoes"] = self.request.POST.getlist(
+ "type_notificacoes"
+ )
else:
- self.request.session['type_notificacoes'] = []
- elif 'type_notificacoes' in self.request.session:
- initial['type_notificacoes'] = self.request.session[
- 'type_notificacoes']
+ self.request.session["type_notificacoes"] = []
+ elif "type_notificacoes" in self.request.session:
+ initial["type_notificacoes"] = self.request.session["type_notificacoes"]
else:
- initial['type_notificacoes'] = []
+ initial["type_notificacoes"] = []
return initial
def get_queryset(self):
-
- result = Dispositivo.objects.filter(
- ta_id=self.kwargs['ta_id']
- ).select_related(*DISPOSITIVO_SELECT_RELATED)
+ result = Dispositivo.objects.filter(ta_id=self.kwargs["ta_id"]).select_related(
+ *DISPOSITIVO_SELECT_RELATED
+ )
type_notificacoes = []
- if 'type_notificacoes' in self.request.session:
- type_notificacoes = self.request.session['type_notificacoes']
+ if "type_notificacoes" in self.request.session:
+ type_notificacoes = self.request.session["type_notificacoes"]
if type_notificacoes and not isinstance(type_notificacoes, list):
- type_notificacoes = [type_notificacoes, ]
+ type_notificacoes = [
+ type_notificacoes,
+ ]
return self.get_notificacoes(result, type_notificacoes)
diff --git a/sapl/context_processors.py b/sapl/context_processors.py
index 352326a6b..c08f4af13 100644
--- a/sapl/context_processors.py
+++ b/sapl/context_processors.py
@@ -2,13 +2,16 @@ import logging
from django.utils.translation import gettext_lazy as _
-from sapl.utils import google_recaptcha_configured as \
- google_recaptcha_configured_utils, sapn_is_enabled, cached_call, get_base_url
+from sapl.utils import cached_call, get_base_url
+from sapl.utils import \
+ google_recaptcha_configured as google_recaptcha_configured_utils
from sapl.utils import mail_service_configured as mail_service_configured_utils
+from sapl.utils import sapn_is_enabled
def parliament_info(request):
from sapl.base.views import get_casalegislativa
+
casa = get_casalegislativa()
if casa:
return casa.__dict__
@@ -19,32 +22,37 @@ def parliament_info(request):
def mail_service_configured(request):
if not mail_service_configured_utils(request):
logger = logging.getLogger(__name__)
- logger.warning(_('Servidor de email não configurado.'))
- return {'mail_service_configured': False}
- return {'mail_service_configured': True}
+ logger.warning(_("Servidor de email não configurado."))
+ return {"mail_service_configured": False}
+ return {"mail_service_configured": True}
def google_recaptcha_configured(request):
if not google_recaptcha_configured_utils():
logger = logging.getLogger(__name__)
- logger.warning(_('Google Recaptcha não configurado.'))
- return {'google_recaptcha_configured': False}
- return {'google_recaptcha_configured': True}
+ logger.warning(_("Google Recaptcha não configurado."))
+ return {"google_recaptcha_configured": False}
+ return {"google_recaptcha_configured": True}
@cached_call("site-title", timeout=60 * 2)
def enable_sapn(request):
- verbose_name = _('Sistema de Apoio ao Processo Legislativo') \
- if not sapn_is_enabled() \
- else _('Sistema de Apoio à Publicação de Leis e Normas')
+ verbose_name = (
+ _("Sistema de Apoio ao Processo Legislativo")
+ if not sapn_is_enabled()
+ else _("Sistema de Apoio à Publicação de Leis e Normas")
+ )
from sapl.base.models import CasaLegislativa
+
casa_legislativa = CasaLegislativa.objects.first()
- nome_casa = casa_legislativa.nome if casa_legislativa and casa_legislativa.nome else ''
+ nome_casa = (
+ casa_legislativa.nome if casa_legislativa and casa_legislativa.nome else ""
+ )
return {
- 'sapl_as_sapn': sapn_is_enabled(),
- 'nome_sistema': verbose_name,
- 'nome_casa': nome_casa,
- 'base_url': get_base_url(request),
+ "sapl_as_sapn": sapn_is_enabled(),
+ "nome_sistema": verbose_name,
+ "nome_casa": nome_casa,
+ "base_url": get_base_url(request),
}
diff --git a/sapl/crispy_layout_mixin.py b/sapl/crispy_layout_mixin.py
index 9f003f3f1..3e04dab30 100644
--- a/sapl/crispy_layout_mixin.py
+++ b/sapl/crispy_layout_mixin.py
@@ -1,5 +1,6 @@
from math import ceil
+import yaml
from crispy_forms.bootstrap import FormActions
from crispy_forms.helper import FormHelper
from crispy_forms.layout import HTML, Div, Fieldset, Layout, Submit
@@ -9,7 +10,6 @@ from django.urls import reverse, reverse_lazy
from django.utils import formats
from django.utils.encoding import force_str
from django.utils.translation import gettext as _
-import yaml
def heads_and_tails(list_of_lists):
@@ -19,11 +19,11 @@ def heads_and_tails(list_of_lists):
def to_column(name_span):
fieldname, span = name_span
- return Div(fieldname, css_class='col-md-%d' % span)
+ return Div(fieldname, css_class="col-md-%d" % span)
def to_row(names_spans):
- return Div(*map(to_column, names_spans), css_class='row')
+ return Div(*map(to_column, names_spans), css_class="row")
def to_fieldsets(fields):
@@ -36,21 +36,28 @@ def to_fieldsets(fields):
yield field
-def form_actions(more=[Div(css_class='clearfix')],
- label=_('Salvar'), name='salvar',
- css_class='float-right', disabled=True):
-
- if disabled and force_str(label) != 'Pesquisar':
- doubleclick = 'this.form.submit();this.disabled=true;'
+def form_actions(
+ more=[Div(css_class="clearfix")],
+ label=_("Salvar"),
+ name="salvar",
+ css_class="float-right",
+ disabled=True,
+):
+ if disabled and force_str(label) != "Pesquisar":
+ doubleclick = "this.form.submit();this.disabled=true;"
else:
- doubleclick = 'return true;'
+ doubleclick = "return true;"
return FormActions(
*more,
- Submit(name, label, css_class=css_class,
- # para impedir resubmissão do form
- onclick=doubleclick),
- css_class='form-group row justify-content-between'
+ Submit(
+ name,
+ label,
+ css_class=css_class,
+ # para impedir resubmissão do form
+ onclick=doubleclick,
+ ),
+ css_class="form-group row justify-content-between",
)
@@ -85,16 +92,22 @@ class SaplFormHelper(FormHelper):
class SaplFormLayout(Layout):
-
- def __init__(self, *fields, cancel_label=_('Cancelar'),
- save_label=_('Salvar'), actions=None):
-
+ def __init__(
+ self, *fields, cancel_label=_("Cancelar"), save_label=_("Salvar"), actions=None
+ ):
buttons = actions
if not buttons:
- buttons = form_actions(label=save_label, more=[
- HTML('%s' % cancel_label)
- if cancel_label else None])
+ buttons = form_actions(
+ label=save_label,
+ more=[
+ HTML(
+ '%s' % cancel_label
+ )
+ if cancel_label
+ else None
+ ],
+ )
_fields = list(to_fieldsets(fields))
if buttons:
@@ -103,26 +116,25 @@ class SaplFormLayout(Layout):
def get_field_display(obj, fieldname):
- field = ''
+ field = ""
try:
field = obj._meta.get_field(fieldname)
except Exception as e:
- """ nos casos que o fieldname não é um field_model,
- ele pode ser um aggregate, annotate, um property, um manager,
- ou mesmo uma método no model.
+ """nos casos que o fieldname não é um field_model,
+ ele pode ser um aggregate, annotate, um property, um manager,
+ ou mesmo uma método no model.
"""
value = getattr(obj, fieldname)
try:
verbose_name = value.model._meta.verbose_name
except AttributeError:
- verbose_name = ''
+ verbose_name = ""
else:
- verbose_name = str(field.verbose_name)\
- if hasattr(field, 'verbose_name') else ''
+ verbose_name = str(field.verbose_name) if hasattr(field, "verbose_name") else ""
- if hasattr(field, 'choices') and field.choices:
- value = getattr(obj, 'get_%s_display' % fieldname)()
+ if hasattr(field, "choices") and field.choices:
+ value = getattr(obj, "get_%s_display" % fieldname)()
else:
value = getattr(obj, fieldname)
@@ -130,95 +142,100 @@ def get_field_display(obj, fieldname):
str_type_from_field = str(type(field))
if value is None:
- display = ''
- elif '.date' in str_type_from_value:
+ display = ""
+ elif ".date" in str_type_from_value:
display = formats.date_format(value, "SHORT_DATE_FORMAT")
- elif 'bool' in str_type_from_value:
- display = _('Sim') if value else _('Não')
- elif 'ImageFieldFile' in str(type(value)):
+ elif "bool" in str_type_from_value:
+ display = _("Sim") if value else _("Não")
+ elif "ImageFieldFile" in str(type(value)):
if value:
display = ''.format(value.url)
else:
- display = ''
- elif 'FieldFile' in str_type_from_value:
+ display = ""
+ elif "FieldFile" in str_type_from_value:
if value:
display = '{}'.format(
- value.url,
- value.name.split('/')[-1:][0])
+ value.url, value.name.split("/")[-1:][0]
+ )
else:
- display = ''
- elif 'ManyRelatedManager' in str_type_from_value\
- or 'RelatedManager' in str_type_from_value\
- or 'GenericRelatedObjectManager' in str_type_from_value:
- display = '
'
+ display = ""
+ elif (
+ "ManyRelatedManager" in str_type_from_value
+ or "RelatedManager" in str_type_from_value
+ or "GenericRelatedObjectManager" in str_type_from_value
+ ):
+ display = "
''' % (
- reverse('sapl.sessao:sessaoplenaria_detail',
- kwargs={'pk': v.id}),
- v.__str__()))
- logger.info('user=' + username + '. Existe mais de uma votações aberta. Elas se encontram '
- 'nas seguintes Sessões: ' + ', '.join(msg_abertas) + '. '
- 'Para votar, peça para que o Operador feche-as.')
- msg = _('Existe mais de uma votações aberta. Elas se encontram '
- 'nas seguintes Sessões: ' + ', '.join(msg_abertas) + '. '
- 'Para votar, peça para que o Operador feche-as.')
+ msg_abertas.append(
+ """
''' % (
- reverse('sapl.sessao:sessaoplenaria_detail',
- kwargs={'pk': votacoes_abertas.first().id}),
- votacoes_abertas.first().__str__())) +
- 'Para votar, peça para que o Operador as feche.')
+ logger.info(
+ "user="
+ + username
+ + ". Existe mais de uma votação aberta na Sessão: "
+ + (
+ """