Initial commit
This commit is contained in:
commit
898ea15674
|
@ -0,0 +1,14 @@
|
|||
Copyright (C) 2014 Zikzakmedia SL.
|
||||
|
||||
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 3 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, see <http://www.gnu.org/licenses/>.
|
|
@ -0,0 +1,29 @@
|
|||
Installing trytond-whooshsearch
|
||||
===============================
|
||||
|
||||
Prerequisites
|
||||
-------------
|
||||
|
||||
* Python 2.7 or later (http://www.python.org/)
|
||||
* trytond (http://www.tryton.org/)
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Once you've downloaded and unpacked the trytond-whoosh source release, enter the
|
||||
directory where the archive was unpacked, and run:
|
||||
|
||||
python setup.py install
|
||||
|
||||
Note that you may need administrator/root privileges for this step, as
|
||||
this command will by default attempt to install module to the Python
|
||||
site-packages directory on your system.
|
||||
|
||||
For advanced options, please refer to the easy_install and/or the distutils
|
||||
documentation:
|
||||
|
||||
http://peak.telecommunity.com/DevCenter/EasyInstall
|
||||
http://docs.python.org/inst/inst.html
|
||||
|
||||
To use without installation, extract the archive into ``trytond/modules`` with
|
||||
the directory name whoosh.
|
|
@ -0,0 +1,674 @@
|
|||
GNU GENERAL PUBLIC LICENSE
|
||||
Version 3, 29 June 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU General Public License is a free, copyleft license for
|
||||
software and other kinds of works.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
the GNU General Public License is intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users. We, the Free Software Foundation, use the
|
||||
GNU General Public License for most of our software; it applies also to
|
||||
any other work released this way by its authors. You can apply it to
|
||||
your programs, too.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
To protect your rights, we need to prevent others from denying you
|
||||
these rights or asking you to surrender the rights. Therefore, you have
|
||||
certain responsibilities if you distribute copies of the software, or if
|
||||
you modify it: responsibilities to respect the freedom of others.
|
||||
|
||||
For example, if you distribute copies of such a program, whether
|
||||
gratis or for a fee, you must pass on to the recipients the same
|
||||
freedoms that you received. You must make sure that they, too, receive
|
||||
or can get the source code. And you must show them these terms so they
|
||||
know their rights.
|
||||
|
||||
Developers that use the GNU GPL protect your rights with two steps:
|
||||
(1) assert copyright on the software, and (2) offer you this License
|
||||
giving you legal permission to copy, distribute and/or modify it.
|
||||
|
||||
For the developers' and authors' protection, the GPL clearly explains
|
||||
that there is no warranty for this free software. For both users' and
|
||||
authors' sake, the GPL requires that modified versions be marked as
|
||||
changed, so that their problems will not be attributed erroneously to
|
||||
authors of previous versions.
|
||||
|
||||
Some devices are designed to deny users access to install or run
|
||||
modified versions of the software inside them, although the manufacturer
|
||||
can do so. This is fundamentally incompatible with the aim of
|
||||
protecting users' freedom to change the software. The systematic
|
||||
pattern of such abuse occurs in the area of products for individuals to
|
||||
use, which is precisely where it is most unacceptable. Therefore, we
|
||||
have designed this version of the GPL to prohibit the practice for those
|
||||
products. If such problems arise substantially in other domains, we
|
||||
stand ready to extend this provision to those domains in future versions
|
||||
of the GPL, as needed to protect the freedom of users.
|
||||
|
||||
Finally, every program is threatened constantly by software patents.
|
||||
States should not allow patents to restrict development and use of
|
||||
software on general-purpose computers, but in those that do, we wish to
|
||||
avoid the special danger that patents applied to a free program could
|
||||
make it effectively proprietary. To prevent this, the GPL assures that
|
||||
patents cannot be used to render the program non-free.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Use with the GNU Affero General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU Affero General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the special requirements of the GNU Affero General Public License,
|
||||
section 13, concerning interaction through a network will apply to the
|
||||
combination as such.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU General Public License from time to time. Such new versions will
|
||||
be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
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 3 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, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If the program does terminal interaction, make it output a short
|
||||
notice like this when it starts in an interactive mode:
|
||||
|
||||
<program> Copyright (C) <year> <name of author>
|
||||
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||
This is free software, and you are welcome to redistribute it
|
||||
under certain conditions; type `show c' for details.
|
||||
|
||||
The hypothetical commands `show w' and `show c' should show the appropriate
|
||||
parts of the General Public License. Of course, your program's commands
|
||||
might be different; for a GUI interface, you would use an "about box".
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU GPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
||||
|
||||
The GNU General Public License does not permit incorporating your program
|
||||
into proprietary programs. If your program is a subroutine library, you
|
||||
may consider it more useful to permit linking proprietary applications with
|
||||
the library. If this is what you want to do, use the GNU Lesser General
|
||||
Public License instead of this License. But first, please read
|
||||
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
|
|
@ -0,0 +1,13 @@
|
|||
include INSTALL
|
||||
include README
|
||||
include TODO
|
||||
include COPYRIGHT
|
||||
include CHANGELOG
|
||||
include LICENSE
|
||||
include tryton.cfg
|
||||
include *.xml
|
||||
include view/*.xml
|
||||
include locale/*.po
|
||||
include doc/*
|
||||
include tests/*.rst
|
||||
include icons/*
|
|
@ -0,0 +1,43 @@
|
|||
trytond-whooshsearch
|
||||
====================
|
||||
|
||||
The Whoosh module of the Tryton application platform.
|
||||
|
||||
Installing
|
||||
----------
|
||||
|
||||
See INSTALL
|
||||
|
||||
Support
|
||||
-------
|
||||
|
||||
For more information or if you encounter any problems with this module,
|
||||
please contact the programmers at
|
||||
|
||||
Zikzakmedia
|
||||
--------------
|
||||
website: http://www.zikzakmedia.com/
|
||||
email: zikzak@zikzakmedia.com
|
||||
|
||||
If you encounter any problems with Tryton, please don't hesitate to ask
|
||||
questions on the Tryton bug tracker, mailing list, wiki or IRC channel:
|
||||
|
||||
http://bugs.tryton.org/
|
||||
http://groups.tryton.org/
|
||||
http://wiki.tryton.org/
|
||||
irc://irc.freenode.net/tryton
|
||||
|
||||
License
|
||||
-------
|
||||
|
||||
See LICENSE
|
||||
|
||||
Copyright
|
||||
---------
|
||||
|
||||
See COPYRIGHT
|
||||
|
||||
|
||||
For more information please visit the Tryton web site:
|
||||
|
||||
http://www.tryton.org/
|
|
@ -0,0 +1,17 @@
|
|||
# This file is part whooshsearch module for Tryton.
|
||||
# The COPYRIGHT file at the top level of this repository contains
|
||||
# the full copyright notices and license terms.
|
||||
from trytond.pool import Pool
|
||||
from .whooshsearch import *
|
||||
|
||||
def register():
|
||||
Pool.register(
|
||||
WhooshSchema,
|
||||
WhooshField,
|
||||
WhooshWhooshLang,
|
||||
WhooshSchemaGroup,
|
||||
WhooshSchemaStart,
|
||||
module='whooshsearch', type_='model')
|
||||
Pool.register(
|
||||
WhooshSearch,
|
||||
module='whooshsearch', type_='wizard')
|
|
@ -0,0 +1,6 @@
|
|||
#:inside:trytond_doc/admin:toctree:administracion_y_configuracion#
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
whooshsearch
|
|
@ -0,0 +1,5 @@
|
|||
======
|
||||
Whoosh
|
||||
======
|
||||
|
||||
Genera a partir de modelos/campos una indexación para el motor de búsqueda Whoosh.
|
|
@ -0,0 +1,60 @@
|
|||
=====================================
|
||||
Whoosh. Indexación (Full Text Search)
|
||||
=====================================
|
||||
|
||||
Whoosh es una librería de indexación y búsqueda. Nos permite generar distintos
|
||||
esquemas (schemas) por cada modelo de nuestro ERP para después indexar contenidos
|
||||
en él y hacer búsquedas.
|
||||
|
||||
Un ejemplo seria un esquema sobre productos y la indexación para la posterior
|
||||
búsqueda de productos en él.
|
||||
|
||||
.. inheritref:: whooshsearch/whooshsearch:section:esquemas
|
||||
|
||||
Esquemas
|
||||
--------
|
||||
|
||||
Un esquema está relacionado con un modelo y este contendrá varios campos que nos
|
||||
permiten indexar.
|
||||
|
||||
Cada esquema irá relacionado con uno o varios idiomas. Por cada idioma, se genera
|
||||
un esquema distinto. En el caso que no seleccione ningún idioma en esquema, se usará
|
||||
el idioma por defecto el usuario.
|
||||
|
||||
En los esquemas disponemos del campo "Dominio" para filtrar registros que contengan
|
||||
esta condición y sólo se indexen estos (filtro de que registros).
|
||||
|
||||
Por cada esquema le podemos añadir que grupos de usuarios tendrán acceso. Esto nos
|
||||
permite en el asistente de "Buscar" sólo se nos mostrarán los esquemas según los
|
||||
grupos del usuario.
|
||||
|
||||
Para crear o modificar un esquema deberemos accionar el botón "Crear esquema".
|
||||
|
||||
.. warning:: En el caso que hayamos eliminado registros (por ejemplo, eliminar o
|
||||
desactivar productos), el contenido del esquema no se han eliminado.
|
||||
En este caso, elimine el esquema, y vuelve a generar el esquema y
|
||||
posteriormente la generación de la indexación.
|
||||
|
||||
.. inheritref:: whooshsearch/whooshsearch:section:campos
|
||||
|
||||
Campos
|
||||
------
|
||||
|
||||
En cada esquema seleccionaremos los campos que desearemos que se incluyen. Cada campo
|
||||
podemos usar un nombre distinto en nuestro esquema si lo deseamos. Por ejemplo, en
|
||||
comercio electrónico, el campo "name" lo podemos renombrar como "title" y el campo
|
||||
"description" lo podemos renombrar como "content".
|
||||
|
||||
En un esquema como mínimo seleccionaremos un campo "Parser" que se usara como campo
|
||||
para la búsqueda.
|
||||
|
||||
.. inheritref:: whooshsearch/whooshsearch:section:buscar
|
||||
|
||||
Buscar
|
||||
------
|
||||
|
||||
Disponemos de un asistente para hacer búsquedas. En el asistente seleccionamos que
|
||||
esquema deseamos buscar y el texto a buscar.
|
||||
|
||||
Podemos usar el signo "+" para unir palabras en la búsqueda (AND) y podemos
|
||||
usar el signo "-" para omitir palabras (NOT).
|
|
@ -0,0 +1,4 @@
|
|||
Whoosh Module
|
||||
#############
|
||||
|
||||
Tryton module generate Whoosh indexing
|
|
@ -0,0 +1,833 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:a="http://ns.adobe.com/AdobeSVGViewerExtensions/3.0/"
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64px"
|
||||
height="64px"
|
||||
id="svg3471"
|
||||
sodipodi:version="0.32"
|
||||
inkscape:version="0.48.4 r9939"
|
||||
sodipodi:docname="tryton-searching.svg"
|
||||
inkscape:output_extension="org.inkscape.output.svg.inkscape"
|
||||
version="1.1">
|
||||
<defs
|
||||
id="defs3473">
|
||||
<linearGradient
|
||||
id="linearGradient3212">
|
||||
<stop
|
||||
style="stop-color:#fffff2;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3214" />
|
||||
<stop
|
||||
style="stop-color:#fffff2;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3216" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3212"
|
||||
id="linearGradient3230"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="164.10248"
|
||||
y1="472.9617"
|
||||
x2="199.2081"
|
||||
y2="538.2522" />
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 32 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="64 : 32 : 1"
|
||||
inkscape:persp3d-origin="32 : 21.333333 : 1"
|
||||
id="perspective3479" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient5571"
|
||||
id="linearGradient3009"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.9069282,0,0,1.9069282,65.660981,-1088.5263)"
|
||||
x1="287.26981"
|
||||
y1="678.03345"
|
||||
x2="286.95731"
|
||||
y2="715.93921" />
|
||||
<linearGradient
|
||||
id="linearGradient5571">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:0;"
|
||||
offset="0"
|
||||
id="stop5573" />
|
||||
<stop
|
||||
style="stop-color:#ededed;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop5575" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="116.0049"
|
||||
y1="116.0059"
|
||||
x2="11.9932"
|
||||
y2="11.9942"
|
||||
id="gradient_1_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#264fa1;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop16" />
|
||||
<stop
|
||||
style="stop-color:#2658a1;stop-opacity:1"
|
||||
offset="0.1134"
|
||||
id="stop18" />
|
||||
<stop
|
||||
style="stop-color:#2570a1;stop-opacity:1"
|
||||
offset="0.29840001"
|
||||
id="stop20" />
|
||||
<stop
|
||||
style="stop-color:#2492a1;stop-opacity:1"
|
||||
offset="0.5"
|
||||
id="stop22" />
|
||||
<stop
|
||||
style="stop-color:#2489a0;stop-opacity:1"
|
||||
offset="0.61470002"
|
||||
id="stop24" />
|
||||
<stop
|
||||
style="stop-color:#26719f;stop-opacity:1"
|
||||
offset="0.8017"
|
||||
id="stop26" />
|
||||
<stop
|
||||
style="stop-color:#27509d;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop28" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.5" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#27509D"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="149.5"
|
||||
y1="186.5"
|
||||
x2="149.5"
|
||||
y2="186.5"
|
||||
id="XMLID_1_"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#264fa1;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop35" />
|
||||
<stop
|
||||
style="stop-color:#2658a1;stop-opacity:1"
|
||||
offset="0.1134"
|
||||
id="stop37" />
|
||||
<stop
|
||||
style="stop-color:#2570a1;stop-opacity:1"
|
||||
offset="0.29840001"
|
||||
id="stop39" />
|
||||
<stop
|
||||
style="stop-color:#2492a1;stop-opacity:1"
|
||||
offset="0.5"
|
||||
id="stop41" />
|
||||
<stop
|
||||
style="stop-color:#2489a0;stop-opacity:1"
|
||||
offset="0.61470002"
|
||||
id="stop43" />
|
||||
<stop
|
||||
style="stop-color:#26719f;stop-opacity:1"
|
||||
offset="0.8017"
|
||||
id="stop45" />
|
||||
<stop
|
||||
style="stop-color:#27509d;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop47" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.5" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#27509D"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="116.0049"
|
||||
y1="116.0059"
|
||||
x2="11.9932"
|
||||
y2="11.9942"
|
||||
id="gradient_1_-1"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#264fa1;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop16-3" />
|
||||
<stop
|
||||
style="stop-color:#2658a1;stop-opacity:1"
|
||||
offset="0.1134"
|
||||
id="stop18-8" />
|
||||
<stop
|
||||
style="stop-color:#2570a1;stop-opacity:1"
|
||||
offset="0.29840001"
|
||||
id="stop20-6" />
|
||||
<stop
|
||||
style="stop-color:#2492a1;stop-opacity:1"
|
||||
offset="0.5"
|
||||
id="stop22-5" />
|
||||
<stop
|
||||
style="stop-color:#2489a0;stop-opacity:1"
|
||||
offset="0.61470002"
|
||||
id="stop24-4" />
|
||||
<stop
|
||||
style="stop-color:#26719f;stop-opacity:1"
|
||||
offset="0.8017"
|
||||
id="stop26-2" />
|
||||
<stop
|
||||
style="stop-color:#27509d;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop28-4" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.5" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#27509D"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
x1="149.5"
|
||||
y1="186.5"
|
||||
x2="149.5"
|
||||
y2="186.5"
|
||||
id="XMLID_1_-8"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop
|
||||
style="stop-color:#264fa1;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop35-7" />
|
||||
<stop
|
||||
style="stop-color:#2658a1;stop-opacity:1"
|
||||
offset="0.1134"
|
||||
id="stop37-9" />
|
||||
<stop
|
||||
style="stop-color:#2570a1;stop-opacity:1"
|
||||
offset="0.29840001"
|
||||
id="stop39-2" />
|
||||
<stop
|
||||
style="stop-color:#2492a1;stop-opacity:1"
|
||||
offset="0.5"
|
||||
id="stop41-8" />
|
||||
<stop
|
||||
style="stop-color:#2489a0;stop-opacity:1"
|
||||
offset="0.61470002"
|
||||
id="stop43-0" />
|
||||
<stop
|
||||
style="stop-color:#26719f;stop-opacity:1"
|
||||
offset="0.8017"
|
||||
id="stop45-3" />
|
||||
<stop
|
||||
style="stop-color:#27509d;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop47-5" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#264FA1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.5" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#2492A1"
|
||||
offset="0.6" />
|
||||
<a:midPointStop
|
||||
style="stop-color:#27509D"
|
||||
offset="1" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4477"
|
||||
id="radialGradient1527"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1,0,0,0.237968,0,28.93278)"
|
||||
cx="24.130018"
|
||||
cy="37.967922"
|
||||
fx="24.130018"
|
||||
fy="37.967922"
|
||||
r="16.528622" />
|
||||
<linearGradient
|
||||
id="linearGradient4477"
|
||||
inkscape:collect="always">
|
||||
<stop
|
||||
id="stop4479"
|
||||
offset="0"
|
||||
style="stop-color:#000000;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4481"
|
||||
offset="1"
|
||||
style="stop-color:#000000;stop-opacity:0;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2846"
|
||||
id="linearGradient1529"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="27.366341"
|
||||
y1="26.580296"
|
||||
x2="31.335964"
|
||||
y2="30.557772" />
|
||||
<linearGradient
|
||||
id="linearGradient2846">
|
||||
<stop
|
||||
style="stop-color:#8a8a8a;stop-opacity:1.0000000;"
|
||||
offset="0.0000000"
|
||||
id="stop2848" />
|
||||
<stop
|
||||
style="stop-color:#484848;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2850" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4440"
|
||||
id="linearGradient1531"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(1.334593,0,0,1.291292,-6.973842,-7.460658)"
|
||||
x1="30.65625"
|
||||
y1="34"
|
||||
x2="33.21875"
|
||||
y2="31.0625" />
|
||||
<linearGradient
|
||||
id="linearGradient4440">
|
||||
<stop
|
||||
id="stop4442"
|
||||
offset="0"
|
||||
style="stop-color:#7d7d7d;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#b1b1b1;stop-opacity:1.0000000;"
|
||||
offset="0.50000000"
|
||||
id="stop4448" />
|
||||
<stop
|
||||
id="stop4444"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#686868;stop-opacity:1.0000000;" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2366"
|
||||
id="linearGradient1533"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="18.292673"
|
||||
y1="13.602121"
|
||||
x2="17.500893"
|
||||
y2="25.743469" />
|
||||
<linearGradient
|
||||
id="linearGradient2366">
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2368" />
|
||||
<stop
|
||||
id="stop2374"
|
||||
offset="0.50000000"
|
||||
style="stop-color:#ffffff;stop-opacity:0.21904762;" />
|
||||
<stop
|
||||
style="stop-color:#ffffff;stop-opacity:1.0000000;"
|
||||
offset="1.0000000"
|
||||
id="stop2370" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4454"
|
||||
id="radialGradient1537"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
cx="18.240929"
|
||||
cy="21.817987"
|
||||
fx="18.240929"
|
||||
fy="21.817987"
|
||||
r="8.3085051" />
|
||||
<linearGradient
|
||||
id="linearGradient4454">
|
||||
<stop
|
||||
id="stop4456"
|
||||
offset="0.0000000"
|
||||
style="stop-color:#729fcf;stop-opacity:0.20784314;" />
|
||||
<stop
|
||||
id="stop4458"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#729fcf;stop-opacity:0.67619050;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient4467"
|
||||
id="radialGradient1539"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(2.592963,0,0,2.252104,-25.05975,-18.941)"
|
||||
cx="15.414371"
|
||||
cy="13.078408"
|
||||
fx="15.414371"
|
||||
fy="13.078408"
|
||||
r="6.65625" />
|
||||
<linearGradient
|
||||
id="linearGradient4467">
|
||||
<stop
|
||||
id="stop4469"
|
||||
offset="0"
|
||||
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||
<stop
|
||||
id="stop4471"
|
||||
offset="1.0000000"
|
||||
style="stop-color:#ffffff;stop-opacity:0.24761905;" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
r="6.65625"
|
||||
fy="13.078408"
|
||||
fx="15.414371"
|
||||
cy="13.078408"
|
||||
cx="15.414371"
|
||||
gradientTransform="matrix(2.592963,0,0,2.252104,-25.05975,-18.941)"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
id="radialGradient3134"
|
||||
xlink:href="#linearGradient4467"
|
||||
inkscape:collect="always" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2882"
|
||||
id="linearGradient2989"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="17.006248"
|
||||
y1="34.714287"
|
||||
x2="6.4563808"
|
||||
y2="38.523811"
|
||||
gradientTransform="matrix(-0.801316,-0.801316,-0.937726,0.937726,78.61505,25.91377)" />
|
||||
<linearGradient
|
||||
id="linearGradient2882">
|
||||
<stop
|
||||
style="stop-color:#5e5e5e;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2884" />
|
||||
<stop
|
||||
id="stop2890"
|
||||
offset="0.3392857"
|
||||
style="stop-color:#bbb;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop2886" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3120"
|
||||
id="linearGradient3126"
|
||||
x1="41.179733"
|
||||
y1="42.642097"
|
||||
x2="46.466469"
|
||||
y2="46.35638"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.707107,0.707107,-0.707107,0.707107,36.39568,-16.50071)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3120">
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop3122" />
|
||||
<stop
|
||||
style="stop-color:#2e3436;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop3124" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2882"
|
||||
id="linearGradient2943"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(-0.300031,-0.300031,-0.937726,0.937726,65.90146,13.4681)"
|
||||
x1="32.602097"
|
||||
y1="32.222221"
|
||||
x2="46.191555"
|
||||
y2="39.523808" />
|
||||
<linearGradient
|
||||
id="linearGradient3097">
|
||||
<stop
|
||||
style="stop-color:#5e5e5e;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3099" />
|
||||
<stop
|
||||
id="stop3101"
|
||||
offset="0.3392857"
|
||||
style="stop-color:#bbb;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3103" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2870"
|
||||
id="linearGradient2993"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
x1="6.4938741"
|
||||
y1="37.253971"
|
||||
x2="17.035713"
|
||||
y2="31.984127"
|
||||
gradientTransform="matrix(0.801316,0.801316,-0.937726,0.937726,38.23962,-14.37236)" />
|
||||
<linearGradient
|
||||
id="linearGradient2870">
|
||||
<stop
|
||||
style="stop-color:#c8c8c8;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2872" />
|
||||
<stop
|
||||
id="stop2878"
|
||||
offset="0.5"
|
||||
style="stop-color:#f5f5f5;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:#a6a6a6;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop2874" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2768"
|
||||
id="radialGradient2780"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.819915,0.825713,-4.242328,4.218819,108.7504,-85.37568)"
|
||||
cx="24.99999"
|
||||
cy="21.500006"
|
||||
fx="24.988815"
|
||||
fy="20.717813"
|
||||
r="9.9999924" />
|
||||
<linearGradient
|
||||
id="linearGradient2768">
|
||||
<stop
|
||||
style="stop-color:#5f5f5f;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2770" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop2772" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2830"
|
||||
id="linearGradient2836"
|
||||
x1="21.333336"
|
||||
y1="3.9222705"
|
||||
x2="27.189482"
|
||||
y2="39.764923"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.845056,0.845056,-0.937726,0.937726,37.14432,-15.46766)" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient2830">
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop2832" />
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:0.1254902"
|
||||
offset="1"
|
||||
id="stop2834" />
|
||||
</linearGradient>
|
||||
<radialGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2904"
|
||||
id="radialGradient2910"
|
||||
cx="20.615717"
|
||||
cy="19.266575"
|
||||
fx="20.615717"
|
||||
fy="19.266575"
|
||||
r="2.5271387"
|
||||
gradientTransform="matrix(0.887673,0.939084,-7.191088,6.869715,157.5193,-131.9547)"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
id="linearGradient2904">
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:0.50196081;"
|
||||
offset="0"
|
||||
id="stop2906" />
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop2908" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3254"
|
||||
id="linearGradient3260"
|
||||
x1="58.910931"
|
||||
y1="2.7760141"
|
||||
x2="61.007938"
|
||||
y2="5.1569667"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3254">
|
||||
<stop
|
||||
style="stop-color:#888a85;stop-opacity:1"
|
||||
offset="0"
|
||||
id="stop3256" />
|
||||
<stop
|
||||
style="stop-color:black;stop-opacity:1"
|
||||
offset="1"
|
||||
id="stop3258" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient3372"
|
||||
id="linearGradient3378"
|
||||
x1="19.142857"
|
||||
y1="45.142857"
|
||||
x2="27"
|
||||
y2="36.285713"
|
||||
gradientUnits="userSpaceOnUse" />
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
id="linearGradient3372">
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:0.50196081"
|
||||
offset="0"
|
||||
id="stop3374" />
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:0;"
|
||||
offset="1"
|
||||
id="stop3376" />
|
||||
</linearGradient>
|
||||
<linearGradient
|
||||
inkscape:collect="always"
|
||||
xlink:href="#linearGradient2882"
|
||||
id="linearGradient2985"
|
||||
gradientUnits="userSpaceOnUse"
|
||||
gradientTransform="matrix(0.300031,0.300031,-0.937726,0.937726,50.375,-1.939296)"
|
||||
x1="32.602097"
|
||||
y1="32.222221"
|
||||
x2="46.191555"
|
||||
y2="39.523808" />
|
||||
<linearGradient
|
||||
id="linearGradient3131">
|
||||
<stop
|
||||
style="stop-color:#5e5e5e;stop-opacity:1;"
|
||||
offset="0"
|
||||
id="stop3133" />
|
||||
<stop
|
||||
id="stop3135"
|
||||
offset="0.3392857"
|
||||
style="stop-color:#bbb;stop-opacity:1;" />
|
||||
<stop
|
||||
style="stop-color:white;stop-opacity:1;"
|
||||
offset="1"
|
||||
id="stop3137" />
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="4.2038081"
|
||||
inkscape:cx="50.552967"
|
||||
inkscape:cy="23.211774"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="true"
|
||||
inkscape:document-units="px"
|
||||
inkscape:grid-bbox="true"
|
||||
inkscape:window-width="1364"
|
||||
inkscape:window-height="711"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="28"
|
||||
inkscape:window-maximized="0" />
|
||||
<metadata
|
||||
id="metadata3476">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title />
|
||||
<dc:creator>
|
||||
<cc:Agent>
|
||||
<dc:title>Bertrand Chenal</dc:title>
|
||||
</cc:Agent>
|
||||
</dc:creator>
|
||||
<cc:license
|
||||
rdf:resource="" />
|
||||
</cc:Work>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
id="layer1"
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer">
|
||||
<g
|
||||
transform="translate(0.08022526,-0.01342164)"
|
||||
id="g3055">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
d="m 60.76189,30.857133 c 0,15.350854 -12.458663,27.809518 -27.809517,27.809518 -15.350853,0 -27.8095176,-12.458664 -27.8095176,-27.809518 0,-15.350854 12.4586646,-27.8095161 27.8095176,-27.8095161 15.350854,0 27.809517,12.4586621 27.809517,27.8095161 z M 53.835608,43.359654 C 59.467447,33.342069 54.592569,19.745662 42.954184,13.010532 31.315799,6.2754018 17.299384,8.9394241 11.667545,18.957011 6.0357065,28.974596 10.910585,42.571002 22.54897,49.306134 c 11.638385,6.73513 25.654799,4.071105 31.286638,-5.94648 z"
|
||||
style="color:#000000;fill:#ff3300;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.49999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
id="path3158" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcczcc"
|
||||
id="path2959"
|
||||
d="m 42.626074,35.650097 c 0,0 1.037076,11.173449 -1.987622,16.945516 -3.024699,5.772066 -8.987382,10.302985 -13.430164,10.682795 l -4.121052,-4.121052 c 0,0 5.525631,-3.911169 6.205605,-7.071406 0.679975,-3.160236 -3.485706,-5.569543 -3.485706,-5.569543 l 16.818939,-10.86631 z"
|
||||
style="fill:url(#linearGradient2989);fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3126);stroke-width:1.50000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcczcc"
|
||||
id="path2961"
|
||||
d="m 41.415401,37.015574 c 0,0 0.10385,10.566714 -2.24628,15.017193 -2.350132,4.450477 -8.556214,9.5556 -11.542682,9.400987 l -2.163543,-2.163543 c 0,0 4.287567,-3.473031 5.171644,-6.890113 0.918651,-3.550721 -2.721509,-6.293491 -2.721509,-6.293491 l 13.50237,-9.071033 z"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1.50000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.75294118;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcczcc"
|
||||
id="path2935"
|
||||
d="m 32.882714,26.263966 c 0,0 -7.354139,2.782238 -12.26686,6.666281 -4.912719,3.884043 -9.891478,9.398885 -11.5421384,12.570817 l 1.5430154,1.543016 c 0,0 3.942037,-4.184922 6.326477,-5.640693 2.384438,-1.455772 3.21128,-0.182397 3.21128,-0.182397 L 32.882714,26.263966 z"
|
||||
style="fill:url(#linearGradient2943);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.49999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscsc"
|
||||
id="path3262"
|
||||
d="m 17.428571,45.809524 c 0,0 -8.0270315,-1.018957 -11.2380948,4.380952 C 3.1394595,55.321241 5.3077553,56.549478 0.19047619,64.095238 8.2367444,59.358933 9.6375886,61.426505 14.380952,57.809524 c 4.995791,-3.809466 3.047619,-12 3.047619,-12 z"
|
||||
style="fill:#ff3300;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcczcc"
|
||||
id="path2838"
|
||||
d="m 28.50328,21.616611 c 0,0 -11.17345,-1.037077 -16.945515,1.987621 C 5.7856986,26.62893 1.2547794,32.591615 0.87496908,37.034396 l 4.12105282,4.121053 c 0,0 3.9111679,-5.525632 7.0714051,-6.205607 3.160238,-0.679974 5.569542,3.485707 5.569542,3.485707 L 28.50328,21.616611 z"
|
||||
style="fill:url(#linearGradient2993);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.50000036;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcczcc"
|
||||
id="path2852"
|
||||
d="m 27.07046,23.029314 c 0,0 -10.499371,-0.30588 -14.949848,2.044251 -4.4504783,2.350132 -9.1515413,8.017465 -9.5356758,11.407993 l 2.2308865,2.365575 c 0,0 3.3383462,-4.556942 6.7554263,-5.441018 3.550721,-0.918653 6.495521,2.923539 6.495521,2.923539 l 9.00369,-13.30034 z"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1.50000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.75294118;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czczcc"
|
||||
id="path2778"
|
||||
d="m 15.362051,40.711571 c 0,0 9.230661,-17.181049 18.901806,-26.592816 9.672164,-9.4127646 23.233575,-7.6034498 23.233575,-7.6034498 0,0 1.912294,13.6388888 -7.603449,23.2335768 -9.515334,9.594274 -26.646216,18.9552 -26.646216,18.9552 -3.667764,-1.719891 -6.263335,-4.465672 -7.885716,-7.992511 z"
|
||||
style="fill:url(#radialGradient2780);fill-opacity:1;fill-rule:evenodd;stroke:#2e3436;stroke-width:1.50000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
transform="matrix(0.971755,0.971755,-1.078319,1.078319,34.30673,-22.81046)"
|
||||
d="m 33.333333,16.063492 c 0,3.471504 -2.81421,6.285714 -6.285714,6.285714 -3.471504,0 -6.285714,-2.81421 -6.285714,-6.285714 0,-3.471504 2.81421,-6.2857143 6.285714,-6.2857143 3.471504,0 6.285714,2.8142103 6.285714,6.2857143 z"
|
||||
sodipodi:ry="6.2857141"
|
||||
sodipodi:rx="6.2857141"
|
||||
sodipodi:cy="16.063492"
|
||||
sodipodi:cx="27.047619"
|
||||
id="path2995"
|
||||
style="color:#000000;fill:#000000;fill-opacity:0.75294118;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czczcc"
|
||||
id="path2812"
|
||||
d="m 17.248983,40.52583 c 0,0 8.923994,-16.541727 17.735724,-25.118114 8.812661,-8.5772978 20.722021,-7.0483088 20.722021,-7.0483088 0,0 1.628899,11.8658788 -7.041885,20.6082898 -8.670411,8.742037 -25.020308,17.693768 -25.020308,17.693768 -2.187251,-0.769604 -5.285453,-4.183291 -6.395552,-6.135635 z"
|
||||
style="fill:none;stroke:url(#linearGradient2836);stroke-width:1.50000048;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:0.50196078;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czczc"
|
||||
id="path2776"
|
||||
d="m 54.548251,8.8426932 c 0,0 -7.660054,-0.562989 -14.707019,5.5703058 -7.046965,6.133294 -17.594697,22.380596 -17.594697,22.380596 0,0 13.288747,-13.506287 20.335711,-19.639582 7.046966,-6.133295 11.966005,-8.3113198 11.966005,-8.3113198 z"
|
||||
style="fill:url(#radialGradient2910);fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
<g
|
||||
transform="matrix(1.14993,0,0,1.14993,6.800306,-2.240887)"
|
||||
id="g3116">
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="path2997"
|
||||
style="color:#000000;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
d="m 34.34296,19.103943 c 0,2.369255 -1.886648,4.292129 -4.211269,4.292129 -2.324618,0 -4.211265,-1.922874 -4.211265,-4.292129 0,-2.369257 1.886647,-4.292132 4.211265,-4.292132 2.324621,0 4.211269,1.922875 4.211269,4.292132 z m -1.783168,-0.03868 c 0,-1.387402 -1.104794,-2.513408 -2.466057,-2.513408 -1.361265,0 -2.466057,1.126006 -2.466057,2.513408 0,1.387404 1.104792,2.513412 2.466057,2.513412 1.361263,0 2.466057,-1.126008 2.466057,-2.513412 z" />
|
||||
<rect
|
||||
style="color:#000000;fill:#eeeeec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
id="rect3021"
|
||||
width="5.2897201"
|
||||
height="2.0838287"
|
||||
x="38.385689"
|
||||
y="-10.85847"
|
||||
transform="matrix(0.669447,0.74286,-0.669447,0.74286,0,0)"
|
||||
ry="1.0419143" />
|
||||
</g>
|
||||
<path
|
||||
transform="translate(11.67337,-0.482171)"
|
||||
d="m 32.857142,20.238094 c 0,1.762052 -1.428425,3.190477 -3.190476,3.190477 -1.762051,0 -3.190476,-1.428425 -3.190476,-3.190477 0,-1.762051 1.428425,-3.190476 3.190476,-3.190476 1.762051,0 3.190476,1.428425 3.190476,3.190476 z"
|
||||
sodipodi:ry="3.1904762"
|
||||
sodipodi:rx="3.1904762"
|
||||
sodipodi:cy="20.238094"
|
||||
sodipodi:cx="29.666666"
|
||||
id="path3130"
|
||||
style="color:#000000;fill:#ffffff;fill-opacity:0.21960784;fill-rule:nonzero;stroke:none;stroke-width:1.00000012;marker:none;visibility:visible;display:inline;overflow:visible"
|
||||
sodipodi:type="arc" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cccc"
|
||||
id="path3252"
|
||||
d="m 55.887125,5.978836 c 0.527192,0.821912 0.960301,1.7096824 2.21164,2.0246913 L 63.650794,0.40564374 55.887125,5.978836 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:url(#linearGradient3260);stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcccc"
|
||||
id="path3362"
|
||||
d="m 16.285714,40.714286 c 0,0 1,2.678571 3,4.428571 2,1.75 5,2.571429 5,2.571429 l 11.571429,-7.428572 -12.571429,-11.714285 -7,12.142857 z"
|
||||
style="fill:url(#linearGradient3378);fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="czcczcc"
|
||||
id="path2913"
|
||||
d="m 37.579113,31.079442 c 0,0 -2.782237,7.354138 -6.666281,12.266858 -3.884042,4.912721 -9.398886,9.89148 -12.570818,11.542141 l -1.543016,-1.543016 c 0,0 4.184922,-3.942037 5.640693,-6.326478 1.455773,-2.384439 0.182397,-3.211279 0.182397,-3.211279 L 37.579113,31.079442 z"
|
||||
style="fill:url(#linearGradient2985);fill-opacity:1;fill-rule:evenodd;stroke:#181c1d;stroke-width:1.49999976;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="csczcc"
|
||||
id="path2917"
|
||||
d="m 34.306022,35.463077 c 0,0 -1.631109,3.591608 -4.123466,7.040687 -0.992859,1.373979 -5.113523,5.663687 -11.914004,11.085219 4.654155,-4.714016 5.401481,-6.119943 5.718792,-6.654724 0.317312,-0.534783 0.568179,-2.509184 0.2744,-2.922039 l 10.044278,-8.549143 z"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:5.19999981;stroke-opacity:0.75294118;stroke-dasharray:none" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="cscsc"
|
||||
id="path3360"
|
||||
d="m 16.849661,46.487458 c 0,0 -5.428038,1.375496 -7.179279,3.883448 -1.0763589,1.541454 -0.6666312,3.068619 -3.9790909,7.953055 5.2084199,-3.065851 6.3035939,-2.634253 8.1380009,-4.544987 2.374402,-2.468323 3.020369,-7.291516 3.020369,-7.291516 z"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 31 KiB |
|
@ -0,0 +1,335 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "error:whoosh.schema:"
|
||||
msgid "The slug of the whoosh schema must be unique."
|
||||
msgstr "El slug del Whoosh Esquema ha de ser únic."
|
||||
|
||||
msgctxt "error:whoosh.search:"
|
||||
msgid "Error domain \"%s\"."
|
||||
msgstr "Error domini \"%s\"."
|
||||
|
||||
msgctxt "error:whoosh.search:"
|
||||
msgid ""
|
||||
"Not found parse fields in schema \"%s\". Select one or more parser fields in"
|
||||
" schema."
|
||||
msgstr ""
|
||||
"No hi ha cap camp marcat com \"Parse\" en l'esquema \"%s\". Selecciona un o "
|
||||
"més en els camps del esquema."
|
||||
|
||||
msgctxt "error:whoosh.search:"
|
||||
msgid ""
|
||||
"Not found schema \"%s\" - \"%s\". Create Schema and generate index before "
|
||||
"searching."
|
||||
msgstr ""
|
||||
"No s'ha trobat el esquema \"%s\" - \"%s\". Crea un esquema i genera la "
|
||||
"indexació abans de buscar."
|
||||
|
||||
msgctxt "field:whoosh.field,active:"
|
||||
msgid "Active"
|
||||
msgstr "Actiu"
|
||||
|
||||
msgctxt "field:whoosh.field,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Data creació"
|
||||
|
||||
msgctxt "field:whoosh.field,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuari creació"
|
||||
|
||||
msgctxt "field:whoosh.field,field:"
|
||||
msgid "Field"
|
||||
msgstr "Camp"
|
||||
|
||||
msgctxt "field:whoosh.field,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.field,name:"
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgctxt "field:whoosh.field,parser:"
|
||||
msgid "Parser"
|
||||
msgstr "Parser"
|
||||
|
||||
msgctxt "field:whoosh.field,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgctxt "field:whoosh.field,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "field:whoosh.field,stored:"
|
||||
msgid "Stored"
|
||||
msgstr "Stored"
|
||||
|
||||
msgctxt "field:whoosh.field,unique:"
|
||||
msgid "Unique"
|
||||
msgstr "Únic"
|
||||
|
||||
msgctxt "field:whoosh.field,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Data modificació"
|
||||
|
||||
msgctxt "field:whoosh.field,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuari modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema,active:"
|
||||
msgid "Active"
|
||||
msgstr "Actiu"
|
||||
|
||||
msgctxt "field:whoosh.schema,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Data creació"
|
||||
|
||||
msgctxt "field:whoosh.schema,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuari creació"
|
||||
|
||||
msgctxt "field:whoosh.schema,debug:"
|
||||
msgid "Debug"
|
||||
msgstr "Debug"
|
||||
|
||||
msgctxt "field:whoosh.schema,domain:"
|
||||
msgid "Domain"
|
||||
msgstr "Domini"
|
||||
|
||||
msgctxt "field:whoosh.schema,fields_:"
|
||||
msgid "Fields"
|
||||
msgstr "Camps"
|
||||
|
||||
msgctxt "field:whoosh.schema,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema,langs:"
|
||||
msgid "Langs"
|
||||
msgstr "Idiomes"
|
||||
|
||||
msgctxt "field:whoosh.schema,model:"
|
||||
msgid "Model"
|
||||
msgstr "Model"
|
||||
|
||||
msgctxt "field:whoosh.schema,name:"
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgctxt "field:whoosh.schema,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgctxt "field:whoosh.schema,schema_groups:"
|
||||
msgid "Groups"
|
||||
msgstr "Grups"
|
||||
|
||||
msgctxt "field:whoosh.schema,slug:"
|
||||
msgid "Slug"
|
||||
msgstr "Slug"
|
||||
|
||||
msgctxt "field:whoosh.schema,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Data modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuari modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Data creació"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuari creació"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,group:"
|
||||
msgid "Group"
|
||||
msgstr "Grup"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Data modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuari modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Data creació"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuari creació"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,lang:"
|
||||
msgid "Language"
|
||||
msgstr "Idioma"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nom"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Data modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuari modificació"
|
||||
|
||||
msgctxt "field:whoosh.schema.start,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema.start,q:"
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
||||
|
||||
msgctxt "field:whoosh.schema.start,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "help:whoosh.field,name:"
|
||||
msgid "Field name in Whoosh (\"name\", \"content\", \"slug\"..."
|
||||
msgstr "Camp en Whoosh (\"name\", \"content\", \"slug\"...)"
|
||||
|
||||
msgctxt "help:whoosh.field,parser:"
|
||||
msgid "Use field to Multifield Parser."
|
||||
msgstr "Utilitza el camp per Multifield Parser."
|
||||
|
||||
msgctxt "help:whoosh.schema,schema_groups:"
|
||||
msgid "User groups that will be able to use this schema."
|
||||
msgstr "Accés grups usuari en aquest esquema ."
|
||||
|
||||
msgctxt "help:whoosh.schema,slug:"
|
||||
msgid "Schema directory name: az09"
|
||||
msgstr "Nom del directori del esquema: az09"
|
||||
|
||||
msgctxt "help:whoosh.schema.start,q:"
|
||||
msgid "Concanate words with \"+\" to AND or \"-\" to NOT"
|
||||
msgstr "Uneix paraules utilitzant \"+\" per AND o bé \"-\" per NOT"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_field_form"
|
||||
msgid "Whoosh Field"
|
||||
msgstr "Camp Woosh"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_fields"
|
||||
msgid "Fields"
|
||||
msgstr "Camps"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_schema_form"
|
||||
msgid "Whoosh Schema"
|
||||
msgstr "Whoosh Esquema"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_search"
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:main_whoosh_menu"
|
||||
msgid "Whoosh"
|
||||
msgstr "Whoosh"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_act_whoosh_search"
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_configuration"
|
||||
msgid "Configuration"
|
||||
msgstr "Configuració"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_whoosh_schema"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "model:whoosh.field,name:"
|
||||
msgid "Whoosh Field"
|
||||
msgstr "Camp Woosh"
|
||||
|
||||
msgctxt "model:whoosh.schema,name:"
|
||||
msgid "Whoosh Schema"
|
||||
msgstr "Whoosh Esquema"
|
||||
|
||||
msgctxt "model:whoosh.schema-res.group,name:"
|
||||
msgid "Whoosh Schema - Group"
|
||||
msgstr "Whoosh Esquema - Grup"
|
||||
|
||||
msgctxt "model:whoosh.schema-whoosh.lang,name:"
|
||||
msgid "Whoosh Schema - Whoosh Lang"
|
||||
msgstr "Whoosh Esquema - Whoosh Idioma"
|
||||
|
||||
msgctxt "model:whoosh.schema.start,name:"
|
||||
msgid "Whoosh Schema Start"
|
||||
msgstr "Inici Whoosh Esquema"
|
||||
|
||||
msgctxt "view:whoosh.field:"
|
||||
msgid "Whoosh Field"
|
||||
msgstr "Camp Woosh"
|
||||
|
||||
msgctxt "view:whoosh.schema.start:"
|
||||
msgid "Searching"
|
||||
msgstr "Cerca"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Create Schema"
|
||||
msgstr "Crea esquema"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Domain"
|
||||
msgstr "Domini"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Fields"
|
||||
msgstr "Camps"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Generate Index"
|
||||
msgstr "Genera indexació"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Grups"
|
||||
msgstr "Grups"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Langs"
|
||||
msgstr "Idiomes"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Remove Schema"
|
||||
msgstr "Elimina esquema"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Whoosh Schema"
|
||||
msgstr "Whoosh Esquema"
|
||||
|
||||
msgctxt "wizard_button:whoosh.search,start,end:"
|
||||
msgid "Cancel"
|
||||
msgstr "Cancel·la"
|
||||
|
||||
msgctxt "wizard_button:whoosh.search,start,open_:"
|
||||
msgid "Search"
|
||||
msgstr "Cerca"
|
|
@ -0,0 +1,335 @@
|
|||
#
|
||||
msgid ""
|
||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
||||
|
||||
msgctxt "error:whoosh.schema:"
|
||||
msgid "The slug of the whoosh schema must be unique."
|
||||
msgstr "El slug del esquema debe ser único."
|
||||
|
||||
msgctxt "error:whoosh.search:"
|
||||
msgid "Error domain \"%s\"."
|
||||
msgstr "Error dominio \"%s\"."
|
||||
|
||||
msgctxt "error:whoosh.search:"
|
||||
msgid ""
|
||||
"Not found parse fields in schema \"%s\". Select one or more parser fields in"
|
||||
" schema."
|
||||
msgstr ""
|
||||
"No hay ningún campo marcado como \"Parse\" en el esquema \"%s\". Selecciona "
|
||||
"uno o más en los campos de los esquemas."
|
||||
|
||||
msgctxt "error:whoosh.search:"
|
||||
msgid ""
|
||||
"Not found schema \"%s\" - \"%s\". Create Schema and generate index before "
|
||||
"searching."
|
||||
msgstr ""
|
||||
"No se ha encontrado el esquema \"%s\" - \"%s\". Crea un esquema y genere "
|
||||
"indexación antes de buscar."
|
||||
|
||||
msgctxt "field:whoosh.field,active:"
|
||||
msgid "Active"
|
||||
msgstr "Activo"
|
||||
|
||||
msgctxt "field:whoosh.field,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Fecha creación"
|
||||
|
||||
msgctxt "field:whoosh.field,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuario creación"
|
||||
|
||||
msgctxt "field:whoosh.field,field:"
|
||||
msgid "Field"
|
||||
msgstr "Campo"
|
||||
|
||||
msgctxt "field:whoosh.field,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.field,name:"
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
msgctxt "field:whoosh.field,parser:"
|
||||
msgid "Parser"
|
||||
msgstr "Parser"
|
||||
|
||||
msgctxt "field:whoosh.field,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
msgctxt "field:whoosh.field,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "field:whoosh.field,stored:"
|
||||
msgid "Stored"
|
||||
msgstr "Stored"
|
||||
|
||||
msgctxt "field:whoosh.field,unique:"
|
||||
msgid "Unique"
|
||||
msgstr "Único"
|
||||
|
||||
msgctxt "field:whoosh.field,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Fecha modificación"
|
||||
|
||||
msgctxt "field:whoosh.field,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuario modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema,active:"
|
||||
msgid "Active"
|
||||
msgstr "Activo"
|
||||
|
||||
msgctxt "field:whoosh.schema,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Fecha creación"
|
||||
|
||||
msgctxt "field:whoosh.schema,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuario creación"
|
||||
|
||||
msgctxt "field:whoosh.schema,debug:"
|
||||
msgid "Debug"
|
||||
msgstr "Debug"
|
||||
|
||||
msgctxt "field:whoosh.schema,domain:"
|
||||
msgid "Domain"
|
||||
msgstr "Dominio"
|
||||
|
||||
msgctxt "field:whoosh.schema,fields_:"
|
||||
msgid "Fields"
|
||||
msgstr "Campos"
|
||||
|
||||
msgctxt "field:whoosh.schema,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema,langs:"
|
||||
msgid "Langs"
|
||||
msgstr "Idiomas"
|
||||
|
||||
msgctxt "field:whoosh.schema,model:"
|
||||
msgid "Model"
|
||||
msgstr "Modelo"
|
||||
|
||||
msgctxt "field:whoosh.schema,name:"
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
msgctxt "field:whoosh.schema,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
msgctxt "field:whoosh.schema,schema_groups:"
|
||||
msgid "Groups"
|
||||
msgstr "Grupos"
|
||||
|
||||
msgctxt "field:whoosh.schema,slug:"
|
||||
msgid "Slug"
|
||||
msgstr "Slug"
|
||||
|
||||
msgctxt "field:whoosh.schema,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Fecha modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuario modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Fecha creación"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuario creación"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,group:"
|
||||
msgid "Group"
|
||||
msgstr "Grupo"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Fecha modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema-res.group,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuario modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,create_date:"
|
||||
msgid "Create Date"
|
||||
msgstr "Fecha creación"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,create_uid:"
|
||||
msgid "Create User"
|
||||
msgstr "Usuario creación"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,lang:"
|
||||
msgid "Language"
|
||||
msgstr "Idioma"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,rec_name:"
|
||||
msgid "Name"
|
||||
msgstr "Nombre"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,write_date:"
|
||||
msgid "Write Date"
|
||||
msgstr "Fecha modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema-whoosh.lang,write_uid:"
|
||||
msgid "Write User"
|
||||
msgstr "Usuario modificación"
|
||||
|
||||
msgctxt "field:whoosh.schema.start,id:"
|
||||
msgid "ID"
|
||||
msgstr "ID"
|
||||
|
||||
msgctxt "field:whoosh.schema.start,q:"
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
msgctxt "field:whoosh.schema.start,schema:"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "help:whoosh.field,name:"
|
||||
msgid "Field name in Whoosh (\"name\", \"content\", \"slug\"..."
|
||||
msgstr "Campo en Whoosh (\"name\", \"content\", \"slug\"...)"
|
||||
|
||||
msgctxt "help:whoosh.field,parser:"
|
||||
msgid "Use field to Multifield Parser."
|
||||
msgstr "Se utilitzará el campo en Multifield Parser."
|
||||
|
||||
msgctxt "help:whoosh.schema,schema_groups:"
|
||||
msgid "User groups that will be able to use this schema."
|
||||
msgstr "Acceso grupo de usuarios en este esquema."
|
||||
|
||||
msgctxt "help:whoosh.schema,slug:"
|
||||
msgid "Schema directory name: az09"
|
||||
msgstr "Nombre directorio esquema : az09"
|
||||
|
||||
msgctxt "help:whoosh.schema.start,q:"
|
||||
msgid "Concanate words with \"+\" to AND or \"-\" to NOT"
|
||||
msgstr "Une palabres usando \"+\" para AND o bien \"-\" para NOT"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_field_form"
|
||||
msgid "Whoosh Field"
|
||||
msgstr "Campo Whoosh"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_fields"
|
||||
msgid "Fields"
|
||||
msgstr "Campos"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_schema_form"
|
||||
msgid "Whoosh Schema"
|
||||
msgstr "Whoosh Esquema"
|
||||
|
||||
msgctxt "model:ir.action,name:act_whoosh_search"
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:main_whoosh_menu"
|
||||
msgid "Whoosh"
|
||||
msgstr "Whoosh"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_act_whoosh_search"
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_configuration"
|
||||
msgid "Configuration"
|
||||
msgstr "Configuración"
|
||||
|
||||
msgctxt "model:ir.ui.menu,name:menu_whoosh_schema"
|
||||
msgid "Schema"
|
||||
msgstr "Esquema"
|
||||
|
||||
msgctxt "model:whoosh.field,name:"
|
||||
msgid "Whoosh Field"
|
||||
msgstr "Campo Whoosh"
|
||||
|
||||
msgctxt "model:whoosh.schema,name:"
|
||||
msgid "Whoosh Schema"
|
||||
msgstr "Whoosh Esquema"
|
||||
|
||||
msgctxt "model:whoosh.schema-res.group,name:"
|
||||
msgid "Whoosh Schema - Group"
|
||||
msgstr "Whoosh Esquema - Groupo"
|
||||
|
||||
msgctxt "model:whoosh.schema-whoosh.lang,name:"
|
||||
msgid "Whoosh Schema - Whoosh Lang"
|
||||
msgstr "Whoosh Esquema - Whoosh Idiomas"
|
||||
|
||||
msgctxt "model:whoosh.schema.start,name:"
|
||||
msgid "Whoosh Schema Start"
|
||||
msgstr "Inicio Whoosh Esquema"
|
||||
|
||||
msgctxt "view:whoosh.field:"
|
||||
msgid "Whoosh Field"
|
||||
msgstr "Campo Whoosh"
|
||||
|
||||
msgctxt "view:whoosh.schema.start:"
|
||||
msgid "Searching"
|
||||
msgstr "Búsqueda"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Create Schema"
|
||||
msgstr "Crear esquema"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Domain"
|
||||
msgstr "Dominio"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Fields"
|
||||
msgstr "Campos"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Generate Index"
|
||||
msgstr "Generar indexación"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Grups"
|
||||
msgstr "Grupos"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Langs"
|
||||
msgstr "Idiomas"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Remove Schema"
|
||||
msgstr "Eliminar esquema"
|
||||
|
||||
msgctxt "view:whoosh.schema:"
|
||||
msgid "Whoosh Schema"
|
||||
msgstr "Whoosh Esquema"
|
||||
|
||||
msgctxt "wizard_button:whoosh.search,start,end:"
|
||||
msgid "Cancel"
|
||||
msgstr "Cancelar"
|
||||
|
||||
msgctxt "wizard_button:whoosh.search,start,open_:"
|
||||
msgid "Search"
|
||||
msgstr "Buscar"
|
|
@ -0,0 +1,89 @@
|
|||
#!/usr/bin/env python
|
||||
# This file is part whooshsearch module for Tryton.
|
||||
# The COPYRIGHT file at the top level of this repository contains
|
||||
# the full copyright notices and license terms.
|
||||
from setuptools import setup
|
||||
import re
|
||||
import os
|
||||
import ConfigParser
|
||||
|
||||
MODULE = 'whooshsearch'
|
||||
PREFIX = 'trytonzz'
|
||||
MODULE2PREFIX = {}
|
||||
|
||||
|
||||
def read(fname):
|
||||
return open(os.path.join(os.path.dirname(__file__), fname)).read()
|
||||
|
||||
config = ConfigParser.ConfigParser()
|
||||
config.readfp(open('tryton.cfg'))
|
||||
info = dict(config.items('tryton'))
|
||||
for key in ('depends', 'extras_depend', 'xml'):
|
||||
if key in info:
|
||||
info[key] = info[key].strip().splitlines()
|
||||
major_version, minor_version, _ = info.get('version', '0.0.1').split('.', 2)
|
||||
major_version = int(major_version)
|
||||
minor_version = int(minor_version)
|
||||
|
||||
requires = []
|
||||
for dep in info.get('depends', []):
|
||||
if not re.match(r'(ir|res|webdav)(\W|$)', dep):
|
||||
prefix = MODULE2PREFIX.get(dep, 'trytond')
|
||||
requires.append('%s_%s >= %s.%s, < %s.%s' %
|
||||
(prefix, dep, major_version, minor_version,
|
||||
major_version, minor_version + 1))
|
||||
requires.append('trytond >= %s.%s, < %s.%s' %
|
||||
(major_version, minor_version, major_version, minor_version + 1))
|
||||
|
||||
tests_require = ['proteus >= %s.%s, < %s.%s' %
|
||||
(major_version, minor_version, major_version, minor_version + 1)]
|
||||
|
||||
setup(name='%s_%s' % (PREFIX, MODULE),
|
||||
version=info.get('version', '0.0.1'),
|
||||
description='Tryton module generate Whoosh indexing',
|
||||
long_description=read('README'),
|
||||
author='NaN·tic',
|
||||
url='http://www.nan-tic.com/',
|
||||
download_url="https://bitbucket.org/zikzakmedia/trytond-%s" % MODULE,
|
||||
package_dir={'trytond.modules.%s' % MODULE: '.'},
|
||||
packages=[
|
||||
'trytond.modules.%s' % MODULE,
|
||||
'trytond.modules.%s.tests' % MODULE,
|
||||
],
|
||||
package_data={
|
||||
'trytond.modules.%s' % MODULE: (info.get('xml', [])
|
||||
+ ['tryton.cfg', 'locale/*.po', 'tests/*.rst', 'icons/*.svg']),
|
||||
},
|
||||
classifiers=[
|
||||
'Development Status :: 5 - Production/Stable',
|
||||
'Environment :: Plugins',
|
||||
'Framework :: Tryton',
|
||||
'Intended Audience :: Developers',
|
||||
'Intended Audience :: Financial and Insurance Industry',
|
||||
'Intended Audience :: Legal Industry',
|
||||
'License :: OSI Approved :: GNU General Public License (GPL)',
|
||||
'Natural Language :: Bulgarian',
|
||||
'Natural Language :: Catalan',
|
||||
'Natural Language :: Czech',
|
||||
'Natural Language :: Dutch',
|
||||
'Natural Language :: English',
|
||||
'Natural Language :: French',
|
||||
'Natural Language :: German',
|
||||
'Natural Language :: Russian',
|
||||
'Natural Language :: Spanish',
|
||||
'Operating System :: OS Independent',
|
||||
'Programming Language :: Python :: 2.6',
|
||||
'Programming Language :: Python :: 2.7',
|
||||
'Topic :: Office/Business',
|
||||
],
|
||||
license='GPL-3',
|
||||
install_requires=requires,
|
||||
zip_safe=False,
|
||||
entry_points="""
|
||||
[trytond.modules]
|
||||
%s = trytond.modules.%s
|
||||
""" % (MODULE, MODULE),
|
||||
test_suite='tests',
|
||||
test_loader='trytond.test_loader:Loader',
|
||||
tests_require=tests_require,
|
||||
)
|
|
@ -0,0 +1,6 @@
|
|||
# This file is part whoosh module for Tryton.
|
||||
# The COPYRIGHT file at the top level of this repository contains
|
||||
# the full copyright notices and license terms.
|
||||
from .test_whoosh import suite
|
||||
|
||||
__all__ = ['suite']
|
|
@ -0,0 +1,29 @@
|
|||
#!/usr/bin/env python
|
||||
# This file is part whoosh module for Tryton.
|
||||
# The COPYRIGHT file at the top level of this repository contains
|
||||
# the full copyright notices and license terms.
|
||||
import unittest
|
||||
import trytond.tests.test_tryton
|
||||
from trytond.tests.test_tryton import test_view, test_depends
|
||||
|
||||
|
||||
class WhooshTestCase(unittest.TestCase):
|
||||
'Whoosh module'
|
||||
|
||||
def setUp(self):
|
||||
trytond.tests.test_tryton.install_module('whoosh')
|
||||
|
||||
def test0005views(self):
|
||||
'Test views'
|
||||
test_view('whoosh')
|
||||
|
||||
def test0006depends(self):
|
||||
'Test depends'
|
||||
test_depends()
|
||||
|
||||
|
||||
def suite():
|
||||
suite = trytond.tests.test_tryton.suite()
|
||||
suite.addTests(unittest.TestLoader().loadTestsFromTestCase(
|
||||
WhooshTestCase))
|
||||
return suite
|
|
@ -0,0 +1,7 @@
|
|||
[tryton]
|
||||
version=3.4.0
|
||||
depends:
|
||||
ir
|
||||
res
|
||||
xml:
|
||||
whooshsearch.xml
|
|
@ -0,0 +1,9 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- This file is part whooshsearch module for Tryton.
|
||||
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
|
||||
<form string="Searching">
|
||||
<label name="schema"/>
|
||||
<field name="schema"/>
|
||||
<label name="q"/>
|
||||
<field name="q"/>
|
||||
</form>
|
|
@ -0,0 +1,19 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- This file is part whooshsearch module for Tryton.
|
||||
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
|
||||
<form string="Whoosh Field">
|
||||
<label name="field"/>
|
||||
<field name="field"/>
|
||||
<label name="name"/>
|
||||
<field name="name"/>
|
||||
<label name="active"/>
|
||||
<field name="active"/>
|
||||
<label name="stored"/>
|
||||
<field name="stored"/>
|
||||
<label name="unique"/>
|
||||
<field name="unique"/>
|
||||
<label name="parser"/>
|
||||
<field name="parser"/>
|
||||
<label name="schema"/>
|
||||
<field name="schema"/>
|
||||
</form>
|
|
@ -0,0 +1,11 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- This file is part whooshsearch module for Tryton.
|
||||
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
|
||||
<tree string="Whoosh Field">
|
||||
<field name="name"/>
|
||||
<field name="field"/>
|
||||
<field name="stored"/>
|
||||
<field name="unique"/>
|
||||
<field name="parser"/>
|
||||
<field name="active" tree_invisible="1"/>
|
||||
</tree>
|
|
@ -0,0 +1,36 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- This file is part whooshsearch module for Tryton.
|
||||
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
|
||||
<form string="Whoosh Schema" col="6">
|
||||
<label name="name"/>
|
||||
<field name="name"/>
|
||||
<label name="slug"/>
|
||||
<field name="slug"/>
|
||||
<label name="active"/>
|
||||
<field name="active"/>
|
||||
<label name="debug"/>
|
||||
<field name="debug"/>
|
||||
<notebook colspan="6">
|
||||
<page id="fields" string="Fields">
|
||||
<label name="model"/>
|
||||
<field name="model"/>
|
||||
<newline/>
|
||||
<field name="fields_" colspan="6"/>
|
||||
</page>
|
||||
<page id="langs" string="Langs">
|
||||
<field name="langs" colspan="6"/>
|
||||
</page>
|
||||
<page id="grups" string="Grups">
|
||||
<field name="schema_groups" colspan="6"/>
|
||||
</page>
|
||||
<page id="domain" string="Domain">
|
||||
<label name="domain"/>
|
||||
<field name="domain"/>
|
||||
</page>
|
||||
</notebook>
|
||||
<group col="6" colspan="6" id="buttons">
|
||||
<button icon="tryton-ok" name="create_schema" string="Create Schema"/>
|
||||
<button icon="tryton-cancel" name="remove_schema" string="Remove Schema"/>
|
||||
<button icon="tryton-go-next" name="generate_index" string="Generate Index"/>
|
||||
</group>
|
||||
</form>
|
|
@ -0,0 +1,10 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- This file is part whooshsearch module for Tryton.
|
||||
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
|
||||
<tree string="Whoosh Schema">
|
||||
<field name="name"/>
|
||||
<field name="slug"/>
|
||||
<field name="model"/>
|
||||
<field name="debug"/>
|
||||
<field name="active" tree_invisible="1"/>
|
||||
</tree>
|
|
@ -0,0 +1,379 @@
|
|||
# This file is part whooshsearch module for Tryton.
|
||||
# The COPYRIGHT file at the top level of this repository contains
|
||||
# the full copyright notices and license terms.
|
||||
from trytond.transaction import Transaction
|
||||
from trytond.pool import Pool
|
||||
from trytond.wizard import Wizard, StateView, StateAction, Button
|
||||
from trytond.model import ModelView, ModelSQL, fields
|
||||
from trytond.pyson import Eval, PYSONEncoder, Id
|
||||
from trytond.config import config
|
||||
from whoosh import index
|
||||
from whoosh.fields import Schema, ID as wID, BOOLEAN as wBOOLEAN, \
|
||||
NUMERIC as wNUMERIC, TEXT as wTEXT, DATETIME as wDATETIME
|
||||
from whoosh.qparser import MultifieldParser
|
||||
import os
|
||||
import shutil
|
||||
import logging
|
||||
|
||||
__all__ = ['WhooshSchema', 'WhooshField', 'WhooshWhooshLang', 'WhooshSchemaGroup',
|
||||
'WhooshSchemaStart', 'WhooshSearch']
|
||||
|
||||
EXCLUDE_FIELDS = ['property', 'sha', 'binary', 'one2many', 'one2one',
|
||||
'timestamp', 'time', 'reference']
|
||||
FIELD2WHOOSH = {
|
||||
'boolean': wBOOLEAN,
|
||||
'integer': wNUMERIC,
|
||||
'biginteger': wNUMERIC,
|
||||
'char': wTEXT,
|
||||
'text': wTEXT,
|
||||
'float': wNUMERIC,
|
||||
'numeric': wNUMERIC,
|
||||
'date': wDATETIME,
|
||||
'datetime': wDATETIME,
|
||||
'selection': wTEXT,
|
||||
'many2one': wTEXT,
|
||||
'many2many': wTEXT,
|
||||
'function': wTEXT,
|
||||
}
|
||||
|
||||
|
||||
class WhooshSchema(ModelSQL, ModelView):
|
||||
'Whoosh Schema'
|
||||
__name__ = 'whoosh.schema'
|
||||
name = fields.Char('Name', required=True, translate=True)
|
||||
slug = fields.Char('Slug', required=True,
|
||||
help='Schema directory name: az09')
|
||||
model = fields.Many2One('ir.model', 'Model', required=True)
|
||||
domain = fields.Char('Domain')
|
||||
fields_ = fields.One2Many('whoosh.field', 'schema', 'Fields')
|
||||
langs = fields.Many2Many('whoosh.schema-whoosh.lang',
|
||||
'schema', 'lang', 'Langs',
|
||||
domain=[('translatable', '=', True)])
|
||||
active = fields.Boolean('Active', select=True)
|
||||
debug = fields.Boolean('Debug')
|
||||
schema_groups = fields.Many2Many('whoosh.schema-res.group', 'schema',
|
||||
'group', 'Groups',
|
||||
states={
|
||||
'invisible': ~Eval('groups', []).contains(Id('res', 'group_admin')
|
||||
),
|
||||
},
|
||||
help='User groups that will be able to use this schema.')
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super(WhooshSchema, cls).__setup__()
|
||||
cls._sql_constraints = [
|
||||
('slug_uniq', 'UNIQUE(slug)',
|
||||
'The slug of the whoosh schema must be unique.')
|
||||
]
|
||||
cls._buttons.update({
|
||||
'create_schema': {},
|
||||
'remove_schema': {},
|
||||
'generate_index': {},
|
||||
})
|
||||
|
||||
@staticmethod
|
||||
def default_active():
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def default_langs():
|
||||
Lang = Pool().get('ir.lang')
|
||||
|
||||
langs = Lang.search([
|
||||
('translatable', '=', True),
|
||||
])
|
||||
if len(langs) > 1:
|
||||
return [l.id for l in langs]
|
||||
return None
|
||||
|
||||
@staticmethod
|
||||
def _remove_schema(schemas):
|
||||
for schema in schemas:
|
||||
db_name = Transaction().cursor.dbname
|
||||
schema_dir = os.path.join(config.get('database', 'path'),
|
||||
db_name, 'whoosh', schema.slug)
|
||||
try:
|
||||
shutil.rmtree(schema_dir)
|
||||
logging.getLogger('whoosh').info(
|
||||
'Remove schema directory "%s"' % schema.slug)
|
||||
except:
|
||||
logging.getLogger('whoosh').info(
|
||||
'Not remove schema directory "%s"' % schema.slug)
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def create_schema(cls, schemas):
|
||||
'''Create Schemas for each model
|
||||
|
||||
Whoosh project path directory:
|
||||
DATABASEPATH/whoosh/SCHEMA-SLUG/LANG-CODE.lower()
|
||||
'''
|
||||
for schema in schemas:
|
||||
db_name = Transaction().cursor.dbname
|
||||
schema_dir = os.path.join(config.get('database', 'path'),
|
||||
db_name, 'whoosh', schema.slug)
|
||||
|
||||
if not os.path.exists(schema_dir):
|
||||
os.makedirs(schema_dir)
|
||||
|
||||
langs = [l.code.lower() for l in schema.langs] \
|
||||
if schema.langs \
|
||||
else [Transaction().context.get('language').lower()]
|
||||
|
||||
for lang in langs:
|
||||
schema_lang_dir = os.path.join(schema_dir, lang)
|
||||
if not os.path.exists(schema_lang_dir):
|
||||
os.makedirs(schema_lang_dir)
|
||||
|
||||
sc = {}
|
||||
sc['id'] = wID(stored=True, unique=True)
|
||||
for f in schema.fields_:
|
||||
field = f.field
|
||||
|
||||
if field.ttype in EXCLUDE_FIELDS:
|
||||
continue
|
||||
|
||||
options = {}
|
||||
if f.stored:
|
||||
options['stored'] = True
|
||||
if f.unique:
|
||||
options['unique'] = True
|
||||
|
||||
field_type = FIELD2WHOOSH.get(field.ttype)
|
||||
sc[f.name] = field_type(**options)
|
||||
|
||||
if schema.debug:
|
||||
logging.getLogger('whoosh').info(sc)
|
||||
|
||||
schema_obj = Schema(**sc)
|
||||
index.create_in(schema_lang_dir, schema_obj)
|
||||
|
||||
logging.getLogger('whoosh').info(
|
||||
'Created/Updated %s Schemas' % schema.slug)
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def remove_schema(cls, schemas):
|
||||
'''Remove schema directory'''
|
||||
cls._remove_schema(schemas)
|
||||
|
||||
@classmethod
|
||||
@ModelView.button
|
||||
def generate_index(cls, schemas):
|
||||
'''Generate indexing data each schema'''
|
||||
for schema in schemas:
|
||||
logging.getLogger('whoosh').info('Start schema %s' % schema.slug)
|
||||
|
||||
db_name = Transaction().cursor.dbname
|
||||
schema_dir = os.path.join(config.get('database', 'path'),
|
||||
db_name, 'whoosh', schema.slug)
|
||||
|
||||
if not os.path.exists(schema_dir):
|
||||
logging.getLogger('whoosh').error(
|
||||
'Schema directory "%s" not exist' % schema.slug)
|
||||
continue
|
||||
|
||||
langs = [l.code.lower() for l in schema.langs] \
|
||||
if schema.langs \
|
||||
else [Transaction().context.get('language').lower()]
|
||||
|
||||
for lang in langs:
|
||||
schema_lang_dir = os.path.join(schema_dir, lang)
|
||||
if not os.path.exists(schema_lang_dir):
|
||||
logging.getLogger('whoosh').error(
|
||||
'Schema lang directory "%s" not exist' % lang)
|
||||
continue
|
||||
|
||||
if schema.debug:
|
||||
logging.getLogger('whoosh').info(schema_lang_dir)
|
||||
|
||||
ix = index.open_dir(schema_lang_dir)
|
||||
writer = ix.writer()
|
||||
|
||||
Model = Pool().get(schema.model.model)
|
||||
with Transaction().set_context(language=lang):
|
||||
records = Model.search(
|
||||
domain=eval(schema.domain) if schema.domain else [],
|
||||
)
|
||||
|
||||
for record in records:
|
||||
data = {}
|
||||
data['id'] = u'%s' % str(record.id)
|
||||
for f in schema.fields_:
|
||||
value = getattr(record, f.field.name)
|
||||
if f.field.ttype == 'many2one':
|
||||
value = value.rec_name if value else None
|
||||
if f.field.ttype == 'many2many':
|
||||
value = ", ".join([v.rec_name for v in value if v])
|
||||
data[f.name] = u'%s' % value
|
||||
|
||||
if schema.debug:
|
||||
logging.getLogger('whoosh').info('%s' % data)
|
||||
|
||||
writer.update_document(**data)
|
||||
|
||||
writer.commit()
|
||||
logging.getLogger('whoosh').info(
|
||||
'Total Schema "%s" - "%s": %s' % (schema.slug, lang, ix.doc_count()))
|
||||
|
||||
logging.getLogger('whoosh').info('End indexing schema "%s"' % schema.slug)
|
||||
|
||||
@classmethod
|
||||
def copy(cls, schemas, default=None):
|
||||
new_schemas = []
|
||||
for schema in schemas:
|
||||
default['slug'] = '%s-copy' % schema.slug
|
||||
new_schema, = super(WhooshSchema, cls).copy([schema], default=default)
|
||||
new_schemas.append(new_schema)
|
||||
return new_schemas
|
||||
|
||||
@classmethod
|
||||
def delete(cls, schemas):
|
||||
cls._remove_schema(schemas)
|
||||
super(WhooshSchema, cls).delete(schemas)
|
||||
|
||||
|
||||
class WhooshField(ModelSQL, ModelView):
|
||||
'Whoosh Field'
|
||||
__name__ = 'whoosh.field'
|
||||
schema = fields.Many2One('whoosh.schema', 'Schema', required=True,
|
||||
ondelete='CASCADE')
|
||||
name = fields.Char('Name', required=True,
|
||||
help='Field name in Whoosh ("name", "content", "slug"...')
|
||||
field = fields.Many2One('ir.model.field', 'Field', required=True,
|
||||
domain=[('model', '=', Eval('_parent_schema', {}).get('model'))])
|
||||
stored = fields.Boolean('Stored')
|
||||
unique = fields.Boolean('Unique')
|
||||
parser = fields.Boolean('Parser',
|
||||
help='Use field to Multifield Parser.')
|
||||
active = fields.Boolean('Active', select=True)
|
||||
|
||||
@staticmethod
|
||||
def default_stored():
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def default_active():
|
||||
return True
|
||||
|
||||
@fields.depends('field', 'name')
|
||||
def on_change_field(self):
|
||||
changes = {}
|
||||
|
||||
if self.name:
|
||||
return changes
|
||||
if self.field:
|
||||
changes['name'] = self.field.name
|
||||
return changes
|
||||
|
||||
|
||||
class EmptyStateAction(StateAction):
|
||||
def __init__(self):
|
||||
super(EmptyStateAction, self).__init__(None)
|
||||
|
||||
def get_action(self):
|
||||
return {}
|
||||
|
||||
|
||||
class WhooshSchemaStart(ModelView):
|
||||
'Whoosh Schema Start'
|
||||
__name__ = 'whoosh.schema.start'
|
||||
schema = fields.Many2One('whoosh.schema', 'Schema', required=True,
|
||||
domain=[
|
||||
['OR',
|
||||
('schema_groups', 'in',
|
||||
Eval('context', {}).get('groups', [])),
|
||||
('schema_groups', '=', None),
|
||||
],
|
||||
])
|
||||
q = fields.Char('Search', required=True,
|
||||
help='Concanate words with "+" to AND or "-" to NOT')
|
||||
|
||||
|
||||
class WhooshSearch(Wizard):
|
||||
'Whoosh Search'
|
||||
__name__ = 'whoosh.search'
|
||||
start = StateView('whoosh.schema.start',
|
||||
'whooshsearch.whoosh_schema_start_view_form', [
|
||||
Button('Cancel', 'end', 'tryton-cancel'),
|
||||
Button('Search', 'open_', 'tryton-ok', default=True),
|
||||
])
|
||||
open_ = EmptyStateAction()
|
||||
|
||||
@classmethod
|
||||
def __setup__(cls):
|
||||
super(WhooshSearch, cls).__setup__()
|
||||
cls._error_messages.update({
|
||||
'error_domain': ('Error domain "%s".'),
|
||||
'not_schema_dir': ('Not found schema "%s" - "%s". '
|
||||
'Create Schema and generate index before searching.'),
|
||||
'not_fields': ('Not found parse fields in schema "%s". '
|
||||
'Select one or more parser fields in schema.'),
|
||||
})
|
||||
|
||||
def do_open_(self, action):
|
||||
schema = self.start.schema
|
||||
q = self.start.q
|
||||
|
||||
db_name = Transaction().cursor.dbname
|
||||
lang = Transaction().context.get('language').lower()
|
||||
|
||||
schema_dir = os.path.join(config.get('database', 'path'),
|
||||
db_name, 'whoosh', schema.slug, lang)
|
||||
|
||||
if not os.path.exists(schema_dir):
|
||||
self.raise_user_error('not_schema_dir', (schema.slug, lang))
|
||||
|
||||
fields = []
|
||||
for field in schema.fields_:
|
||||
if field.parser:
|
||||
fields.append(field.name)
|
||||
if not fields:
|
||||
self.raise_user_error('not_fields', (schema.slug))
|
||||
|
||||
ix = index.open_dir(schema_dir)
|
||||
|
||||
query = q.replace('+', ' AND ').replace('-', ' NOT ')
|
||||
query = MultifieldParser(fields, ix.schema).parse(query)
|
||||
|
||||
with ix.searcher() as s:
|
||||
results = s.search(query)
|
||||
res = [result.get('id') for result in results]
|
||||
|
||||
model = schema.model
|
||||
model_model = model.model
|
||||
|
||||
domain = [('id', 'in', res)]
|
||||
|
||||
domain = PYSONEncoder().encode(domain)
|
||||
context = {}
|
||||
return {
|
||||
'id': -1,
|
||||
'name': '%s - %s (%s)' % (schema.name, model.name, q),
|
||||
'model': model_model,
|
||||
'res_model': model_model,
|
||||
'type': 'ir.action.act_window',
|
||||
'pyson_domain': domain,
|
||||
'pyson_context': context,
|
||||
'pyson_order': '[]',
|
||||
'pyson_search_value': '[]',
|
||||
'domains': [],
|
||||
}, {}
|
||||
|
||||
|
||||
class WhooshWhooshLang(ModelSQL):
|
||||
'Whoosh Schema - Whoosh Lang'
|
||||
__name__ = 'whoosh.schema-whoosh.lang'
|
||||
_table = 'whoosh_schema_lang_rel'
|
||||
schema = fields.Many2One('whoosh.schema', 'Schema', ondelete='CASCADE',
|
||||
required=True, select=True)
|
||||
lang = fields.Many2One('ir.lang', 'Language',
|
||||
ondelete='CASCADE', required=True, select=True)
|
||||
|
||||
|
||||
class WhooshSchemaGroup(ModelSQL):
|
||||
'Whoosh Schema - Group'
|
||||
__name__ = 'whoosh.schema-res.group'
|
||||
schema = fields.Many2One('whoosh.schema', 'Schema', required=True)
|
||||
group = fields.Many2One('res.group', 'Group', required=True)
|
|
@ -0,0 +1,133 @@
|
|||
<?xml version="1.0"?>
|
||||
<!-- This file is part whooshsearch module for Tryton.
|
||||
The COPYRIGHT file at the top level of this repository contains the full copyright notices and license terms. -->
|
||||
<tryton>
|
||||
<data>
|
||||
<record model="ir.ui.icon" id="whoosh_icon">
|
||||
<field name="name">tryton-whoosh</field>
|
||||
<field name="path">icons/tryton-whoosh.svg</field>
|
||||
</record>
|
||||
<menuitem name="Whoosh" id="main_whoosh_menu" icon="tryton-whoosh"/>
|
||||
|
||||
<menuitem name="Configuration" parent="main_whoosh_menu"
|
||||
id="menu_configuration" sequence="0" icon="tryton-preferences"/>
|
||||
<record model="ir.ui.menu-res.group" id="menu_configuration_group_admin">
|
||||
<field name="menu" ref="menu_configuration"/>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
</record>
|
||||
|
||||
<!-- Whoosh Schema -->
|
||||
<record model="ir.ui.view" id="whoosh_schema_view_form">
|
||||
<field name="model">whoosh.schema</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">whoosh_schema_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="whoosh_schema_view_tree">
|
||||
<field name="model">whoosh.schema</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">whoosh_schema_tree</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_whoosh_schema_form">
|
||||
<field name="name">Whoosh Schema</field>
|
||||
<field name="res_model">whoosh.schema</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_whoosh_schema_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="whoosh_schema_view_tree"/>
|
||||
<field name="act_window" ref="act_whoosh_schema_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_whoosh_schema_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="whoosh_schema_view_form"/>
|
||||
<field name="act_window" ref="act_whoosh_schema_form"/>
|
||||
</record>
|
||||
<menuitem id="menu_whoosh_schema" name="Schema" action="act_whoosh_schema_form" parent="menu_configuration"/>
|
||||
|
||||
<!-- Whoosh Field -->
|
||||
<record model="ir.ui.view" id="whoosh_field_view_form">
|
||||
<field name="model">whoosh.field</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">whoosh_field_form</field>
|
||||
</record>
|
||||
<record model="ir.ui.view" id="whoosh_field_view_tree">
|
||||
<field name="model">whoosh.field</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="name">whoosh_field_tree</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.act_window" id="act_whoosh_field_form">
|
||||
<field name="name">Whoosh Field</field>
|
||||
<field name="res_model">whoosh.field</field>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_whoosh_field_form_view1">
|
||||
<field name="sequence" eval="10"/>
|
||||
<field name="view" ref="whoosh_field_view_tree"/>
|
||||
<field name="act_window" ref="act_whoosh_field_form"/>
|
||||
</record>
|
||||
<record model="ir.action.act_window.view" id="act_whoosh_field_form_view2">
|
||||
<field name="sequence" eval="20"/>
|
||||
<field name="view" ref="whoosh_field_view_form"/>
|
||||
<field name="act_window" ref="act_whoosh_field_form"/>
|
||||
</record>
|
||||
|
||||
<!-- Keywords -->
|
||||
<record model="ir.action.act_window" id="act_whoosh_fields">
|
||||
<field name="name">Fields</field>
|
||||
<field name="res_model">whoosh.field</field>
|
||||
<field name="domain">[('schema', 'in', Eval('active_ids'))]</field>
|
||||
</record>
|
||||
<record model="ir.action.keyword" id="act_open_whoosh_fields_keyword1">
|
||||
<field name="keyword">form_relate</field>
|
||||
<field name="model">whoosh.schema,-1</field>
|
||||
<field name="action" ref="act_whoosh_fields"/>
|
||||
</record>
|
||||
|
||||
<!-- Searching wizard -->
|
||||
<record model="ir.ui.view" id="whoosh_schema_start_view_form">
|
||||
<field name="model">whoosh.schema.start</field>
|
||||
<field name="type">form</field>
|
||||
<field name="name">schema_start_form</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.action.wizard" id="act_whoosh_search">
|
||||
<field name="name">Search</field>
|
||||
<field name="wiz_name">whoosh.search</field>
|
||||
</record>
|
||||
<menuitem id="menu_act_whoosh_search"
|
||||
parent="main_whoosh_menu" action="act_whoosh_search"/>
|
||||
|
||||
<!-- Access -->
|
||||
<record model="ir.model.access" id="access_whoosh_schema">
|
||||
<field name="model" search="[('model', '=', 'whoosh.schema')]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
<record model="ir.model.access" id="access_whoosh_schema_admin">
|
||||
<field name="model" search="[('model', '=', 'whoosh.schema')]"/>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
|
||||
<record model="ir.model.access" id="access_whoosh_field">
|
||||
<field name="model" search="[('model', '=', 'whoosh.field')]"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="False"/>
|
||||
<field name="perm_create" eval="False"/>
|
||||
<field name="perm_delete" eval="False"/>
|
||||
</record>
|
||||
<record model="ir.model.access" id="access_whoosh_field_admin">
|
||||
<field name="model" search="[('model', '=', 'whoosh.field')]"/>
|
||||
<field name="group" ref="res.group_admin"/>
|
||||
<field name="perm_read" eval="True"/>
|
||||
<field name="perm_write" eval="True"/>
|
||||
<field name="perm_create" eval="True"/>
|
||||
<field name="perm_delete" eval="True"/>
|
||||
</record>
|
||||
</data>
|
||||
</tryton>
|
Loading…
Reference in New Issue