Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Labels
Merge Requests
137
Merge Requests
137
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Jobs
Commits
Open sidebar
nexedi
erp5
Commits
13e54f83
Commit
13e54f83
authored
Nov 15, 2024
by
Jérome Perrin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
manual
parent
c1a277b7
Changes
5
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
59 additions
and
63 deletions
+59
-63
product/ERP5/Document/BusinessTemplate.py
product/ERP5/Document/BusinessTemplate.py
+3
-3
product/ERP5/bootstrap/erp5_core/MixinTemplateItem/portal_components/mixin.erp5.CompositionMixin.py
...lateItem/portal_components/mixin.erp5.CompositionMixin.py
+2
-4
product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.DateUtils.py
...ntTemplateItem/portal_components/module.erp5.DateUtils.py
+25
-15
product/Localizer/LanguageManager.py
product/Localizer/LanguageManager.py
+17
-29
product/Localizer/Localizer.py
product/Localizer/Localizer.py
+12
-12
No files found.
product/ERP5/Document/BusinessTemplate.py
View file @
13e54f83
...
...
@@ -5576,7 +5576,8 @@ Business Template is a set of definitions, such as skins, portal types and categ
self
,
getattr
(
new_bt
,
item_name
))
def
_uninstall
(
self
,
**
kw
):
@
security
.
protected
(
Permissions
.
ManagePortal
)
def
uninstall
(
self
,
**
kw
):
"""
For uninstall based on paramaters provided in **kw
"""
...
...
@@ -5590,8 +5591,7 @@ Business Template is a set of definitions, such as skins, portal types and categ
# template deletes many things from the portal.
self
.
getPortalObject
().
portal_caches
.
clearAllCache
()
security
.
declareProtected
(
Permissions
.
ManagePortal
,
'uninstall'
)
uninstall
=
_uninstall
_uninstall
=
uninstall
def
_clean
(
self
):
"""
...
...
product/ERP5/bootstrap/erp5_core/MixinTemplateItem/portal_components/mixin.erp5.CompositionMixin.py
View file @
13e54f83
...
...
@@ -189,11 +189,9 @@ class CompositionMixin:
security
=
ClassSecurityInfo
()
security
.
declareObjectProtected
(
Permissions
.
AccessContentsInformation
)
security
.
declareProtected
(
Permissions
.
AccessContentsInformation
,
'asComposedDocument'
)
asComposedDocument
=
transactional_cached
(
asComposedDocument
=
security
.
protected
(
Permissions
.
AccessContentsInformation
)(
transactional_cached
(
lambda
self
,
portal_type_list
=
None
:
(
self
,
portal_type_list
)
)(
asComposedDocument
)
# pylint:disable=used-before-assignment
)(
asComposedDocument
)
)
# pylint:disable=used-before-assignment
# XXX add accessors to get properties from '_effective_model_list' ?
# (cf PaySheetModel)
...
...
product/ERP5/bootstrap/erp5_core/ModuleComponentTemplateItem/portal_components/module.erp5.DateUtils.py
View file @
13e54f83
...
...
@@ -35,14 +35,6 @@ from datetime import datetime
import
six
security
=
ModuleSecurityInfo
(
__name__
)
security
.
declarePublic
(
'addToDate'
,
'getClosestDate'
,
'getIntervalBetweenDates'
,
'getMonthAndDaysBetween'
,
'getCompletedMonthBetween'
,
'getRoundedMonthBetween'
,
'getMonthFraction'
,
'getYearFraction'
,
'getAccountableYearFraction'
,
'getBissextilCompliantYearFraction'
,
'getIntervalListBetweenDates'
,
'getDecimalNumberOfYearsBetween'
,
'roundMonthToGreaterEntireYear'
,
'roundDate'
,
'convertDateToHour'
,
'getNumberOfDayInMonth'
,
'atTheEndOfPeriod'
,
'copyDate'
)
millis
=
DateTime
(
'2000/01/01 12:00:00.001'
)
-
DateTime
(
'2000/01/01 12:00:00'
)
centis
=
millis
*
10
...
...
@@ -58,6 +50,7 @@ accountable_days_in_month = 30.
accountable_months_in_year
=
12.
number_of_hours_in_year
=
8760
@
security
.
public
def
addToDate
(
date
,
to_add
=
None
,
**
kw
):
"""
Return a new DateTime object with the corresponding added values.
...
...
@@ -147,6 +140,7 @@ def addToDate(date, to_add=None, **kw):
return_date
+=
day_to_add
return
return_date
@
security
.
public
def
getClosestDate
(
date
=
None
,
target_date
=
None
,
precision
=
'month'
,
before
=
1
,
strict
=
1
):
"""
...
...
@@ -186,14 +180,15 @@ def getClosestDate(date=None, target_date=None,
return
return_date
# pylint: disable=dangerous-default-value
def
getIntervalBetweenDates
(
from_date
=
None
,
to_date
=
None
,
keys
=
{
'year'
:
1
,
'month'
:
1
,
'day'
:
1
}):
@
security
.
public
def
getIntervalBetweenDates
(
from_date
=
None
,
to_date
=
None
,
keys
=
None
):
"""
Return the number of entire years, months and days (if each is equal to 1 in keys)
between the both given dates.
If one of the given dates is None, the date used is the current time.
"""
if
keys
is
None
:
keys
=
{
'year'
:
1
,
'month'
:
1
,
'day'
:
1
}
if
from_date
is
None
:
from_date
=
DateTime
()
if
to_date
is
None
:
...
...
@@ -205,7 +200,7 @@ def getIntervalBetweenDates(from_date=None, to_date=None,
to_inverse
=
0
diff_value
=
{}
for
key
in
keys
.
keys
()
:
for
key
in
keys
:
if
key
:
diff_value
[
key
]
=
0
...
...
@@ -227,14 +222,15 @@ def getIntervalBetweenDates(from_date=None, to_date=None,
returned_value
[
key
]
=
value
return
returned_value
# pylint: disable=dangerous-default-value
def
getIntervalListBetweenDates
(
from_date
=
None
,
to_date
=
None
,
keys
=
{
'year'
:
1
,
'month'
:
1
,
'week'
:
1
,
'day'
:
1
}):
@
security
.
public
def
getIntervalListBetweenDates
(
from_date
=
None
,
to_date
=
None
,
keys
=
None
):
"""
Return the list of years, months and days (if each is equal to 1 in keys)
between the both given dates including the current one.
If one of the given dates is None, the date used is the current time.
"""
if
keys
is
None
:
keys
=
{
'year'
:
1
,
'month'
:
1
,
'day'
:
1
}
# key -> format dict
format_dict
=
{
'year'
:
'%Y'
,
'month'
:
'%Y-%m'
,
...
...
@@ -283,6 +279,7 @@ def getIntervalListBetweenDates(from_date=None, to_date=None,
returned_value_dict
[
key
]
=
value
return
returned_value_dict
@
security
.
public
def
getMonthAndDaysBetween
(
from_date
=
None
,
to_date
=
None
):
"""
Return the number of entire months and days between the both given dates.
...
...
@@ -290,6 +287,7 @@ def getMonthAndDaysBetween(from_date=None, to_date=None):
return
getIntervalBetweenDates
(
from_date
=
from_date
,
to_date
=
to_date
,
keys
=
{
'month'
:
1
,
'day'
:
1
}
)
@
security
.
public
def
getCompletedMonthBetween
(
from_date
=
None
,
to_date
=
None
,
reference_date
=
DateTime
(
'2000/01/01'
)):
"""
...
...
@@ -310,6 +308,7 @@ def getCompletedMonthBetween(from_date=None, to_date=None,
to_date
=
getClosestDate
(
target_date
=
to_date
,
date
=
reference_date
,
before
=
0
)
return
getIntervalBetweenDates
(
from_date
=
from_date
,
to_date
=
to_date
,
keys
=
{
'month'
:
1
}
)
@
security
.
public
def
getRoundedMonthBetween
(
from_date
=
None
,
to_date
=
None
,
rounded_day
=
False
):
"""
Return a rounded number of months between the both given dates.
...
...
@@ -330,6 +329,7 @@ def getRoundedMonthBetween(from_date=None, to_date=None, rounded_day=False):
return_value
+=
1
return
return_value
@
security
.
public
def
getMonthFraction
(
date
,
days
):
"""
Return a ratio corresponding to the fraction of the month
...
...
@@ -344,6 +344,7 @@ def getMonthFraction(date, days):
return
days
/
number_of_days_in_month
@
security
.
public
def
getYearFraction
(
days
=
None
,
months
=
None
,
days_in_year
=
number_of_days_in_year
):
"""
Return a ratio corresponding to the fraction of the year
...
...
@@ -354,6 +355,7 @@ def getYearFraction(days=None, months=None, days_in_year=number_of_days_in_year)
else
:
return
days
/
days_in_year
@
security
.
public
def
getAccountableYearFraction
(
from_date
=
None
,
to_date
=
None
):
"""
Returns a year fraction according to accounting rules,
...
...
@@ -382,6 +384,7 @@ def getAccountableYearFraction(from_date=None, to_date=None):
year_fraction
+=
(
1
/
accountable_months_in_year
)
*
(
days
/
accountable_days_in_month
)
return
year_fraction
@
security
.
public
def
getBissextilCompliantYearFraction
(
from_date
=
None
,
to_date
=
None
,
reference_date
=
DateTime
(
'2000/01/01'
)):
"""
Returns a ratio corresponding to the fraction of the year
...
...
@@ -399,6 +402,7 @@ def getBissextilCompliantYearFraction(from_date=None, to_date=None, reference_da
return_value
=
interval
[
'year'
]
+
getYearFraction
(
days
=
interval
[
'day'
],
days_in_year
=
days_in_year
)
return
return_value
@
security
.
public
def
getDecimalNumberOfYearsBetween
(
from_date
,
to_date
,
reference_date
=
DateTime
(
'2000/01/01'
)):
"""
Return a float representing the number of years between
...
...
@@ -419,6 +423,7 @@ def getDecimalNumberOfYearsBetween(from_date, to_date, reference_date=DateTime('
return
fraction
@
security
.
public
def
roundMonthToGreaterEntireYear
(
months_number
):
"""
Round the given number of months in order to have an entire
...
...
@@ -429,6 +434,7 @@ def roundMonthToGreaterEntireYear(months_number):
years_number
+=
1
return
int
(
years_number
)
*
12
@
security
.
public
def
roundDate
(
date
):
"""
Returns a date at 0:00
...
...
@@ -437,6 +443,7 @@ def roundDate(date):
' DateTime.earliestTime instead'
,
DeprecationWarning
)
return
date
.
earliestTime
()
@
security
.
public
def
convertDateToHour
(
date
=
None
):
"""
converts the date passed as parameter into hours
...
...
@@ -461,6 +468,7 @@ def convertDateToHour(date=None):
return
int
(
hour_
)
@
security
.
public
def
getNumberOfDayInMonth
(
date
):
month
=
date
.
month
()
mapping
=
{
...
...
@@ -483,6 +491,7 @@ def getNumberOfDayInMonth(date):
else
:
return
mapping
[
month
]
@
security
.
public
def
atTheEndOfPeriod
(
date
,
period
):
"""
return the last time value for a given date
...
...
@@ -511,6 +520,7 @@ def atTheEndOfPeriod(date, period):
raise
NotImplementedError
(
'Period "%s" not Handled yet'
%
period
)
return
end
@
security
.
public
def
copyDate
(
date
,
year
=
None
,
month
=
None
,
day
=
None
,
hour
=
None
,
minute
=
None
,
second
=
None
,
timezone
=
None
):
# pylint: disable=redefined-outer-name
if
year
is
None
:
...
...
product/Localizer/LanguageManager.py
View file @
13e54f83
...
...
@@ -45,18 +45,19 @@ class LanguageManager(Tabs):
########################################################################
# API
########################################################################
@
security
.
public
def
get_languages
(
self
):
"""Returns all the object languages.
"""
return
self
.
_languages
@
security
.
protected
(
'Manage language'
)
def
set_languages
(
self
,
languages
):
"""Sets the object languages.
"""
self
.
_languages
=
tuple
(
languages
)
@
security
.
protected
(
'Manage language'
)
def
add_language
(
self
,
language
):
"""Adds a new language.
"""
...
...
@@ -67,6 +68,7 @@ class LanguageManager(Tabs):
new_language_list
=
tuple
(
sorted
(
new_language_list
))
self
.
_languages
=
new_language_list
@
security
.
protected
(
'Manage language'
)
def
del_language
(
self
,
language
):
"""Removes a language.
"""
...
...
@@ -74,7 +76,7 @@ class LanguageManager(Tabs):
languages
=
[
x
for
x
in
self
.
_languages
if
x
!=
language
]
self
.
_languages
=
tuple
(
languages
)
@
security
.
public
def
get_languages_mapping
(
self
):
"""Returns a list of dictionary, one for each objects language. The
dictionary contains the language code, its name and a boolean value
...
...
@@ -85,7 +87,7 @@ class LanguageManager(Tabs):
'default'
:
x
==
self
.
_default_language
}
for
x
in
self
.
_languages
]
@
security
.
public
def
get_available_languages
(
self
,
**
kw
):
"""Returns the langauges available. For example, a language could be
considered as available only if there is some data associated to it.
...
...
@@ -96,7 +98,7 @@ class LanguageManager(Tabs):
"""
return
self
.
_languages
@
security
.
public
def
get_default_language
(
self
):
"""Returns the default language.
...
...
@@ -109,20 +111,10 @@ class LanguageManager(Tabs):
"""
return
self
.
_default_language
########################################################################
#
Web
API
# API
########################################################################
# Security settings
security
.
declarePublic
(
'get_languages'
)
security
.
declareProtected
(
'Manage languages'
,
'set_languages'
)
security
.
declareProtected
(
'Manage languages'
,
'add_language'
)
security
.
declareProtected
(
'Manage languages'
,
'del_language'
)
security
.
declarePublic
(
'get_languages_mapping'
)
security
.
declarePublic
(
'get_language_name'
)
@
security
.
public
def
get_language_name
(
self
,
id
=
None
):
"""
Returns the name of the given language code.
...
...
@@ -138,12 +130,8 @@ class LanguageManager(Tabs):
return
language_name
security
.
declarePublic
(
'get_available_languages'
)
security
.
declarePublic
(
'get_default_language'
)
# XXX Kept here temporarily, further refactoring needed
security
.
declarePublic
(
'get_selected_language'
)
@
security
.
public
def
get_selected_language
(
self
,
**
kw
):
"""
Returns the selected language. Here the language negotiation takes
...
...
@@ -191,7 +179,7 @@ class LanguageManager(Tabs):
manage_languages
=
LocalDTMLFile
(
'ui/LM_languages'
,
globals
())
security
.
declarePublic
(
'get_all_languages'
)
@
security
.
public
def
get_all_languages
(
self
):
"""
Returns all ISO languages, used by 'manage_languages'.
...
...
@@ -199,7 +187,7 @@ class LanguageManager(Tabs):
return
get_languages
()
+
self
.
get_user_defined_languages
()
security
.
declareProtected
(
'Manage languages'
,
'manage_addLanguage
'
)
@
security
.
protected
(
'Manage languages
'
)
def
manage_addLanguage
(
self
,
language
,
REQUEST
=
None
,
RESPONSE
=
None
):
""" """
self
.
add_language
(
language
)
...
...
@@ -208,7 +196,7 @@ class LanguageManager(Tabs):
RESPONSE
.
redirect
(
"%s/manage_languages"
%
REQUEST
[
'URL1'
])
security
.
declareProtected
(
'Manage languages'
,
'manage_delL
anguages'
)
@
security
.
protected
(
'Manage l
anguages'
)
def
manage_delLanguages
(
self
,
languages
,
REQUEST
,
RESPONSE
):
""" """
for
language
in
languages
:
...
...
@@ -217,7 +205,7 @@ class LanguageManager(Tabs):
RESPONSE
.
redirect
(
"%s/manage_languages"
%
REQUEST
[
'URL1'
])
security
.
declareProtected
(
'Manage languages'
,
'manage_changeDefaultLang
'
)
@
security
.
protected
(
'Manage languages
'
)
def
manage_changeDefaultLang
(
self
,
language
,
REQUEST
=
None
,
RESPONSE
=
None
):
""" """
self
.
_default_language
=
language
...
...
@@ -236,7 +224,7 @@ class LanguageManager(Tabs):
pass
security
.
declarePublic
(
'need_upgrade'
)
@
security
.
public
def
need_upgrade
(
self
):
""" """
return
self
.
_needs_upgrade
()
...
...
@@ -251,7 +239,7 @@ class LanguageManager(Tabs):
RESPONSE
.
redirect
(
'manage_main'
)
# Add a feature which allows users to be able to add a new language.
security
.
declarePublic
(
'get_user_defined_language_name'
)
@
security
.
public
def
get_user_defined_language_name
(
self
,
id
=
None
):
"""
Returns the name of the given user defined language code.
...
...
@@ -260,7 +248,7 @@ class LanguageManager(Tabs):
if
language_dict
[
'code'
]
==
id
:
return
language_dict
[
'name'
]
security
.
declarePublic
(
'get_user_defined_languages'
)
@
security
.
public
def
get_user_defined_languages
(
self
):
user_define_language_dict_list
=
[]
localizer
=
getattr
(
self
,
'Localizer'
,
None
)
...
...
product/Localizer/Localizer.py
View file @
13e54f83
...
...
@@ -110,7 +110,7 @@ class Localizer(LanguageManager, Folder):
#######################################################################
# Get some data
security
.
declarePublic
(
'get_supported_languages'
)
@
security
.
public
def
get_supported_languages
(
self
):
"""
Get the supported languages, that is the languages that the
...
...
@@ -119,7 +119,7 @@ class Localizer(LanguageManager, Folder):
return
self
.
_languages
security
.
declarePublic
(
'get_selected_language'
)
@
security
.
public
def
get_selected_language
(
self
):
""" """
return
lang_negotiator
(
self
.
_languages
)
\
...
...
@@ -131,7 +131,7 @@ class Localizer(LanguageManager, Folder):
## security.declareProtected('View management screens', 'manage_hookForm')
## manage_hookForm = LocalDTMLFile('ui/Localizer_hook', globals())
## security.declareProtected('Manage properties', 'manage_hook')
security
.
declarePrivate
(
'manage_hook'
)
@
security
.
private
def
manage_hook
(
self
,
hook
=
0
):
""" """
if
hook
!=
self
.
hooked
():
...
...
@@ -142,7 +142,7 @@ class Localizer(LanguageManager, Folder):
unregisterBeforeTraverse
(
aq_parent
(
self
),
self
.
meta_type
)
security
.
declarePublic
(
'hooked'
)
@
security
.
public
def
hooked
(
self
):
""" """
if
queryBeforeTraverse
(
aq_parent
(
self
),
self
.
meta_type
):
...
...
@@ -151,7 +151,7 @@ class Localizer(LanguageManager, Folder):
# New code to control the language policy
security
.
declarePrivate
(
'accept_cookie'
)
@
security
.
private
def
accept_cookie
(
self
,
accept_language
):
"""Add the language from a cookie."""
lang
=
self
.
REQUEST
.
cookies
.
get
(
'LOCALIZER_LANGUAGE'
,
None
)
...
...
@@ -159,7 +159,7 @@ class Localizer(LanguageManager, Folder):
accept_language
.
set
(
lang
,
2.0
)
security
.
declarePrivate
(
'accept_path'
)
@
security
.
private
def
accept_path
(
self
,
accept_language
):
"""Add the language from the path."""
stack
=
self
.
REQUEST
[
'TraversalRequestNameStack'
]
...
...
@@ -168,7 +168,7 @@ class Localizer(LanguageManager, Folder):
accept_language
.
set
(
lang
,
3.0
)
security
.
declarePrivate
(
'accept_url'
)
@
security
.
private
def
accept_url
(
self
,
accept_language
):
"""Add the language from the URL."""
lang
=
self
.
REQUEST
.
form
.
get
(
'LOCALIZER_LANGUAGE'
)
...
...
@@ -193,7 +193,7 @@ class Localizer(LanguageManager, Folder):
# Changing the language, useful snippets
security
.
declarePublic
(
'get_languages_map'
)
@
security
.
public
def
get_languages_map
(
self
):
"""
Return a list of dictionaries, each dictionary has the language
...
...
@@ -220,10 +220,10 @@ class Localizer(LanguageManager, Folder):
'selected'
:
x
==
ob_language
})
return
langs
changeLanguageForm
=
LocalDTMLFile
(
'ui/changeLanguageForm'
,
globals
())
security
.
declarePublic
(
'changeLanguage'
)
changeLanguageForm
=
LocalDTMLFile
(
'ui/changeLanguageForm'
,
globals
())
@
security
.
public
def
changeLanguage
(
self
,
lang
,
goto
=
None
,
expires
=
None
):
"""Change the user language to `lang`.
...
...
@@ -246,7 +246,7 @@ class Localizer(LanguageManager, Folder):
response
.
redirect
(
goto
)
security
.
declarePublic
(
'translationContext'
)
@
security
.
public
@
contextmanager
def
translationContext
(
self
,
lang
):
"""Context manager to temporarily change the current language.
...
...
@@ -273,7 +273,7 @@ class Localizer(LanguageManager, Folder):
if
old_accept_language
is
not
MARKER
:
request
.
set
(
'AcceptLanguage'
,
old_accept_language
)
security
.
declarePublic
(
'translate'
)
@
security
.
public
def
translate
(
self
,
domain
,
msgid
,
lang
=
None
,
*
args
,
**
kw
):
"""
backward compatibility shim over zope.i18n.translate. Please avoid.
...
...
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