From 0da20031f7081d0a85a9c89a3d06299bd17234f6 Mon Sep 17 00:00:00 2001 From: MuK IT GmbH Date: Sun, 14 Oct 2018 20:52:19 +0000 Subject: [PATCH] publish muk_attachment_lobject - 12.0 --- muk_attachment_lobject/LICENSE | 619 ++++++++++++++++++ muk_attachment_lobject/__init__.py | 20 + muk_attachment_lobject/__manifest__.py | 48 ++ muk_attachment_lobject/doc/changelog.rst | 9 + muk_attachment_lobject/doc/index.rst | 121 ++++ muk_attachment_lobject/i18n/de.po | 33 + .../i18n/muk_attachment_lobject.pot | 33 + muk_attachment_lobject/models/__init__.py | 20 + .../models/ir_attachment.py | 84 +++ .../static/description/banner.png | Bin 0 -> 47090 bytes .../static/description/icon.png | Bin 0 -> 8273 bytes .../static/description/index.html | 83 +++ .../static/description/logo.png | Bin 0 -> 38064 bytes muk_attachment_lobject/tests/__init__.py | 20 + .../tests/test_attachment.py | 59 ++ 15 files changed, 1149 insertions(+) create mode 100644 muk_attachment_lobject/LICENSE create mode 100644 muk_attachment_lobject/__init__.py create mode 100644 muk_attachment_lobject/__manifest__.py create mode 100644 muk_attachment_lobject/doc/changelog.rst create mode 100644 muk_attachment_lobject/doc/index.rst create mode 100644 muk_attachment_lobject/i18n/de.po create mode 100644 muk_attachment_lobject/i18n/muk_attachment_lobject.pot create mode 100644 muk_attachment_lobject/models/__init__.py create mode 100644 muk_attachment_lobject/models/ir_attachment.py create mode 100644 muk_attachment_lobject/static/description/banner.png create mode 100644 muk_attachment_lobject/static/description/icon.png create mode 100644 muk_attachment_lobject/static/description/index.html create mode 100644 muk_attachment_lobject/static/description/logo.png create mode 100644 muk_attachment_lobject/tests/__init__.py create mode 100644 muk_attachment_lobject/tests/test_attachment.py diff --git a/muk_attachment_lobject/LICENSE b/muk_attachment_lobject/LICENSE new file mode 100644 index 0000000..faf7bf4 --- /dev/null +++ b/muk_attachment_lobject/LICENSE @@ -0,0 +1,619 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are 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. + + 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. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + 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 Affero 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. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + 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 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 work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero 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 Affero 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 Affero 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 Affero 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 \ No newline at end of file diff --git a/muk_attachment_lobject/__init__.py b/muk_attachment_lobject/__init__.py new file mode 100644 index 0000000..9d8a2de --- /dev/null +++ b/muk_attachment_lobject/__init__.py @@ -0,0 +1,20 @@ +################################################################################### +# +# Copyright (C) 2018 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import models diff --git a/muk_attachment_lobject/__manifest__.py b/muk_attachment_lobject/__manifest__.py new file mode 100644 index 0000000..3e1c7ac --- /dev/null +++ b/muk_attachment_lobject/__manifest__.py @@ -0,0 +1,48 @@ +################################################################################### +# +# Copyright (C) 2018 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +{ + "name": "MuK Large Objects Attachment", + "summary": """Large Objects Attachment Location""", + "version": '12.0.2.0.3', + "category": 'Extra Tools', + "license": "AGPL-3", + "website": "http://www.mukit.at", + "live_test_url": "https://demo.mukit.at/web/login", + "author": "MuK IT", + "contributors": [ + "Mathias Markl ", + ], + 'depends': [ + 'muk_fields_lobject', + ], + "qweb": [ + "static/src/xml/*.xml", + ], + "images": [ + 'static/description/banner.png' + ], + "external_dependencies": { + "python": [], + "bin": [], + }, + "application": False, + "installable": True, + "auto_install": False, +} \ No newline at end of file diff --git a/muk_attachment_lobject/doc/changelog.rst b/muk_attachment_lobject/doc/changelog.rst new file mode 100644 index 0000000..f2ae21c --- /dev/null +++ b/muk_attachment_lobject/doc/changelog.rst @@ -0,0 +1,9 @@ +`2.0.0` +------- + +- Migrated to Python 3 + +`1.0.0` +------- + +- Init version diff --git a/muk_attachment_lobject/doc/index.rst b/muk_attachment_lobject/doc/index.rst new file mode 100644 index 0000000..8fa8975 --- /dev/null +++ b/muk_attachment_lobject/doc/index.rst @@ -0,0 +1,121 @@ +=================================== +MuK Large Object Attachment Storage +=================================== + +Provides a new attachment location to save attachments as PostgreSQL large objects. +To enable the large object storage option change the `ir_attachment.location` +parameter to `lobject`. + +**Advantages over the in-database storage** + +* Better RAM efficiency (This is more important for large files than for small ones.) +* Possibility to easily dump the base without the large objects (This can be useful for reproducing bugs.) + +**Advantages over the file system storage** + +* Large objects are transactional (fully ACID) +* They work out of the box in multi-system setups (So there is no need for NFS or similar file sharing tools.) +* Enables you to easily create backups of the entire system + + +Installation +============ + +To install this module, you need to: + +Download the module and add it to your Odoo addons folder. Afterward, log on to +your Odoo server and go to the Apps menu. Trigger the debug mode and update the +list by clicking on the "Update Apps List" link. Now install the module by +clicking on the install button. + +Another way to install this module is via the package management for Python +(`PyPI `_). + +To install our modules using the package manager make sure +`odoo-autodiscover `_ is installed +correctly. Then open a console and install the module by entering the following +command: + +``pip install --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +The module name consists of the Odoo version and the module name, where +underscores are replaced by a dash. + +**Module:** + +``odoo-addon-`` + +**Example:** + +``sudo -H pip3 install --extra-index-url https://nexus.mukit.at/repository/odoo/simple odoo11-addon-muk-utils`` + +Once the installation has been successfully completed, the app is already in the +correct folder. Log on to your Odoo server and go to the Apps menu. Trigger the +debug mode and update the list by clicking on the "Update Apps List" link. Now +install the module by clicking on the install button. + +The biggest advantage of this variant is that you can now also update the app +using the "pip" command. To do this, enter the following command in your console: + +``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +When the process is finished, restart your server and update the application in +Odoo. The steps are the same as for the installation only the button has changed +from "Install" to "Upgrade". + +You can also view available Apps directly in our `repository `_ +and find a more detailed installation guide on our `website `_. + +For modules licensed under OPL-1, you will receive access data when you purchase +the module. If the modules were not purchased directly from +`MuK IT `_ please contact our support (support@mukit.at) +with a confirmation of purchase to receive the corresponding access data. + +Upgrade +============ + +To upgrade this module, you need to: + +Download the module and add it to your Odoo addons folder. Restart the server +and log on to your Odoo server. Select the Apps menu and upgrade the module by +clicking on the upgrade button. + +If you installed the module using the "pip" command, you can also update the +module in the same way. Just type the following command into the console: + +``pip install --upgrade --extra-index-url https://nexus.mukit.at/repository/odoo/simple `` + +When the process is finished, restart your server and update the application in +Odoo, just like you would normally. + +Configuration +============= + +The module has an init hook, which automatically stores all attachments in +large objects, so no additional configuration is needed to use this module. + +Usage +============= + +This module has no direct visible effect on the system. However, existing and +future attachments are stored as large objects. + +Credits +======= + +Contributors +------------ + +* Mathias Markl + +Author & Maintainer +------------------- + +This module is maintained by the `MuK IT GmbH `_. + +MuK IT is an Austrian company specialized in customizing and extending Odoo. +We develop custom solutions for your individual needs to help you focus on +your strength and expertise to grow your business. + +If you want to get in touch please contact us via mail +(sale@mukit.at) or visit our website (https://mukit.at). diff --git a/muk_attachment_lobject/i18n/de.po b/muk_attachment_lobject/i18n/de.po new file mode 100644 index 0000000..4ea453a --- /dev/null +++ b/muk_attachment_lobject/i18n/de.po @@ -0,0 +1,33 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * muk_attachment_lobject +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-22 07:52+0000\n" +"PO-Revision-Date: 2018-01-22 07:52+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: muk_attachment_lobject +#: model:ir.model.fields,field_description:muk_attachment_lobject.field_ir_attachment_store_lobject +msgid "Data" +msgstr "Persönliche Daten" + +#. module: muk_attachment_lobject +#: code:addons/muk_attachment_lobject/models/ir_attachment.py:54 +#, python-format +msgid "Only administrators can execute this action." +msgstr "Only administrators can execute this action." + +#. module: muk_attachment_lobject +#: model:ir.model,name:muk_attachment_lobject.model_ir_attachment +msgid "ir.attachment" +msgstr "ir.attachment" + diff --git a/muk_attachment_lobject/i18n/muk_attachment_lobject.pot b/muk_attachment_lobject/i18n/muk_attachment_lobject.pot new file mode 100644 index 0000000..4a98789 --- /dev/null +++ b/muk_attachment_lobject/i18n/muk_attachment_lobject.pot @@ -0,0 +1,33 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * muk_attachment_lobject +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-22 07:51+0000\n" +"PO-Revision-Date: 2018-01-22 07:51+0000\n" +"Last-Translator: <>\n" +"Language-Team: \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: \n" +"Plural-Forms: \n" + +#. module: muk_attachment_lobject +#: model:ir.model.fields,field_description:muk_attachment_lobject.field_ir_attachment_store_lobject +msgid "Data" +msgstr "" + +#. module: muk_attachment_lobject +#: code:addons/muk_attachment_lobject/models/ir_attachment.py:54 +#, python-format +msgid "Only administrators can execute this action." +msgstr "" + +#. module: muk_attachment_lobject +#: model:ir.model,name:muk_attachment_lobject.model_ir_attachment +msgid "ir.attachment" +msgstr "" + diff --git a/muk_attachment_lobject/models/__init__.py b/muk_attachment_lobject/models/__init__.py new file mode 100644 index 0000000..8e10740 --- /dev/null +++ b/muk_attachment_lobject/models/__init__.py @@ -0,0 +1,20 @@ +################################################################################### +# +# Copyright (C) 2018 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import ir_attachment diff --git a/muk_attachment_lobject/models/ir_attachment.py b/muk_attachment_lobject/models/ir_attachment.py new file mode 100644 index 0000000..bb7abb3 --- /dev/null +++ b/muk_attachment_lobject/models/ir_attachment.py @@ -0,0 +1,84 @@ +################################################################################### +# +# Copyright (C) 2018 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +import base64 +import logging +import mimetypes + +from odoo import api, models, _ +from odoo.exceptions import AccessError + +from odoo.addons.muk_fields_lobject.fields.lobject import LargeObject + +_logger = logging.getLogger(__name__) + +class LObjectIrAttachment(models.Model): + + _inherit = 'ir.attachment' + + store_lobject = LargeObject( + string="Data") + + @api.model + def force_storage(self): + if not self.env.user._is_admin(): + raise AccessError(_('Only administrators can execute this action.')) + storage_domain = { + 'db': ('store_lobject', '=', False), + 'file': ('store_fname', '=', False), + } + record_domain = [ + '&', storage_domain[self._storage()], + '|', ('res_field', '=', False), ('res_field', '!=', False) + ] + self.search(record_domain).migrate() + return True + + @api.depends('store_lobject') + def _compute_datas(self): + bin_size = self._context.get('bin_size') + for attach in self: + if attach.store_lobject: + if bin_size: + attach.datas = attach.store_lobject + else: + attach.datas = attach.with_context({'base64': True}).store_lobject + else: + super(LObjectIrAttachment, attach)._compute_datas() + + def _inverse_datas(self): + location = self._storage() + for attach in self: + if location == 'lobject': + value = attach.datas + bin_data = base64.b64decode(value) if value else b'' + vals = { + 'file_size': len(bin_data), + 'checksum': self._compute_checksum(bin_data), + 'index_content': self._index(bin_data, attach.datas_fname, attach.mimetype), + 'store_fname': False, + 'db_datas': False, + 'store_lobject': bin_data, + } + fname = attach.store_fname + super(LObjectIrAttachment, attach.sudo()).write(vals) + if fname: + self._file_delete(fname) + else: + super(LObjectIrAttachment, attach)._inverse_datas() \ No newline at end of file diff --git a/muk_attachment_lobject/static/description/banner.png b/muk_attachment_lobject/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..4c36d0c7641ba7c8373af15719401f569928e684 GIT binary patch literal 47090 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

+8DOAt^Z>qz`@&p4MS6J}ZtR?1W?P*%9 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 X?0Ip5@yPWf;6GI*G_qLHJm`M_V5T(? literal 0 HcmV?d00001 diff --git a/muk_attachment_lobject/static/description/icon.png b/muk_attachment_lobject/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..1d59a25382952964c02076210a764c04ec84f875 GIT binary patch literal 8273 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 +

+

MuK Large Objects Attachment

+

Large Objects Attachment Location

+

MuK IT GmbH - + www.mukit.at

+
+ + +
+
+
+

Overview

+
+

+ Provides a new attachment location to save attachment as large + objects. To enable the large object storage option change the + ir_attachment.location + parameter to + lobject + . +

+
Advantages over the in-database storage
+
    +
  • Better RAM efficiency (This is more important for large files than for small ones.)
  • +
  • Possibility to easily dump the base without the large objects (This can be useful for reproducing bugs.)
  • +
+
Advantages over the file system storage
+
    +
  • Large objects are transactional (fully ACID)
  • +
  • They work out of the box in multi-system setups (So there is no need for NFS or similar file sharing tools.)
  • +
  • Enables you to easily create backups of the entire system
  • +
+
+
+
+
+ +
+

Demo

+
+
+
User:
+
+
+
apps
+
+
+
Password:
+
+
+
demo
+
+
+ +
+ +
+

Help and Support

+
Feel free to + contact us, if you need any help with your Odoo integration or addiontal + features.
+ + +
\ No newline at end of file diff --git a/muk_attachment_lobject/static/description/logo.png b/muk_attachment_lobject/static/description/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..9427ce33ea36c2ec961356d01d612bae02d48ce2 GIT binary patch literal 38064 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 literal 0 HcmV?d00001 diff --git a/muk_attachment_lobject/tests/__init__.py b/muk_attachment_lobject/tests/__init__.py new file mode 100644 index 0000000..9f04135 --- /dev/null +++ b/muk_attachment_lobject/tests/__init__.py @@ -0,0 +1,20 @@ +################################################################################### +# +# Copyright (C) 2018 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +from . import test_attachment \ No newline at end of file diff --git a/muk_attachment_lobject/tests/test_attachment.py b/muk_attachment_lobject/tests/test_attachment.py new file mode 100644 index 0000000..defcd5a --- /dev/null +++ b/muk_attachment_lobject/tests/test_attachment.py @@ -0,0 +1,59 @@ +################################################################################### +# +# Copyright (C) 2018 MuK IT GmbH +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero 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 Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +################################################################################### + +import base64 +import logging +import unittest + +from odoo.tests import common + +_logger = logging.getLogger(__name__) + +class AttachmentTestCase(common.HttpCase): + + at_install = False + post_install = True + + def setUp(self): + super(AttachmentTestCase, self).setUp() + self.attachment = self.env['ir.attachment'].sudo() + self.param = self.env['ir.config_parameter'].sudo() + + def tearDown(self): + super(AttachmentTestCase, self).tearDown() + + def test_attachment(self): + self.param.set_param('ir_attachment.location', 'lobject') + attach = self.attachment.create({ + 'name': "Test", + 'datas': base64.b64encode(b"\xff data")}) + self.assertTrue(attach.datas) + self.assertTrue(attach.with_context({'bin_size': True}).datas) + oid = attach.with_context({'oid': True}).store_lobject + self.assertTrue(oid) + attach.write({'datas': base64.b64encode(b"\xff data")}) + self.assertTrue(oid != attach.with_context({'oid': True}).store_lobject) + self.assertTrue(attach.export_data(['datas'])) + self.assertTrue(attach.export_data(['datas'], raw_data=True)) + attach.unlink() + + @unittest.skip("The test takes a long time and is therefore skipped by default.") + def test_migration(self): + self.param.set_param('ir_attachment.location', 'lobject') + self.attachment.force_storage() \ No newline at end of file