Compare commits

..

163 commits

Author SHA1 Message Date
350a600ffc decimal field: parse using locale + pattern using zope.i18n 2025-05-15 19:54:21 +02:00
dc5e1fa251 fix conversion of decimal field to float: use german locale if appropriate 2025-05-15 18:07:46 +02:00
0e5270f8d5 fix remaining 'implements'... 2025-02-22 11:31:19 +01:00
fe632fbeab more Python3 fixes (unicode, basestring) 2025-01-11 11:35:21 +01:00
860d18cae8 Python3 fix for schema.grid 2025-01-07 08:46:31 +01:00
569e197609 more minor Python3 fixes 2024-11-24 10:18:21 +01:00
12978d2389 tracks: determine indexAttributes dynamically, allowing later change 2024-11-24 10:11:25 +01:00
df1229d8fd minor fixes for avoiding errors with Python3 / up-to-date libraries 2024-10-26 19:22:59 +02:00
93a2acf7db some more Python3 fixes 2024-10-03 17:00:16 +02:00
25277a0b65 avoid testing deprecation errors with Python3.12 2024-10-02 10:14:22 +02:00
aef9ad8cb5 make Python3.12 happy 2024-10-02 09:45:57 +02:00
814d7c0762 changes to allow zodbupdate to migrate old data 2024-10-02 09:08:16 +02:00
8a6277fbff some more Python3 fixes 2024-10-01 16:09:46 +02:00
2cbd4c11d3 fix UID handling in commerce 2024-10-01 15:40:38 +02:00
968aeab42a one more Python3 fix in ajax 2024-09-29 12:04:56 +02:00
f1080df88b use zope-testrunner for running all relevant tests => more Python3 fixes 2024-09-28 11:42:20 +02:00
33ab512b7f some more Python3 fixes (composer.report, tracking) 2024-09-26 16:24:24 +02:00
17fbeb2c2c browser.loops.auth: Python3 fix 2024-09-25 17:05:19 +02:00
52e3fc72c6 more Python3 fixes in composer, knowledge 2024-09-25 10:57:30 +02:00
db31a73bc9 container: Python3 fix 2024-09-25 09:31:49 +02:00
ee82ee7b32 composer: some more Python3 fixes 2024-09-24 19:24:25 +02:00
71f36283b9 Merge branch '2master' into 3master 2024-09-24 17:15:06 +02:00
d66aa31058 more Python3 fixes (browser.action, composer...field) 2024-09-24 17:11:06 +02:00
5f3bd3c04f composer: more Python3 fixes 2024-09-24 11:14:22 +02:00
b22dbf879c remove deprecated zope.app.container references 2024-09-23 22:50:46 +02:00
9fbd97386e some more Python3 fixes... 2024-09-23 15:35:14 +02:00
b8eba239ed typology: Python3 fixes; + update of example data 2024-09-23 15:05:10 +02:00
61c78fe3e7 reporter: Python3 fixes 2024-09-23 13:12:33 +02:00
3ec90f4b66 relation: Python3 fixes 2024-09-23 12:17:52 +02:00
f9a3326ec7 process: Python3 fixes 2024-09-23 11:14:21 +02:00
8037ac38be organize: Python3 fixes 2024-09-23 11:00:35 +02:00
52990d1df6 work in progress: organize: Python3 fixes 2024-09-22 18:10:02 +02:00
8d260908a5 meta: Python3 fixes 2024-09-22 17:16:33 +02:00
b60d6d3b10 external: some Python3 fixes 2024-09-22 16:12:36 +02:00
e98dd2ed34 media: Python3 fixes 2024-09-22 15:24:24 +02:00
c9220d834d linK: Python3 fixes 2024-09-22 14:46:28 +02:00
383b77edf1 knowledge: Python3 fixes 2024-09-22 13:31:58 +02:00
b866ac4267 integrator.filesystem: Python3 fixes 2024-09-22 13:25:46 +02:00
ee9d062833 docgen: Python3 fixes 2024-09-22 11:16:47 +02:00
4b84e816b4 container: Python3 fixes 2024-09-22 10:41:30 +02:00
80766f2279 composer, util: Python3 fixes 2024-09-22 10:24:02 +02:00
87ca77df45 commerce: Python3 fixes, + composer (.base, .schema) 2024-09-21 22:36:59 +02:00
c5fe028756 catalog: Python3 fixes (+ some fixes in relation) 2024-09-21 17:04:16 +02:00
ad632e23ee browser: Python3 fixes 2024-09-21 16:12:03 +02:00
98ebc30bd5 tracking: tests OK, including some fixes in container 2024-09-21 15:04:57 +02:00
bd631677d6 brain: fixes (zope.interface.implementer); + text: improvements 2024-09-21 14:27:15 +02:00
06682d2a5c define project via pyproject.toml, removing setup.py; + fixes => cybertools.text tests OK 2024-09-21 09:06:42 +02:00
35ab24a78a tracking: add updateIndex() method 2024-05-03 13:08:35 +02:00
a6fb663192 minor additions for compatibility with new cco.storage implementation 2024-01-03 11:07:55 +01:00
94ce64ef00 add RecordsTable field - context-based, i.e. the columns are defined in the object or type 2023-12-28 09:09:00 +01:00
e5f1be9f91 provide method for automatic conversion from KeyTable to Records field 2023-12-25 10:52:45 +01:00
abfd75a782 date2TimeStamp(): accept also int and float as input 2023-12-21 08:18:49 +01:00
6a52601060 move tracking migration to loops 2023-12-15 14:03:35 +01:00
d6666c166f first migration (with favorites) basically working 2023-12-11 09:46:27 +01:00
382ffe2e28 add MIT license file as default for new or changed modules 2023-12-11 08:24:54 +01:00
6f86e74feb work in progress: migration of records (tracking) - main development in python2 (2master) branch 2023-12-11 08:19:49 +01:00
1fb58a7db3 remove copyright comments - see LICENSE file 2023-11-29 13:19:47 +01:00
fad566b354 make package cybertools.tracking Python3-ready 2023-11-29 11:48:36 +01:00
43ea46e401 cybertools.text: OK on py3 2023-11-27 18:49:05 +01:00
Hannes Plattner
f5c80948c0 refix 2023-06-28 13:54:51 +02:00
Hannes Plattner
88f8b968e6 fix method call 2023-06-28 13:50:28 +02:00
zope
674cd62ae6 avoid error when timestamp is already a date 2021-11-24 09:32:41 +01:00
zope
1629defe3d add parameter usePredicateIndex to getRelations() 2021-08-07 11:44:01 +02:00
Hannes Plattner
bd1aa11beb Merge branch '2master' of ssh://git.cy55.de/home/git/cybertools into 2master 2020-10-13 13:22:40 +02:00
Hannes Plattner
46582b51fe fix instance default value getter 2020-10-13 13:22:21 +02:00
59cd18cc63 fix import: stop deprecation warning 2020-05-04 16:30:01 +02:00
ab72a31bf0 merge field methods correctly 2020-04-15 11:56:56 +02:00
a8565f58c3 don't suppress 'hidden' fields 2020-04-08 14:52:51 +02:00
51be7dbcbb avoid deprecation warnings, fix doctests 2020-03-07 13:44:10 +01:00
f2eae818db set version number to 2.3.0 2020-03-07 12:51:33 +01:00
3c8edc3e90 merge bbmaster + bbmaster2 to new branch 2master 2020-03-03 15:22:13 +01:00
b690273bf0 update version number 2019-03-09 13:24:14 +01:00
9f1bbb5193 fix moving of work items 2018-01-09 07:55:06 +01:00
93249faf94 fix check for workitem type 2017-01-16 15:23:48 +01:00
bd3d7a0e2f fix action start: 'party' query only works in adapter 2017-01-16 15:12:50 +01:00
3b53657c5d fix MANIFEST.in: include missing files/directories 2017-01-02 16:07:09 +01:00
2e09bb3738 minor package-level changes, add README file 2017-01-01 17:21:32 +01:00
82bc58329b dirty fix: monkey patch in IntIds to avoid ForbiddenAttribute error 2017-01-01 17:19:52 +01:00
d385dc8dea make package ready for distribution as an sdist egg 2016-12-31 13:43:05 +01:00
c03e47ab3d cleanup pagetemplate code with string: literals 2016-12-26 18:14:15 +01:00
325f463ce8 remove deprecated import from zope.testing 2016-12-26 11:26:10 +01:00
9205e8592e remove deprecated import from zope.testing 2016-12-26 10:42:27 +01:00
170e8f1d4e allow hiding of a field from schema-based forms 2016-12-23 17:14:11 +01:00
5aa9869181 add 'visible' property to IField interface 2016-10-08 14:05:19 +02:00
4c18a9731c add 'visible' property to field definition 2016-10-08 11:17:39 +02:00
6cff2cc6df update copyright info 2016-10-08 09:37:47 +02:00
1cd5f59738 call schema processor with **kw to provide view/request 2016-08-27 09:31:56 +02:00
d742b87c9c allow schema processor plugin adapter 2016-08-25 16:41:40 +02:00
ef05da60e1 take URLGetter implementation from common location 2016-06-28 08:14:02 +02:00
0d1a37b5d2 provide method for tweaking request/URL, esp remove trailing '/@@index.html' 2016-06-17 09:43:29 +02:00
81ae451969 fix stripping of '/@@index.html' 2016-06-13 10:01:47 +02:00
443fee52bb fix URL clipping 2016-06-12 09:04:30 +02:00
813299d358 revert change in main.pt, makes problems with relative URLs 2016-06-10 12:35:28 +02:00
34d65623ad revert change for request/URL 2016-06-09 13:43:11 +02:00
043d423a0e use new 'view/requestUrl' to avoid '/@@index.html' in URLs 2016-06-09 10:32:04 +02:00
8777d1ecdb provide 'view/requestUrl' method to be used instead of 'request/URL' 2016-06-09 09:03:44 +02:00
8166a0e3c3 add green/blue LED icon 2016-06-09 09:03:03 +02:00
2a2097fa0d tracking: allow wildcard (*) query 2016-04-25 12:27:03 +02:00
65181d3098 update editing rules (still only informative) to changed list of work item states 2016-02-20 21:30:21 +01:00
5ab63ee78c remove redundant call to setConctroller() 2016-02-20 21:29:19 +01:00
99628fedd5 provide optional export value for special formattings 2016-01-26 13:30:02 +01:00
14cfdb7624 allow setting of main template via controller (which is found via skin) 2016-01-09 12:01:09 +01:00
fcb29171ad Merge branch 'master' into bbmaster2 2015-10-10 11:42:22 +02:00
caee0eccc5 Merge branch 'master' of ssh://git.cy55.de/home/git/cybertools 2015-10-10 11:38:51 +02:00
917c2ae579 revert change by hplattner from 2013 that was erroneously merged 2015-10-10 11:27:41 +02:00
4690424b1d merge changes from hplattner 2015-09-29 14:35:24 +02:00
hplattner
fdc9d119ba fix merge conflict 2015-09-29 11:45:16 +02:00
hplattner
e5a09ed436 add fill option to media asset resize function 2015-09-29 11:42:42 +02:00
8eed8f52df Merge branch 'bbmaster' into bbmaster2 2015-08-29 11:06:02 +02:00
a6e9a8543c merge branch master 2015-08-29 11:05:12 +02:00
296ce1a3e8 Merge branch 'bbmaster' of ssh://git.cy55.de/home/git/cybertools into bbmaster 2015-08-29 11:03:43 +02:00
773cf5f5a9 Merge branch 'master' of ssh://git.cy55.de/home/git/cybertools 2015-08-29 11:03:07 +02:00
c15039b9a7 avoid zero division error when data are missing 2015-08-13 16:09:33 +02:00
bf290aea2f avoid errors because of missing files during import 2015-08-13 16:07:14 +02:00
6b22eb85dd add zope.app.dublincore (deprecated) dependency to support old persistent data 2015-07-29 09:25:20 +02:00
6a356c6f9c allow selection of question groups via party (i.e. person) 2015-07-16 20:00:09 +02:00
c5087b764b add some (still commented-out) code as marker for future extension, e.g. for allowing delegation of running work items 2015-07-16 15:55:07 +02:00
81d17e8966 better backword compatibility: ignore product options if not present 2015-06-20 09:29:42 +02:00
620bf6fe25 handle product options correctly 2015-06-19 12:05:14 +02:00
e32c0411d4 change PIL import to work with Pillow 2015-06-13 11:32:04 +02:00
dfe5aefa69 merge branch master 2015-06-12 08:34:10 +02:00
8824044726 Merge branch 'master' of ssh://git.cy55.de/home/git/cybertools 2015-06-12 07:31:58 +02:00
df41516015 minor fixes 2015-06-12 07:30:35 +02:00
12a5b339ad fixes for 'start' and 'move' transitions 2015-05-19 07:10:10 +02:00
a83f80a1f9 fix access from response to questionnaire to allow use of question groups in more than one questionnaire 2015-05-06 08:07:06 +02:00
b5b2b0c7b4 separate attribute for texts in response object 2015-04-21 12:41:39 +02:00
aa8814b29b give groups as parameters to team calculation to make evaluation independent of user data 2015-04-21 10:04:52 +02:00
abdf27372b correctly handle legacy case: question type not set 2015-04-19 15:16:03 +02:00
2c5274e54b work in progress: handling of question types 2015-04-17 09:14:19 +02:00
08880e3b91 put file name in title if title field is empty 2015-04-14 16:37:29 +02:00
13da77de0a provide 'descending' flag for sorting 2015-03-21 17:10:40 +01:00
3d3013b76c fix running work items: stop only if of type 'work' 2015-03-21 17:10:10 +01:00
0aeb854014 new fields: priority, activity 2015-03-16 11:15:41 +01:00
ba529fad7b 'move' action: correctly inactivate old 'done' or 'finished' items 2015-03-15 10:22:38 +01:00
c9490bb1e9 allow question groups without feedback element 2015-03-10 09:24:04 +01:00
d05b9f7f70 allow question groups without feedback element 2015-03-10 09:20:32 +01:00
73839ea015 when starting a work item stop others that are running; start default date/time is 'now' for start of work 2015-03-03 18:16:36 +01:00
3d8a162ae5 use simple HTML 5 doctype to make Google happy 2015-01-09 13:03:39 +01:00
9c5a3ba263 avoid error when number of columns in table definition has been increased 2014-12-17 11:26:35 +01:00
bfd628e434 avoid error when number of columns in table definition has been increased 2014-12-17 11:24:07 +01:00
419e899aa4 avoid error when number of columns in table definition has been increased 2014-12-17 11:21:43 +01:00
7b3065439a try to avoid any spurious Unicode items 2014-10-29 08:44:40 +01:00
b7efdf6a33 provide sublabels for multi-field groups in records cells 2014-10-10 08:55:45 +02:00
72528a62fc provide index-based access to fields in field group 2014-10-08 20:50:56 +02:00
6e1333076b allow definition of field groups that may be used for controlling layout of records fields 2014-09-20 11:16:54 +02:00
249d507a72 improve check-up work item type 2014-07-22 14:30:44 +02:00
166c74ed31 hide time field for birthday 2014-07-22 14:30:01 +02:00
b1c8465219 avoid ForbiddenAttribute error on update via management interface 2014-06-29 10:38:58 +02:00
abae2c2bb3 put printer settings at end 2014-06-01 11:06:46 +02:00
b8009b51f8 handle question groups without answers 2014-05-29 18:06:41 +02:00
358545833f allow for non-numeric values which will be ignored in calculations 2014-05-29 11:32:46 +02:00
0f03b894f4 refactor result data structure, fix rank calculation, add team rank 2014-05-24 14:49:29 +02:00
b04daf0c51 no automatic index set up: gives error on Zope 2 2014-05-22 15:54:39 +02:00
dc03f4fd00 provide translations for address fields 2014-05-12 17:54:42 +02:00
d994b646e9 use precalculated scores per question group for team result 2014-05-08 13:24:49 +02:00
94463df4d5 allow actions also in previous work items of a run 2014-05-03 10:44:47 +02:00
cacca105ac provide team evaluation of survey 2014-05-02 14:45:10 +02:00
d50b1ca9df allow cancelling of finished work items 2014-04-29 20:40:25 +02:00
cc696ee87d handle not initialized stat, e.g. when a class with existing objects is derived from Stateful later 2014-04-14 19:04:09 +02:00
cb365aaea2 always check for correct index setup upon indexing a track 2014-04-09 13:09:15 +02:00
2bc3267e9b add marker for possible future change: check for new index upon call to indeTrack() 2014-02-28 17:09:42 +01:00
d4d7a47b09 do not ignore value if equal to default on saving, but only in check on empty row 2014-01-19 10:47:21 +01:00
9977e8b191 reduce standard width for text fields (backport from bbmaster branch) 2013-12-17 09:40:56 +01:00
673 changed files with 2507 additions and 7300 deletions

6
.gitignore vendored
View file

@ -1,6 +1,10 @@
*.pyc
*.pyo
ajax/dojo/*
*/ajax/dojo/dojo*
build/
dist/
*.swp
*.egg-info
*.project
*.pydevproject
*.sublime-project

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (C) 2023 cyberconcepts.org team
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

14
MANIFEST.in Normal file
View file

@ -0,0 +1,14 @@
global-include *.cfg
global-include *.css *.js
global-include *.gif *.jpg *.png
global-include *.html
global-include *.md *.txt
global-include *.mht
global-include *.mo *.po *.pot
global-include *.pt
global-include *.xml
global-include *.zcml
global-include mime.types
graft cybertools/integrator/tests/data
graft cybertools/text/testfiles

7
README.md Normal file
View file

@ -0,0 +1,7 @@
# Introduction
This is a set of utility libraries to be used mainly
with Zope 3 / bluebream and the web application platform
*loops*.
More information: see https://www.cyberconcepts.org.

View file

@ -1,41 +0,0 @@
#
# Copyright (c) 2006 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Transaction management.
$Id$
"""
from zope.interface import implements
from cybertools.brain.interfaces import ISession
class Session(object):
implements(ISession)
def __init__(self):
self.states = {}
def setState(self, neuron, state):
self.states[neuron] = state
def getState(self, neuron):
return self.states.get(neuron, neuron.state)

View file

@ -1,55 +0,0 @@
#
# Copyright (c) 2006 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Base classes for state and state manipulations using a float-based state.
$Id$
"""
from zope.interface import implements
from cybertools.brain.interfaces import IState, ITransition
class State(object):
""" The state of a neuron.
"""
implements(IState)
def __init__(self, value=0.0):
self.value = value
def __repr__(self):
return '<State %0.1f>' % self.value
class Transition(object):
implements(ITransition)
def __init__(self, synapsis, factor=1.0):
self.synapsis = synapsis
self.factor = factor
def execute(self, session=None):
oldState = self.synapsis.receiver.getState(session)
senderState = self.synapsis.sender.getState(session)
return State(oldState.value + senderState.value * self.factor)

View file

@ -1,48 +0,0 @@
#
# Copyright (c) 2006 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""Form Controller stuff: form processing is the part of the
model/view/controller pattern that deals withform input.
$Id$
"""
from zope.interface import Interface, implements
class IFormController(Interface):
""" Used as a named adapter by GenericView for processing form input.
"""
def update():
""" Processing form input...
"""
class FormController(object):
implements(IFormController)
def __init__(self, context, request):
self.view = self.__parent__ = view = context
self.context = view.context # the controller is adapted to a view
self.request = request
def update(self):
pass

View file

@ -1,38 +0,0 @@
#
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" URL manipulation utilities
$Id$
"""
from urlparse import urlparse
from zope.app.container.traversal import ItemTraverser
from zope.interface import Interface, implements
TraversalRedirector(ItemTraverser):
port = 9083
names = ('ctt', 'sona',)
loc_pattern = 'www.%s.de'
skip = (0, 4)
def publishTraverse(self, request, name):
return super(TraversalRedirector, self).publishTraverse(request, name)

View file

@ -1,43 +0,0 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""Keyword catalog index.
$Id$
"""
import zope.index.keyword
import zope.interface
import zope.app.container.contained
import zope.app.catalog.attribute
import zope.app.catalog.interfaces
class IKeywordIndex(zope.app.catalog.interfaces.IAttributeIndex,
zope.app.catalog.interfaces.ICatalogIndex):
"""Interface-based catalog keyword index.
"""
class KeywordIndex(zope.app.catalog.attribute.AttributeIndex,
zope.index.keyword.KeywordIndex,
zope.app.container.contained.Contained):
zope.interface.implements(IKeywordIndex)

View file

@ -1,46 +0,0 @@
#
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Customer classes.
$Id$
"""
from zope.interface import implements, Interface
from cybertools.commerce.common import RelationSet, BaseObject
from cybertools.commerce.interfaces import ICustomer, IAddress
class Customer(BaseObject):
implements(ICustomer)
def __init__(self, customerId, title=None, client=None):
self.name = self.customerId = customerId
self.title = title or u'unknown'
self.client = client
self.shops = self.collection(self, 'customers')
self.orders = self.collection(self, 'customer')
class Address(BaseObject):
implements(IAddress)

View file

@ -1,48 +0,0 @@
#
# Copyright (c) 2009 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Base classes.
$Id$
"""
from zope.interface import implements
from cybertools.commerce.common import RelationSet, BaseObject
from cybertools.commerce.interfaces import IShop
class Shop(BaseObject):
implements(IShop)
collection = RelationSet
def __init__(self, name, title=None):
self.name = name
self.title = title or u'Shop'
self.products = self.collection(self, 'shops')
self.customers = self.collection(self, 'shops')
self.orderNumber = 0
def getNewOrderId(self):
last = self.orderNumber or 0
num = last + 1
self.orderNumber = num
return '%05i' % num

View file

@ -1,62 +0,0 @@
#
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Basic classes for complex template structures.
$Id$
"""
from zope.interface import implements
from cybertools.composer.interfaces import IComponent, IElement, ICompound
from cybertools.composer.interfaces import ITemplate
from cybertools.util.jeep import Jeep
class Component(object):
implements(IComponent)
class Element(Component):
implements(IElement)
class Compound(Component):
implements(ICompound)
componentStorage = Jeep
def __init__(self):
self.parts = self.componentStorage()
class Template(object):
implements(ITemplate)
componentStorage = Jeep
components = None
def __init__(self):
if self.componentStorage is not None:
self.components = self.componentStorage()

View file

@ -1,55 +0,0 @@
#
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Base classes to be used for client adapters.
$Id$
"""
from zope.interface import implements
from cybertools.composer.interfaces import IInstance
class Instance(object):
implements(IInstance)
templateFactory = dict
templateAttributeName = '__ctc_template__'
aspect = 'composer.default'
def __init__(self, context):
self.context = context
def setTemplate(self, temp):
template = getattr(self.context,
self.templateAttributeName,
self.templateFactory())
template.setdefault(self.aspect, temp)
setattr(self.context, self.templateAttributeName, template)
def getTemplate(self):
template = getattr(self.context, self.templateAttributeName, {})
return template.get(self.aspect, [])
template = property(getTemplate, setTemplate)
def applyTemplates(self, *args, **kw):
raise ValueError('To be implemented by subclass')

View file

@ -1,43 +0,0 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Default layouts for the liquid skin.
$Id$
"""
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from zope import component
from zope.interface import implements
from cybertools.browser.liquid import Liquid
from cybertools.browser.renderer import RendererFactory
from cybertools.composer.layout.base import Layout
from cybertools.composer.layout.browser.standard import standardRenderers
defaultRenderers = RendererFactory(ViewPageTemplateFile('default.pt'))
Layout('css.liquid', 'page.css', renderer=standardRenderers['css'],
media='all', resource='liquid.css', skin=Liquid)
Layout('body.liquid', 'page.body', renderer=defaultRenderers.body,
skin=Liquid)

View file

@ -1,39 +0,0 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Region implementation.
$Id$
"""
from zope.interface import implements
from cybertools.composer.layout.interfaces import IRegion
from cybertools.util.jeep import Jeep
class Region(object):
implements(IRegion)
allowedLayoutCategories = None
def __init__(self, name):
self.name = name
self.layouts = Jeep()

View file

@ -1,52 +0,0 @@
#
# Copyright (c) 2007 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Rule instance and related classes.
$Id$
"""
from zope import component
from zope.component import adapts
from zope.interface import Interface, implements
from cybertools.composer.instance import Instance
from cybertools.composer.rule.interfaces import IRuleInstance, IActionHandler
class RuleInstance(Instance):
implements(IRuleInstance)
adapts(Interface)
template = None
event = None
def applyTemplate(self, **kw):
for c in self.template.conditions:
cond = component.getAdapter(self, ICondition, name=c)
if not cond():
continue
data = dict(request=self.event.request)
for action in self.template.actions:
handler = component.getAdapter(self, IActionHandler,
name=action.handlerName)
data = handler(data, action.parameters)
return data

View file

@ -1,55 +0,0 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Ordered container implementation.
$Id$
"""
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.app.container.browser.contents import JustContents
from zope.app.i18n import ZopeMessageFactory as _
from zope.cachedescriptors.property import Lazy
from zope.interface import Interface
contents_template = ViewPageTemplateFile('contents.pt')
class ContainerView(JustContents):
def checkMoveAction(self):
pass
orderable = False
# informations for the ajax.inner.html view (template):
template = contents_template
#@Lazy
#def template(self):
# basicView = zapi.getMultiAdapter((self.context, self.request),
# Interface, name=u'contents.html')
# return basicView.index
@Lazy
def macro(self):
return self.template.macros['contents']

6
cybertools/__init__.py Normal file
View file

@ -0,0 +1,6 @@
# package cybertools
# module aliases
import sys
import doctest
sys.modules['zope.testing.doctestunit'] = doctest

View file

@ -1,28 +1,10 @@
#
# Copyright (c) 2008 Helmut Merz - helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Embed Dojo using the cybertools.composer.layout procedure.
# cybertools.ajax.dojo.layout
$Id$
""" Embed Dojo using the cybertools.composer.layout procedure.
"""
from cStringIO import StringIO
from zope.app.pagetemplate import ViewPageTemplateFile
from io import StringIO
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from cybertools.browser.renderer import RendererFactory

View file

@ -1,38 +1,18 @@
#
# Copyright (c) 2006 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# cybertools.brain.neuron
"""
A simple basic implementation of Neuron and Synapsis.
$Id$
""" A simple basic implementation of Neuron and Synapsis.
"""
from zope.interface import implements
from zope.interface import implementer
from cybertools.brain.interfaces import INeuron, ISynapsis
from cybertools.brain.state import State, Transition
@implementer(ISynapsis)
class Synapsis(object):
""" A synapsis connects two neurons.
"""
implements(ISynapsis)
def __init__(self, sender, receiver):
self.sender = sender
sender.receivers.append(self)
@ -46,10 +26,9 @@ class Synapsis(object):
receiver.notify(session)
@implementer(INeuron)
class Neuron(object):
implements(INeuron)
def __init__(self):
self.senders = []
self.receivers = []

View file

@ -0,0 +1,21 @@
# cybertools.brain.session
""" Transaction management.
"""
from zope.interface import implementer
from cybertools.brain.interfaces import ISession
implementer(ISession)
class Session(object):
def __init__(self):
self.states = {}
def setState(self, neuron, state):
self.states[neuron] = state
def getState(self, neuron):
return self.states.get(neuron, neuron.state)

34
cybertools/brain/state.py Normal file
View file

@ -0,0 +1,34 @@
# cybertools.brain.state
""" Base classes for state and state manipulations using a float-based state.
"""
from zope.interface import implementer
from cybertools.brain.interfaces import IState, ITransition
@implementer(IState)
class State(object):
""" The state of a neuron.
"""
def __init__(self, value=0.0):
self.value = value
def __repr__(self):
return '<State %0.1f>' % self.value
@implementer(ITransition)
class Transition(object):
def __init__(self, synapsis, factor=1.0):
self.synapsis = synapsis
self.factor = factor
def execute(self, session=None):
oldState = self.synapsis.receiver.getState(session)
senderState = self.synapsis.sender.getState(session)
return State(oldState.value + senderState.value * self.factor)

View file

@ -1,3 +1,4 @@
# cybertools.brain.tests
import unittest, doctest
from zope.interface.verify import verifyClass
@ -18,9 +19,8 @@ class TestBrain(unittest.TestCase):
def test_suite():
flags = doctest.NORMALIZE_WHITESPACE | doctest.ELLIPSIS
return unittest.TestSuite((
unittest.makeSuite(TestBrain),
doctest.DocFileSuite('README.txt',
optionflags=flags,),
unittest.TestLoader().loadTestsFromTestCase(TestBrain),
doctest.DocFileSuite('README.txt', optionflags=flags,),
))
if __name__ == '__main__':

View file

@ -3,7 +3,7 @@ Browser View Tools
==================
>>> from zope import component, interface
>>> from zope.interface import Interface, implements
>>> from zope.interface import Interface, implementer
>>> from zope.publisher.interfaces.browser import IBrowserRequest
@ -17,8 +17,10 @@ the common and node modules there.)
Let's start with a dummy content object and create a view on it:
>>> #@implementer(Interface)
>>> class SomeObject(object):
... implements(Interface)
... pass
>>> SomeObject = implementer(Interface)(SomeObject)
>>> obj = SomeObject()
>>> from cybertools.browser.view import GenericView
@ -122,7 +124,7 @@ ZPT macros:
>>> len(cssMacros)
4
>>> m1 = cssMacros[0]
>>> print m1.name, m1.media, m1.resourceName
>>> print(m1.name, m1.media, m1.resourceName)
css all zope3_tablelayout.css
Calling a macro provided by Controller.macros[] returns the real ZPT macro:
@ -138,7 +140,7 @@ The pre-set collection of macros for a certain slot may be extended
>>> len(controller.macros['css'])
5
>>> m5 = controller.macros['css'][4]
>>> print m5.name, m5.media, m5.resourceName
>>> print(m5.name, m5.media, m5.resourceName)
css all node.css
If an identifier is given (the second parameter) a certain macro is only
@ -221,7 +223,7 @@ controller issues a redirect.
>>> from cybertools.browser.form import IFormController, FormController
>>> class MyController(FormController):
... def update(self):
... print 'updating...'
... print('updating...')
... return True
>>> component.provideAdapter(MyController, (View, IBrowserRequest),

View file

@ -1,31 +1,12 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# cybertools.browser.action
"""
Base classes (sort of views) for action portlet items.
$Id$
""" Base classes (sort of views) for action portlet items.
"""
from copy import copy
from urllib import urlencode
from urllib.parse import urlencode
from zope import component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
action_macros = ViewPageTemplateFile('action_macros.pt')

View file

Before

Width:  |  Height:  |  Size: 655 B

After

Width:  |  Height:  |  Size: 655 B

View file

Before

Width:  |  Height:  |  Size: 455 B

After

Width:  |  Height:  |  Size: 455 B

View file

Before

Width:  |  Height:  |  Size: 537 B

After

Width:  |  Height:  |  Size: 537 B

View file

Before

Width:  |  Height:  |  Size: 777 B

After

Width:  |  Height:  |  Size: 777 B

View file

Before

Width:  |  Height:  |  Size: 641 B

After

Width:  |  Height:  |  Size: 641 B

View file

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View file

Before

Width:  |  Height:  |  Size: 691 B

After

Width:  |  Height:  |  Size: 691 B

View file

Before

Width:  |  Height:  |  Size: 741 B

After

Width:  |  Height:  |  Size: 741 B

View file

Before

Width:  |  Height:  |  Size: 591 B

After

Width:  |  Height:  |  Size: 591 B

View file

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 46 KiB

View file

Before

Width:  |  Height:  |  Size: 663 B

After

Width:  |  Height:  |  Size: 663 B

View file

Before

Width:  |  Height:  |  Size: 195 B

After

Width:  |  Height:  |  Size: 195 B

View file

@ -9,7 +9,7 @@
<div class="top span-6"
metal:define-slot="top">
<a href="#" name="top" metal:define-slot="logo"
tal:attributes="href string:${request/URL/1}"><img class="logo"
tal:attributes="href string:${view/requestUrl/1}"><img class="logo"
src="logo.gif" border="0" alt="Home"
tal:attributes="src string:${resourceBase}logo.gif" /></a>
<div metal:define-slot="top-actions">

View file

@ -1,5 +1,5 @@
#
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de
# Copyright (c) 2014 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@ -37,9 +37,9 @@ class Controller(BaseController):
macros = self.macros
presentationMode = self.request.get('liquid.viewmode') == 'presentation'
params = [('blue/blue8.css', 'all', 20, False),
('print.css', 'print', 25, False),
('blue/ie.css', 'all', 30, True),
('custom.css', 'all', 100, False)]
('custom.css', 'all', 100, False),
('print.css', 'print', 200, False),]
#if presentationMode:
# params.append(('presentation.css', 'all', 30, False))
for id, media, prio, ie in params:

View file

Before

Width:  |  Height:  |  Size: 103 B

After

Width:  |  Height:  |  Size: 103 B

View file

@ -1,32 +1,13 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# cybertools.browser.configurator
"""
A view configurator provides configuration data for a view controller.
$Id$
""" A view configurator provides configuration data for a view controller.
"""
from zope import component
from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations
from zope.annotation.attribute import AttributeAnnotations
from zope.cachedescriptors.property import Lazy
from zope.interface import Interface, Attribute, implements
from zope.interface import Interface, Attribute, implementer
# interfaces
@ -63,12 +44,11 @@ class IMacroViewProperty(IViewProperty):
#default implementations
@implementer(IViewConfigurator)
class ViewConfigurator(object):
""" An base class for adapters that allow the registration of view properties.
"""
implements(IViewConfigurator)
def __init__(self, context, request):
self.context = context
self.request = request
@ -109,10 +89,9 @@ class AnnotationViewConfigurator(ViewConfigurator):
return vp
@implementer(IViewProperty)
class ViewProperty(object):
implements(IViewProperty)
def __init__(self, context, request):
self.context = context
self.request = request
@ -128,10 +107,9 @@ class ViewProperty(object):
self.params = params
@implementer(IMacroViewProperty)
class MacroViewProperty(ViewProperty):
implements(IMacroViewProperty)
template = None
def setParams(self, params):

View file

@ -1,29 +1,10 @@
#
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# cybertools.browser.controller
"""
Controller for views, templates, macros.
$Id$
""" Controller for views, templates, macros.
"""
from zope import component
from zope.app.pagetemplate import ViewPageTemplateFile
from zope.browserpage import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy
from cybertools.browser.configurator import IViewConfigurator, IMacroViewProperty

View file

@ -0,0 +1,29 @@
# cybertools.browser.form
"""Form Controller stuff: form processing is the part of the
model/view/controller pattern that deals withform input.
"""
from zope.interface import Interface, implementer
class IFormController(Interface):
""" Used as a named adapter by GenericView for processing form input.
"""
def update():
""" Processing form input...
"""
@implementer(IFormController)
class FormController(object):
def __init__(self, context, request):
self.view = self.__parent__ = view = context
self.context = view.context # the controller is adapted to a view
self.request = request
def update(self):
pass

View file

Before

Width:  |  Height:  |  Size: 703 B

After

Width:  |  Height:  |  Size: 703 B

View file

Before

Width:  |  Height:  |  Size: 345 B

After

Width:  |  Height:  |  Size: 345 B

View file

Before

Width:  |  Height:  |  Size: 349 B

After

Width:  |  Height:  |  Size: 349 B

View file

Before

Width:  |  Height:  |  Size: 372 B

After

Width:  |  Height:  |  Size: 372 B

View file

Before

Width:  |  Height:  |  Size: 52 B

After

Width:  |  Height:  |  Size: 52 B

View file

Before

Width:  |  Height:  |  Size: 52 B

After

Width:  |  Height:  |  Size: 52 B

View file

Before

Width:  |  Height:  |  Size: 702 B

After

Width:  |  Height:  |  Size: 702 B

View file

Before

Width:  |  Height:  |  Size: 680 B

After

Width:  |  Height:  |  Size: 680 B

View file

Before

Width:  |  Height:  |  Size: 792 B

After

Width:  |  Height:  |  Size: 792 B

View file

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View file

Before

Width:  |  Height:  |  Size: 8.9 KiB

After

Width:  |  Height:  |  Size: 8.9 KiB

View file

Before

Width:  |  Height:  |  Size: 4.7 KiB

After

Width:  |  Height:  |  Size: 4.7 KiB

View file

Before

Width:  |  Height:  |  Size: 641 B

After

Width:  |  Height:  |  Size: 641 B

Some files were not shown because too many files have changed in this diff Show more