Commit ed575f7e authored by Mathieu Rodic's avatar Mathieu Rodic

[BUG] corrected login bug

(`ValueError` when login/password is wrong)
parent 8149f0a9
from gargantext.util.db import *
from gargantext.constants import INDEXED_HYPERDATA
from .nodes import Node
import datetime
__all__ = ['NodeHyperdata']
class classproperty(object):
"""See: http://stackoverflow.com/a/3203659/734335
"""
def __init__(self, getter):
self.getter = getter
def __get__(self, instance, owner):
return self.getter(owner)
class HyperdataValueComparer(object):
"""This class is there to allow hyperdata comparison.
Its attribute are overrided at the end of the present module to fit those
of the `value_flt` and `value_str` attributes of the `NodeHyperdata` class.
"""
class HyperdataKey(TypeDecorator):
"""Define a new type of column to describe a Node's type.
Internally, this column type is implemented as an SQL integer.
Values are detailed in `gargantext.constants.NODETYPES`.
"""
impl = Integer
def process_bind_param(self, keyname, dialect):
if keyname in INDEXED_HYPERDATA:
return INDEXED_HYPERDATA[keyname]
raise ValueError('Hyperdata key "%s" was not found in `gargantext.constants.NODETYPES`' % keyname)
def process_result_value(self, keyindex, dialect):
for keyname, key in INDEXED_HYPERDATA:
if key['id'] == keyindex:
return keyname
raise ValueError('Hyperdata key with id=%d was not found in `gargantext.constants.NODETYPES`' % keyindex)
class NodeHyperdata(Base):
"""This model's primary role is to allow better indexation of hyperdata.
It stores values contained in the `nodes.hyperdata` column (only those
listed in `gargantext.constants.INDEXED_HYPERDATA`), associated with the
corresponding key's index, and hyperdata value.
Example:
query = (session
.query(Node)
.join(NodeHyperdata)
.filter(NodeHyperdata.key == 'title')
.filter(NodeHyperdata.value.startswith('Bees'))
)
Example:
query = (session
.query(Node)
.join(NodeHyperdata)
.filter(NodeHyperdata.key == 'publication_date')
.filter(NodeHyperdata.value > datetime.datetime.now())
)
"""
__tablename__ = 'nodes_hyperdata'
id = Column(Integer, primary_key=True)
node_id = Column(Integer, ForeignKey(Node.id, ondelete='CASCADE'))
key = Column(HyperdataKey)
value_flt = Column(Double(), index=True)
value_str = Column(String(255), index=True)
def __init__(self, node=None, key=None, value=None):
"""Custom constructor
"""
# node reference
if node is not None:
if hasattr(node, 'id'):
self.node_id = node.id
else:
self.node_id = node
# key
if key is not None:
self.key = key
# value
self.value = value
@property
def value(self):
"""Pseudo-attribute used to extract the value in the right format.
"""
key = INDEXED_HYPERDATA[self.key]
return key['convert_from_db'](
self.value_flt if (self.value_str is None) else self.value_str
)
@value.setter
def value(self, value):
"""Pseudo-attribute used to insert the value in the right format.
"""
key = INDEXED_HYPERDATA[self.key]
value = key['convert_to_db'](value)
if isinstance(value, str):
self.value_str = value
else:
self.value_flt = value
@classproperty
def value(cls):
"""Pseudo-attribute used for hyperdata comparison inside a query.
"""
return HyperdataValueComparer()
def HyperdataValueComparer_overrider(key):
def comparator(self, *args):
if len(args) == 0:
return
if isinstance(args[0], datetime.datetime):
args = tuple(map(datetime.datetime.timestamp, args))
if isinstance(args[0], (int, float)):
return getattr(NodeHyperdata.value_flt, key)(*args)
if isinstance(args[0], str):
return getattr(NodeHyperdata.value_str, key)(*args)
return comparator
for key in set(dir(NodeHyperdata.value_flt) + dir(NodeHyperdata.value_str)):
if key in ('__dict__', '__weakref__', '__repr__', '__str__') or 'attr' in key or 'class' in key or 'init' in key or 'new' in key:
continue
setattr(HyperdataValueComparer, key, HyperdataValueComparer_overrider(key))
from gargantext.util.db import bulk_insert
from gargantext.constants import INDEXED_HYPERDATA
from gargantext.models import NodeHyperdata
def _nodes_hyperdata_generator(corpus):
"""This method generates columns for insertions in `nodes_hyperdata`.
In case one of the values is a list, its items are iterated over and
yielded separately.
"""
for document in corpus.children(typename='DOCUMENT'):
for keyname, key in INDEXED_HYPERDATA.items():
if keyname in document.hyperdata:
values = key['convert_to_db'](document.hyperdata[keyname])
if not isinstance(values, list):
values = [values]
for value in values:
if isinstance(value, (int, float, )):
yield (
document.id,
key['id'],
value,
None,
)
elif isinstance(value, (str, )):
yield (
document.id,
key['id'],
None,
value[:255],
)
def index_hyperdata(corpus):
bulk_insert(
table = NodeHyperdata,
fields = ('node_id', 'key', 'value_flt', 'value_str', ),
data = _nodes_hyperdata_generator(corpus),
)
......@@ -7,21 +7,9 @@ def login(request):
"""Performs user login
"""
auth.logout(request)
# if the user wants to access the login form
if request.method == 'GET':
additional_context = {}
# if for exemple: auth/?next=/project/5/corpus/554/document/556/
# => we'll forward ?next="..." into template with form
if 'next' in request.GET:
additional_context = {'next_page':request.GET['next']}
return render(
template_name = 'pages/auth/login.html',
request = request,
context = additional_context,
)
# if the user send her authentication data to the page
elif request.method == "POST":
if request.method == "POST":
# /!\ pass is sent clear in POST data: use SSL
user = auth.authenticate(
username = request.POST['username'],
......@@ -35,6 +23,19 @@ def login(request):
else:
return redirect('/projects/')
# if the user wants to access the login form
additional_context = {}
# if for exemple: auth/?next=/project/5/corpus/554/document/556/
# => we'll forward ?next="..." into template with form
if 'next' in request.GET:
additional_context = {'next_page':request.GET['next']}
return render(
template_name = 'pages/auth/login.html',
request = request,
context = additional_context,
)
def logout(request):
"""Logout the user, and redirect to main page
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment