Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Sith
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
59
Issues
59
List
Boards
Labels
Service Desk
Milestones
Merge Requests
9
Merge Requests
9
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Incidents
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
AE
Sith
Commits
59f5917b
Commit
59f5917b
authored
Nov 05, 2016
by
Skia
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Fix Page locking
parent
c0c8b295
Pipeline
#343
failed with stage
in 3 minutes and 41 seconds
Changes
6
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
56 additions
and
24 deletions
+56
-24
core/management/commands/populate.py
core/management/commands/populate.py
+5
-7
core/migrations/0005_auto_20161105_1035.py
core/migrations/0005_auto_20161105_1035.py
+25
-0
core/models.py
core/models.py
+17
-15
core/views/__init__.py
core/views/__init__.py
+6
-0
core/views/page.py
core/views/page.py
+2
-2
sith/settings.py
sith/settings.py
+1
-0
No files found.
core/management/commands/populate.py
View file @
59f5917b
...
@@ -167,15 +167,14 @@ Welcome to the wiki page!
...
@@ -167,15 +167,14 @@ Welcome to the wiki page!
r
.
save
()
r
.
save
()
# Adding syntax help page
# Adding syntax help page
p
=
Page
(
name
=
'Aide_sur_la_syntaxe'
)
p
=
Page
(
name
=
'Aide_sur_la_syntaxe'
)
p
.
save
()
p
.
save
(
force_lock
=
True
)
PageRev
(
page
=
p
,
title
=
"Aide sur la syntaxe"
,
author
=
skia
,
content
=
"""
PageRev
(
page
=
p
,
title
=
"Aide sur la syntaxe"
,
author
=
skia
,
content
=
"""
Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
"""
).
save
()
"""
).
save
()
p
=
Page
(
name
=
'Services'
)
p
=
Page
(
name
=
'Services'
)
p
.
save
()
p
.
save
(
force_lock
=
True
)
p
.
set_lock
(
skia
)
p
.
view_groups
=
[
settings
.
SITH_GROUPS
[
'public'
][
'id'
]]
p
.
view_groups
=
[
settings
.
SITH_GROUPS
[
'public'
][
'id'
]]
p
.
save
()
p
.
save
(
force_lock
=
True
)
PageRev
(
page
=
p
,
title
=
"Services"
,
author
=
skia
,
content
=
"""
PageRev
(
page
=
p
,
title
=
"Services"
,
author
=
skia
,
content
=
"""
| | | |
| | | |
| :---: | :---: | :---: |
| :---: | :---: | :---: |
...
@@ -185,10 +184,9 @@ Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
...
@@ -185,10 +184,9 @@ Cette page vise à documenter la syntaxe *Markdown* utilisée sur le site.
"""
).
save
()
"""
).
save
()
# Adding README
# Adding README
p
=
Page
(
name
=
'README'
)
p
=
Page
(
name
=
'README'
)
p
.
save
()
p
.
save
(
force_lock
=
True
)
p
.
view_groups
=
[
settings
.
SITH_GROUPS
[
'public'
][
'id'
]]
p
.
view_groups
=
[
settings
.
SITH_GROUPS
[
'public'
][
'id'
]]
p
.
set_lock
(
skia
)
p
.
save
(
force_lock
=
True
)
p
.
save
()
with
open
(
os
.
path
.
join
(
root_path
)
+
'/README.md'
,
'r'
)
as
rm
:
with
open
(
os
.
path
.
join
(
root_path
)
+
'/README.md'
,
'r'
)
as
rm
:
PageRev
(
page
=
p
,
title
=
"README"
,
author
=
skia
,
content
=
rm
.
read
()).
save
()
PageRev
(
page
=
p
,
title
=
"README"
,
author
=
skia
,
content
=
rm
.
read
()).
save
()
...
...
core/migrations/0005_auto_20161105_1035.py
0 → 100644
View file @
59f5917b
# -*- coding: utf-8 -*-
from
__future__
import
unicode_literals
from
django.db
import
migrations
,
models
from
django.conf
import
settings
class
Migration
(
migrations
.
Migration
):
dependencies
=
[
(
'core'
,
'0004_user_godfathers'
),
]
operations
=
[
migrations
.
AddField
(
model_name
=
'page'
,
name
=
'lock_timeout'
,
field
=
models
.
DateTimeField
(
verbose_name
=
'lock_timeout'
,
null
=
True
,
blank
=
True
,
default
=
None
),
),
migrations
.
AddField
(
model_name
=
'page'
,
name
=
'lock_user'
,
field
=
models
.
ForeignKey
(
verbose_name
=
'lock user'
,
default
=
None
,
blank
=
True
,
to
=
settings
.
AUTH_USER_MODEL
,
null
=
True
,
related_name
=
'locked_pages'
),
),
]
core/models.py
View file @
59f5917b
...
@@ -630,7 +630,8 @@ class Page(models.Model):
...
@@ -630,7 +630,8 @@ class Page(models.Model):
default
=
settings
.
SITH_GROUPS
[
'root'
][
'id'
])
default
=
settings
.
SITH_GROUPS
[
'root'
][
'id'
])
edit_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"editable_page"
,
verbose_name
=
_
(
"edit group"
),
blank
=
True
)
edit_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"editable_page"
,
verbose_name
=
_
(
"edit group"
),
blank
=
True
)
view_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"viewable_page"
,
verbose_name
=
_
(
"view group"
),
blank
=
True
)
view_groups
=
models
.
ManyToManyField
(
Group
,
related_name
=
"viewable_page"
,
verbose_name
=
_
(
"view group"
),
blank
=
True
)
lock_mutex
=
{}
lock_user
=
models
.
ForeignKey
(
User
,
related_name
=
"locked_pages"
,
verbose_name
=
_
(
"lock user"
),
blank
=
True
,
null
=
True
,
default
=
None
)
lock_timeout
=
models
.
DateTimeField
(
_
(
'lock_timeout'
),
null
=
True
,
blank
=
True
,
default
=
None
)
class
Meta
:
class
Meta
:
unique_together
=
(
'name'
,
'parent'
)
unique_together
=
(
'name'
,
'parent'
)
...
@@ -679,7 +680,9 @@ class Page(models.Model):
...
@@ -679,7 +680,9 @@ class Page(models.Model):
"""
"""
Performs some needed actions before and after saving a page in database
Performs some needed actions before and after saving a page in database
"""
"""
if
not
self
.
is_locked
():
locked
=
kwargs
.
pop
(
'force_lock'
,
False
)
if
not
locked
:
locked
=
self
.
is_locked
()
if
not
locked
:
raise
NotLocked
(
"The page is not locked and thus can not be saved"
)
raise
NotLocked
(
"The page is not locked and thus can not be saved"
)
self
.
full_clean
()
self
.
full_clean
()
# This reset the _full_name just before saving to maintain a coherent field quicker for queries than the
# This reset the _full_name just before saving to maintain a coherent field quicker for queries than the
...
@@ -697,23 +700,20 @@ class Page(models.Model):
...
@@ -697,23 +700,20 @@ class Page(models.Model):
This is where the timeout is handled, so a locked page for which the timeout is reach will be unlocked and this
This is where the timeout is handled, so a locked page for which the timeout is reach will be unlocked and this
function will return False
function will return False
"""
"""
if
self
.
pk
not
in
Page
.
lock_mutex
.
keys
():
if
self
.
lock_timeout
and
(
timezone
.
now
()
-
self
.
lock_timeout
>
timedelta
(
minutes
=
5
)):
# print("Page mutex does not exists")
return
False
if
(
timezone
.
now
()
-
Page
.
lock_mutex
[
self
.
pk
][
'time'
])
>
timedelta
(
minutes
=
5
):
# print("Lock timed out")
# print("Lock timed out")
self
.
unset_lock
()
self
.
unset_lock
()
return
False
return
self
.
lock_user
and
self
.
lock_timeout
and
(
timezone
.
now
()
-
self
.
lock_timeout
<
timedelta
(
minutes
=
5
))
return
True
def
set_lock
(
self
,
user
):
def
set_lock
(
self
,
user
):
"""
"""
Sets a lock on the current page or raise an AlreadyLocked exception
Sets a lock on the current page or raise an AlreadyLocked exception
"""
"""
if
self
.
is_locked
()
and
self
.
get_lock
()
[
'user'
]
!=
user
:
if
self
.
is_locked
()
and
self
.
get_lock
()
!=
user
:
raise
AlreadyLocked
(
"The page is already locked by someone else"
)
raise
AlreadyLocked
(
"The page is already locked by someone else"
)
Page
.
lock_mutex
[
self
.
pk
]
=
{
'user'
:
user
,
self
.
lock_user
=
user
'time'
:
timezone
.
now
()}
self
.
lock_timeout
=
timezone
.
now
()
super
(
Page
,
self
).
save
()
# print("Locking page")
# print("Locking page")
def
set_lock_recursive
(
self
,
user
):
def
set_lock_recursive
(
self
,
user
):
...
@@ -726,16 +726,18 @@ class Page(models.Model):
...
@@ -726,16 +726,18 @@ class Page(models.Model):
def
unset_lock
(
self
):
def
unset_lock
(
self
):
"""Always try to unlock, even if there is no lock"""
"""Always try to unlock, even if there is no lock"""
Page
.
lock_mutex
.
pop
(
self
.
pk
,
None
)
self
.
lock_user
=
None
self
.
lock_timeout
=
None
super
(
Page
,
self
).
save
()
# print("Unlocking page")
# print("Unlocking page")
def
get_lock
(
self
):
def
get_lock
(
self
):
"""
"""
Returns the page's mutex containing the time and the user in a dict
Returns the page's mutex containing the time and the user in a dict
"""
"""
if
self
.
is_locked
()
:
if
self
.
lock_user
:
return
Page
.
lock_mutex
[
self
.
pk
]
return
self
.
lock_user
raise
NotLocked
(
"The page is not locked and thus can not return its
mutex
"
)
raise
NotLocked
(
"The page is not locked and thus can not return its
user
"
)
def
get_absolute_url
(
self
):
def
get_absolute_url
(
self
):
"""
"""
...
...
core/views/__init__.py
View file @
59f5917b
...
@@ -37,6 +37,12 @@ class CanCreateMixin(View):
...
@@ -37,6 +37,12 @@ class CanCreateMixin(View):
This view is made to protect any child view that would create an object, and thus, that can not be protected by any
This view is made to protect any child view that would create an object, and thus, that can not be protected by any
of the following mixin
of the following mixin
"""
"""
def
dispatch
(
self
,
request
,
*
arg
,
**
kwargs
):
res
=
super
(
CanCreateMixin
,
self
).
dispatch
(
request
,
*
arg
,
**
kwargs
)
if
not
request
.
user
.
is_authenticated
():
raise
PermissionDenied
return
res
def
form_valid
(
self
,
form
):
def
form_valid
(
self
,
form
):
obj
=
form
.
instance
obj
=
form
.
instance
if
can_edit_prop
(
obj
,
self
.
request
.
user
):
if
can_edit_prop
(
obj
,
self
.
request
.
user
):
...
...
core/views/page.py
View file @
59f5917b
...
@@ -9,7 +9,7 @@ from django.forms import CheckboxSelectMultiple
...
@@ -9,7 +9,7 @@ from django.forms import CheckboxSelectMultiple
from
core.models
import
Page
,
PageRev
,
LockError
from
core.models
import
Page
,
PageRev
,
LockError
from
core.views.forms
import
PagePropForm
from
core.views.forms
import
PagePropForm
from
core.views
import
CanViewMixin
,
CanEditMixin
,
CanEditPropMixin
from
core.views
import
CanViewMixin
,
CanEditMixin
,
CanEditPropMixin
,
CanCreateMixin
class
PageListView
(
CanViewMixin
,
ListView
):
class
PageListView
(
CanViewMixin
,
ListView
):
model
=
Page
model
=
Page
...
@@ -59,7 +59,7 @@ class PageRevView(CanViewMixin, DetailView):
...
@@ -59,7 +59,7 @@ class PageRevView(CanViewMixin, DetailView):
context
[
'new_page'
]
=
self
.
kwargs
[
'page_name'
]
context
[
'new_page'
]
=
self
.
kwargs
[
'page_name'
]
return
context
return
context
class
PageCreateView
(
Can
EditProp
Mixin
,
CreateView
):
class
PageCreateView
(
Can
Create
Mixin
,
CreateView
):
model
=
Page
model
=
Page
form_class
=
modelform_factory
(
Page
,
form_class
=
modelform_factory
(
Page
,
fields
=
[
'parent'
,
'name'
,
'owner_group'
,
'edit_groups'
,
'view_groups'
,
],
fields
=
[
'parent'
,
'name'
,
'owner_group'
,
'edit_groups'
,
'view_groups'
,
],
...
...
sith/settings.py
View file @
59f5917b
...
@@ -442,5 +442,6 @@ OLD_MYSQL_INFOS = {
...
@@ -442,5 +442,6 @@ OLD_MYSQL_INFOS = {
try
:
try
:
from
.settings_custom
import
*
from
.settings_custom
import
*
print
(
"Custom settings imported"
)
except
:
except
:
print
(
"Custom settings failed"
)
print
(
"Custom settings failed"
)
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