From 93277604e8d02e50985f43d91ede1af5178b2743 Mon Sep 17 00:00:00 2001 From: MuK IT GmbH Date: Fri, 12 Oct 2018 08:47:16 +0000 Subject: [PATCH] publish muk_fields_lobject - 12.0 --- muk_fields_lobject/LICENSE | 619 ++++++++++++++++++ muk_fields_lobject/__init__.py | 29 + muk_fields_lobject/__manifest__.py | 49 ++ muk_fields_lobject/controllers/__init__.py | 20 + muk_fields_lobject/controllers/main.py | 67 ++ muk_fields_lobject/doc/changelog.rst | 22 + muk_fields_lobject/doc/index.rst | 127 ++++ muk_fields_lobject/fields/__init__.py | 20 + muk_fields_lobject/fields/lobject.py | 101 +++ muk_fields_lobject/i18n/de.po | 16 + .../i18n/muk_fields_lobject.pot | 16 + muk_fields_lobject/models/__init__.py | 22 + muk_fields_lobject/models/base.py | 42 ++ muk_fields_lobject/models/ir_http.py | 88 +++ muk_fields_lobject/models/ir_model_fields.py | 27 + muk_fields_lobject/patch/__init__.py | 22 + muk_fields_lobject/patch/fields.py | 24 + .../static/description/banner.png | Bin 0 -> 48064 bytes .../static/description/icon.png | Bin 0 -> 17812 bytes .../static/description/icon.svg | 1 + .../static/description/index.html | 120 ++++ .../static/description/logo.png | Bin 0 -> 38064 bytes muk_fields_lobject/tests/__init__.py | 20 + muk_fields_lobject/tests/test_lobject.py | 40 ++ 24 files changed, 1492 insertions(+) create mode 100644 muk_fields_lobject/LICENSE create mode 100644 muk_fields_lobject/__init__.py create mode 100644 muk_fields_lobject/__manifest__.py create mode 100644 muk_fields_lobject/controllers/__init__.py create mode 100644 muk_fields_lobject/controllers/main.py create mode 100644 muk_fields_lobject/doc/changelog.rst create mode 100644 muk_fields_lobject/doc/index.rst create mode 100644 muk_fields_lobject/fields/__init__.py create mode 100644 muk_fields_lobject/fields/lobject.py create mode 100644 muk_fields_lobject/i18n/de.po create mode 100644 muk_fields_lobject/i18n/muk_fields_lobject.pot create mode 100644 muk_fields_lobject/models/__init__.py create mode 100644 muk_fields_lobject/models/base.py create mode 100644 muk_fields_lobject/models/ir_http.py create mode 100644 muk_fields_lobject/models/ir_model_fields.py create mode 100644 muk_fields_lobject/patch/__init__.py create mode 100644 muk_fields_lobject/patch/fields.py create mode 100644 muk_fields_lobject/static/description/banner.png create mode 100644 muk_fields_lobject/static/description/icon.png create mode 100644 muk_fields_lobject/static/description/icon.svg create mode 100644 muk_fields_lobject/static/description/index.html create mode 100644 muk_fields_lobject/static/description/logo.png create mode 100644 muk_fields_lobject/tests/__init__.py create mode 100644 muk_fields_lobject/tests/test_lobject.py diff --git a/muk_fields_lobject/LICENSE b/muk_fields_lobject/LICENSE new file mode 100644 index 0000000..faf7bf4 --- /dev/null +++ b/muk_fields_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_fields_lobject/__init__.py b/muk_fields_lobject/__init__.py new file mode 100644 index 0000000..4dd32b6 --- /dev/null +++ b/muk_fields_lobject/__init__.py @@ -0,0 +1,29 @@ +################################################################################### +# +# 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 fields +from . import models +from . import controllers + +#---------------------------------------------------------- +# Patch System on Load +#---------------------------------------------------------- + +def _patch_system(): + from . import patch \ No newline at end of file diff --git a/muk_fields_lobject/__manifest__.py b/muk_fields_lobject/__manifest__.py new file mode 100644 index 0000000..d0a4a25 --- /dev/null +++ b/muk_fields_lobject/__manifest__.py @@ -0,0 +1,49 @@ +################################################################################### +# +# 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", + "summary": """PGSQL Large Objects Support""", + "version": '12.0.2.2.3', + "category": 'Extra Tools', + "license": "AGPL-3", + "website": "https://www.mukit.at", + "live_test_url": "https://demo.mukit.at/web/login", + "author": "MuK IT", + "contributors": [ + "Mathias Markl ", + ], + "depends": [ + "base", + ], + "qweb": [ + "static/src/xml/*.xml", + ], + "images": [ + 'static/description/banner.png' + ], + "external_dependencies": { + "python": [], + "bin": [], + }, + "auto_install": False, + "application": False, + "installable": True, + "post_load": "_patch_system", +} diff --git a/muk_fields_lobject/controllers/__init__.py b/muk_fields_lobject/controllers/__init__.py new file mode 100644 index 0000000..f872850 --- /dev/null +++ b/muk_fields_lobject/controllers/__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 main diff --git a/muk_fields_lobject/controllers/main.py b/muk_fields_lobject/controllers/main.py new file mode 100644 index 0000000..a02a8bb --- /dev/null +++ b/muk_fields_lobject/controllers/main.py @@ -0,0 +1,67 @@ +################################################################################### +# +# 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 logging + +from werkzeug import utils +from werkzeug import wrappers + +from odoo import http +from odoo.http import request + +_logger = logging.getLogger(__name__) + +def lobject_content(xmlid=None, model=None, id=None, field='content', unique=False, + filename=None, filename_field='content_fname', download=False, + mimetype=None, default_mimetype='application/octet-stream', env=None): + return request.registry['ir.http'].lobject_content( + xmlid=xmlid, model=model, id=id, field=field, unique=unique, + filename=filename, filename_field=filename_field, download=download, + mimetype=mimetype, default_mimetype=default_mimetype, env=env) + +class LargeObjectController(http.Controller): + + @http.route(['/web/lobject', + '/web/lobject/', + '/web/lobject//', + '/web/lobject/', + '/web/lobject//', + '/web/lobject/-', + '/web/lobject/-/', + '/web/lobject///', + '/web/lobject////'], type='http', auth="public") + def content_lobject(self, xmlid=None, model=None, id=None, field='content', + filename=None, filename_field='content_fname', unique=None, + mimetype=None, download=None, data=None, token=None): + status, headers, content = lobject_content( + xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, + filename_field=filename_field, download=download, mimetype=mimetype) + if status == 304: + response = wrappers.Response(status=status, headers=headers) + elif status == 301: + return utils.redirect(content, code=301) + elif status != 200: + response = request.not_found() + else: + headers.append(('Content-Length', content.seek(0, 2))) + content.seek(0, 0) + response = wrappers.Response(content, headers=headers, status=status, direct_passthrough=True) + if token: + response.set_cookie('fileToken', token) + return response \ No newline at end of file diff --git a/muk_fields_lobject/doc/changelog.rst b/muk_fields_lobject/doc/changelog.rst new file mode 100644 index 0000000..8466ee4 --- /dev/null +++ b/muk_fields_lobject/doc/changelog.rst @@ -0,0 +1,22 @@ +`2.2.0` +------- + +- Monkey Patch Methods + +`2.1.0` +------- + +- Added XML View Support + +`2.0.0` +------- + +- Migrated to Python 3 +- Can handle Base64 input +- Can return value as Base64 +- Can return value as Checksum + +`1.0.0` +------- + +- Init version diff --git a/muk_fields_lobject/doc/index.rst b/muk_fields_lobject/doc/index.rst new file mode 100644 index 0000000..f0110ba --- /dev/null +++ b/muk_fields_lobject/doc/index.rst @@ -0,0 +1,127 @@ +======================= +MuK Large Objects Field +======================= + +PostgreSQL offers support for large objects, which provide stream-style access +to user data that is stored in a special large-object structure. They are useful +with data values too large to be manipulated conveniently as a whole. + +Psycopg allows access to the large object using the `lobject` class. Objects are +generated using the `connection.lobject()` factory method. Data can be retrieved +either as bytes or as Unicode strings. + +Psycopg large object support efficient import/export with file system files using +the `lo_import()` and `lo_export()` libpq functions. + +Changed in version 2.6: added support for large objects greated than 2GB. Note +that the support is enabled only if all the following conditions are verified: + +* the Python build is 64 bits; +* the extension was built against at least libpq 9.3; +* the server version is at least PostgreSQL 9.3 (server_version must be >= 90300). + +If Psycopg was built with 64 bits large objects support (i.e. the first two +contidions above are verified), the `psycopg2.__version__` constant will contain +the lo64 flag. If any of the contition is not met several lobject methods will +fail if the arguments exceed 2GB. + +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 +============= + +No additional configuration is needed to use this module. + +Usage +============= + +This module has no direct visible effect on the system. It adds a new field type, +which can be used in other modules. + +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_fields_lobject/fields/__init__.py b/muk_fields_lobject/fields/__init__.py new file mode 100644 index 0000000..031eb0e --- /dev/null +++ b/muk_fields_lobject/fields/__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 lobject diff --git a/muk_fields_lobject/fields/lobject.py b/muk_fields_lobject/fields/lobject.py new file mode 100644 index 0000000..7695570 --- /dev/null +++ b/muk_fields_lobject/fields/lobject.py @@ -0,0 +1,101 @@ +################################################################################### +# +# 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 hashlib +import logging +import binascii +import tempfile + +from odoo import fields +from odoo.tools import human_size + +_logger = logging.getLogger(__name__) + +class LargeObject(fields.Field): + + type = 'lobject' + column_type = ('oid', 'oid') + _slots = { + 'prefetch': False, + 'context_dependent': True, + } + + def convert_to_column(self, value, record, values=None): + oid = record.with_context({'oid': True})[self.name] + if oid: + record.env.cr._cnx.lobject(oid, 'rb').unlink() + if not value: + return None + lobject = record.env.cr._cnx.lobject(0, 'wb') + if isinstance(value, bytes): + try: + if base64.b64encode(base64.b64decode(value)) == value: + lobject.write(base64.b64decode(value)) + else: + lobject.write(value) + except binascii.Error: + lobject.write(value) + elif isinstance(value, str): + lobject.write(base64.b64decode(value.encode('ascii'))) + else: + while True: + chunk = value.read(4096) + if not chunk: + break + lobject.write(chunk) + return lobject.oid + + def convert_to_record(self, value, record): + if value and isinstance(value, int): + lobject = record.env.cr._cnx.lobject(value, 'rb') + if record._context.get('human_size'): + return human_size(lobject.seek(0, 2)) + elif record._context.get('bin_size'): + return lobject.seek(0, 2) + elif record._context.get('oid'): + return lobject.oid + elif record._context.get('base64'): + return base64.b64encode(lobject.read()) + elif record._context.get('stream'): + file = tempfile.TemporaryFile() + while True: + chunk = lobject.read(4096) + if not chunk: + file.seek(0) + return file + file.write(chunk) + elif record._context.get('checksum'): + checksum = hashlib.md5() + while True: + chunk = lobject.read(4096) + if not chunk: + return checksum.hexdigest() + checksum.update(chunk) + else: + return lobject.read() + return value + + def convert_to_export(self, value, record): + if value: + lobject = record.env.cr._cnx.lobject(value, 'rb') + if record._context.get('export_raw_data'): + return lobject.read() + return base64.b64encode(lobject.read()) + return '' \ No newline at end of file diff --git a/muk_fields_lobject/i18n/de.po b/muk_fields_lobject/i18n/de.po new file mode 100644 index 0000000..518abef --- /dev/null +++ b/muk_fields_lobject/i18n/de.po @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-22 07:53+0000\n" +"PO-Revision-Date: 2018-01-22 07:53+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" + diff --git a/muk_fields_lobject/i18n/muk_fields_lobject.pot b/muk_fields_lobject/i18n/muk_fields_lobject.pot new file mode 100644 index 0000000..518abef --- /dev/null +++ b/muk_fields_lobject/i18n/muk_fields_lobject.pot @@ -0,0 +1,16 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 11.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2018-01-22 07:53+0000\n" +"PO-Revision-Date: 2018-01-22 07:53+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" + diff --git a/muk_fields_lobject/models/__init__.py b/muk_fields_lobject/models/__init__.py new file mode 100644 index 0000000..75db8c6 --- /dev/null +++ b/muk_fields_lobject/models/__init__.py @@ -0,0 +1,22 @@ + ################################################################################### +# +# 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 base +from . import ir_http +from . import ir_model_fields diff --git a/muk_fields_lobject/models/base.py b/muk_fields_lobject/models/base.py new file mode 100644 index 0000000..9beea95 --- /dev/null +++ b/muk_fields_lobject/models/base.py @@ -0,0 +1,42 @@ +################################################################################### +# +# 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 logging + +from odoo import api, models, fields + +_logger = logging.getLogger(__name__) + +class Base(models.AbstractModel): + + _inherit = 'base' + + @api.multi + def unlink(self): + oids = [] + for name in self._fields: + field = self._fields[name] + if field.type == 'lobject' and field.store: + for record in self: + oid = record.with_context({'oid': True})[name] + if oid: + oids.append(oid) + super(Base, self).unlink() + for oid in oids: + self.env.cr._cnx.lobject(oid, 'rb').unlink() \ No newline at end of file diff --git a/muk_fields_lobject/models/ir_http.py b/muk_fields_lobject/models/ir_http.py new file mode 100644 index 0000000..9aad20e --- /dev/null +++ b/muk_fields_lobject/models/ir_http.py @@ -0,0 +1,88 @@ +################################################################################### +# +# 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 logging +import mimetypes + +from odoo import models +from odoo.http import request, STATIC_CACHE +from odoo.exceptions import AccessError + +_logger = logging.getLogger(__name__) + +class LargeObjectControllerIrHttp(models.AbstractModel): + + _inherit = 'ir.http' + + @classmethod + def lobject_content(cls, xmlid=None, model=None, id=None, field='content', unique=False, + filename=None, filename_field='content_fname', download=False, + mimetype=None, default_mimetype='application/octet-stream', env=None): + """ Get file, attachment or downloadable content + + If the xmlid and id parameter is omitted, fetches the default value for the + binary field (via the default_get method), otherwise fetches the field for + that precise record. + + :param str xmlid: xmlid of the record + :param str model: name of the model to fetch the binary from + :param int id: id of the record from which to fetch the binary + :param str field: binary field + :param bool unique: add a max-age for the cache control + :param str filename: choose a filename + :param str filename_field: if not create an filename with model-id-field + :param bool download: apply headers to download the file + :param str mimetype: mintype of the field (for headers) + :param str default_mimetype: default mintype if no mintype found + :param Environment env: by default use request.env + :returns: (status, headers, content) + """ + obj = None + env = env or request.env + if xmlid: + obj = cls._xmlid_to_obj(env, xmlid) + elif id and model in env.registry: + obj = env[model].browse(int(id)) + if not obj or not obj.exists() or field not in obj: + return (404, [], None) + try: + last_update = obj['__last_update'] + except AccessError: + return (403, [], None) + status, headers, content = None, [], None + content = obj.with_context({'stream': True})[field] or b'' + if not filename: + if filename_field in obj: + filename = obj[filename_field] + else: + filename = "%s-%s-%s" % (obj._name, obj.id, field) + mimetype = 'mimetype' in obj and obj.mimetype or False + if not mimetype and filename: + mimetype = mimetypes.guess_type(filename)[0] + if not mimetype: + mimetype = default_mimetype + headers += [('Content-Type', mimetype), ('X-Content-Type-Options', 'nosniff')] + etag = bool(request) and request.httprequest.headers.get('If-None-Match') + retag = '"%s"' % obj.with_context({'checksum': True})[field] if content else "" + status = status or (304 if etag == retag else 200) + headers.append(('ETag', retag)) + headers.append(('Cache-Control', 'max-age=%s' % (STATIC_CACHE if unique else 0))) + if download: + headers.append(('Content-Disposition', cls.content_disposition(filename))) + return (status, headers, content) \ No newline at end of file diff --git a/muk_fields_lobject/models/ir_model_fields.py b/muk_fields_lobject/models/ir_model_fields.py new file mode 100644 index 0000000..eacd9be --- /dev/null +++ b/muk_fields_lobject/models/ir_model_fields.py @@ -0,0 +1,27 @@ +################################################################################### +# +# 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 odoo import _, api, models, fields +from odoo.exceptions import ValidationError + +class IrModelField(models.Model): + + _inherit = 'ir.model.fields' + + ttype = fields.Selection(selection_add=[('lobject', 'lobject')]) \ No newline at end of file diff --git a/muk_fields_lobject/patch/__init__.py b/muk_fields_lobject/patch/__init__.py new file mode 100644 index 0000000..d4b07e3 --- /dev/null +++ b/muk_fields_lobject/patch/__init__.py @@ -0,0 +1,22 @@ +################################################################################### +# +# MuK Document Management System +# +# 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 fields \ No newline at end of file diff --git a/muk_fields_lobject/patch/fields.py b/muk_fields_lobject/patch/fields.py new file mode 100644 index 0000000..121ebfb --- /dev/null +++ b/muk_fields_lobject/patch/fields.py @@ -0,0 +1,24 @@ +################################################################################### +# +# 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 odoo import fields + +from odoo.addons.muk_fields_lobject.fields.lobject import LargeObject + +fields.LargeObject = LargeObject \ No newline at end of file diff --git a/muk_fields_lobject/static/description/banner.png b/muk_fields_lobject/static/description/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..6a008b782801dd47f710956c397d493576006054 GIT binary patch literal 48064 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 literal 0 HcmV?d00001 diff --git a/muk_fields_lobject/static/description/icon.png b/muk_fields_lobject/static/description/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..9fff4f9804749d65069f98dfad93b285de8290e7 GIT binary patch literal 17812 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 R#T) \ No newline at end of file diff --git a/muk_fields_lobject/static/description/index.html b/muk_fields_lobject/static/description/index.html new file mode 100644 index 0000000..46d8ecc --- /dev/null +++ b/muk_fields_lobject/static/description/index.html @@ -0,0 +1,120 @@ +
+
+

MuK PGSQL Large Objects

+

PGSQL Large Objects Support

+

MuK IT GmbH - + www.mukit.at

+
+
+ +
+
+
+

Overview

+
+

Provides a field to store bytes as PostgreSQL large objects. + PostgreSQL offers support for large objects, which provide + stream-style access to user data that is stored in a special + large-object structure. They are useful with data values too large + to be manipulated conveniently as a whole.

+
Psycopg2 for Python
+

+ Psycopg allows access to the large object using the + lobject + class. Objects are generated using the + connection.lobject() + factory method. Data can be retrieved either as bytes or as Unicode + strings. +

+

+ Psycopg large object support efficient import/export with file + system files using the + lo_import() + and + lo_export() + libpq functions. +

+

Changed in version 2.6: added support for large objects + greated than 2GB. Note that the support is enabled only if all the + following conditions are verified:

+
    +
  • the Python build is 64 bits;
  • +
  • the extension was built against at least libpq 9.3;
  • +
  • the server version is at least PostgreSQL 9.3 + (server_version must be >= 90300).
  • +
+

+ If Psycopg was built with 64 bits large objects support (i.e. the + first two contidions above are verified), the + psycopg2.__version__ + constant will contain the lo64 flag. If any of the contition is not + met several lobject methods will fail if the arguments exceed 2GB. +

+
+ +
+		    	
+from odoo.addons.muk_fields_lobject.fields.lobject import LargeObject
+
+class LargeObjectModel(models.Model):
+
+    data_content = LargeObject(string="Data")
+
+    @api.multi
+    def data(self):
+        for record in self:
+            bytes = record.data_content
+            oid = record.with_context({'oid': True}).data_content
+            size = record.with_context({'bin_size': True}).data_content
+            stream = record.with_context({'stream': True}).data_content
+		    	
+			
+
+
+
+ +
+

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_fields_lobject/static/description/logo.png b/muk_fields_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_fields_lobject/tests/__init__.py b/muk_fields_lobject/tests/__init__.py new file mode 100644 index 0000000..609d308 --- /dev/null +++ b/muk_fields_lobject/tests/__init__.py @@ -0,0 +1,20 @@ +################################################################################### +# +# Copyright (C) 2017 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_lobject diff --git a/muk_fields_lobject/tests/test_lobject.py b/muk_fields_lobject/tests/test_lobject.py new file mode 100644 index 0000000..c500a48 --- /dev/null +++ b/muk_fields_lobject/tests/test_lobject.py @@ -0,0 +1,40 @@ +################################################################################### +# +# Copyright (C) 2017 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 os +import logging + +from odoo.tests import common + +from odoo.addons.muk_fields_lobject.fields.lobject import LargeObject + +_path = os.path.dirname(os.path.dirname(__file__)) +_logger = logging.getLogger(__name__) + +class LargeObjectTestCase(common.TransactionCase): + + def setUp(self): + super(LargeObjectTestCase, self).setUp() + + def tearDown(self): + super(LargeObjectTestCase, self).tearDown() + + def test_import(self): + self.assertEqual(LargeObject.type, "lobject") + \ No newline at end of file