Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
gargantext
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
humanities
gargantext
Commits
ed575f7e
Commit
ed575f7e
authored
Mar 10, 2016
by
Mathieu Rodic
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[BUG] corrected login bug
(`ValueError` when login/password is wrong)
parent
8149f0a9
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
183 additions
and
14 deletions
+183
-14
hyperdata.py
gargantext/models/hyperdata.py
+129
-0
hyperdata_indexing.py
gargantext/util/toolchain/hyperdata_indexing.py
+39
-0
auth.py
gargantext/views/pages/auth.py
+15
-14
No files found.
gargantext/models/hyperdata.py
0 → 100644
View file @
ed575f7e
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
))
gargantext/util/toolchain/hyperdata_indexing.py
0 → 100644
View file @
ed575f7e
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
),
)
gargantext/views/pages/auth.py
View file @
ed575f7e
...
...
@@ -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
el
if
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
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment