changeset 3eef9f032cfb in modules/sale:default
details: https://hg.tryton.org/modules/sale?cmd=changeset&node=3eef9f032cfb
description:
Improve documentation
issue9764
review328601002
diffstat:
doc/conf.py | 61 ++++++++++
doc/design.rst | 272 ++++++++++++++++++++++++++++++++++++++++++++++++
doc/index.rst | 91 +--------------
doc/usage/index.rst | 14 ++
doc/usage/presales.rst | 52 +++++++++
doc/usage/process.rst | 113 +++++++++++++++++++
doc/usage/reporting.rst | 20 +++
doc/usage/returns.rst | 42 +++++++
setup.py | 7 +-
9 files changed, 589 insertions(+), 83 deletions(-)
diffs (728 lines):
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/conf.py
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/conf.py Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,61 @@
+# This file is part of Tryton. The COPYRIGHT file at the top level of
+# this repository contains the full copyright notices and license terms.
+
+modules_url = 'https://docs.tryton.org/projects/modules-{module}/en/{series}/'
+trytond_url = 'https://docs.tryton.org/projects/server/en/{series}/'
+
+
+def get_info():
+ import configparser
+ import os
+ import subprocess
+ import sys
+
+ module_dir = os.path.dirname(os.path.dirname(__file__))
+
+ config = configparser.ConfigParser()
+ config.read_file(open(os.path.join(module_dir, 'tryton.cfg')))
+ info = dict(config.items('tryton'))
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--name'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ info['name'] = result.stdout.decode('utf-8').strip()
+
+ result = subprocess.run(
+ [sys.executable, 'setup.py', '--version'],
+ stdout=subprocess.PIPE, check=True, cwd=module_dir)
+ version = result.stdout.decode('utf-8').strip()
+ if 'dev' in version:
+ info['series'] = 'latest'
+ else:
+ info['series'] = '.'.join(version.split('.', 2)[:2])
+
+ for key in {'depends', 'extras_depend'}:
+ info[key] = info.get(key, '').strip().splitlines()
+ info['modules'] = set(info['depends'] + info['extras_depend'])
+ info['modules'] -= {'ir', 'res'}
+
+ return info
+
+
+info = get_info()
+
+master_doc = 'index'
+project = info['name']
+release = version = info['series']
+default_role = 'ref'
+highlight_language = 'none'
+extensions = [
+ 'sphinx.ext.intersphinx',
+ ]
+intersphinx_mapping = {
+ 'trytond': (trytond_url.format(series=version), None),
+ }
+intersphinx_mapping.update({
+ m: (modules_url.format(
+ module=m.replace('_', '-'), series=version), None)
+ for m in info['modules']
+ })
+
+del get_info, info, modules_url, trytond_url
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/design.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/design.rst Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,272 @@
+******
+Design
+******
+
+The *Sale Module* introduces the concepts that are required to manage sales.
+It also extends existing concepts so sales become an fully integrated part of
+the system.
+
+.. _model-sale.sale:
+
+Sale
+====
+
+The *Sale* concept is used to manage the selling process.
+Each sale, at any time, can be in one of several different states.
+A sale progress though these states until it is either done or gets cancelled.
+When some of these state changes happen the
+`Employee <company:model-company.employee>` that triggered the state change
+is also recorded.
+
+Each sale contains details of the `Party <party:model-party.party>` that the
+sale is made to, including details such as the party's preferred
+`Contact Method <party:model-party.contact_mechanism>`, and what
+`Addresses <party:model-party.address>` the shipments and invoices must be
+sent to.
+
+A sale is identified by a unique number that is generated automatically from
+the configured `Sequence <trytond:model-ir.sequence>`.
+It also has other general information like a sale date, description, and
+reference used by the customer.
+
+The sale is made up from one, or more, sales lines.
+These lines can be arranged into a particular order, if required.
+Normally most sales lines provide information about which
+`Products <product:concept-product>` or items are included in the sale.
+Extra lines can be added for things like titles, comments or subtotals.
+
+The total, untaxed, and tax amounts for a sale are derived from the amounts,
+prices and `Taxes <account:model-account.tax>` of the sale's lines.
+
+For sales of physical items, such as goods or assets, the
+`Warehouse <stock:concept-stock.location.warehouse>` the items are dispatched
+from is required.
+The sale's shipment method determines whether
+`Customer Shipments <stock:model-stock.shipment.out>` are automatically created
+for the sale, and when during the process this happens.
+If customer shipments do get created then the
+`Stock Moves <stock:model-stock.move>` on these shipments are linked to the
+sale lines and must be recreated or ignored if they get cancelled.
+
+`Invoices <account_invoice:model-account.invoice>` can be generated
+automatically at the correct time based on the invoice method.
+These invoices are created from data taken from the sale, and when invoicing
+based on shipment they also use the quantities from the shipments.
+The invoices are tracked by the sale, and if they are cancelled they must
+either be recreated or ignored.
+
+.. seealso::
+
+ Sales are found by opening the main menu item:
+
+ |Sales --> Sales|__
+
+ .. |Sales --> Sales| replace:: :menuselection:`Sales --> Sales`
+ __ https://demo.tryton.org/model/sale.sale
+
+Reports
+-------
+
+.. _report-sale.sale:
+
+Sale Report
+^^^^^^^^^^^
+
+The *Sale Report* is a document that can be printed out that contains all the
+relevant information about each sale, including the lines which have been
+sold.
+
+Wizards
+-------
+
+.. _wizard-sale.handle.shipment.exception:
+
+Handle Shipment Exception
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The *Handle Shipment Exception* wizard helps the user ensure each sale
+has the correct `Stock Moves <stock:model-stock.move>` associated with it.
+For stock moves that have been cancelled, it lets the user decide which
+should be re-created, and which should be ignored.
+
+.. _wizard-sale.handle.invoice.exception:
+
+Handle Invoice Exception
+^^^^^^^^^^^^^^^^^^^^^^^^^
+
+The *Handle Invoice Exception* wizard helps the user make sure each sale
+only has the appropriate `Invoices <account_invoice:model-account.invoice>`
+associated with it.
+If any of the sale's invoices get cancelled this wizard provides the user
+with the option to re-create or ignore the cancelled invoice.
+
+.. _wizard-sale.modify_header:
+
+Modify Header
+^^^^^^^^^^^^^
+
+Some fields on a draft sale become read-only when lines are added to it.
+The *Modify Header* wizard allows the values in these fields to be safely
+updated.
+
+.. _wizard-sale.return_sale:
+
+Return Sale
+^^^^^^^^^^^
+
+The *Return Sale* wizard is used when a customer returns all or part of a sale.
+It creates new draft sales that match any selected sales, but with all the
+quantities negated.
+
+.. _model-product.sale.context:
+
+Sale Context
+============
+
+The *Sale Context* allows the user to set a context in which a
+`Product's <product:concept-product>` properties are then calculated.
+
+This is used when showing a list of salable products.
+It allows the user to select a customer and some other properties,
+and then get a list of products that are available along with their prices
+in the selected `Currency <currency:model-currency.currency>`.
+
+.. seealso::
+
+ The Sale Context is used to provide context in the main menu item:
+
+ |Sales --> Salable Products|__
+
+ .. |Sales --> Salable Products| replace:: :menuselection:`Sales -->
Salable Products`
+ __
https://demo.tryton.org/model/product.product;context_model=product.sale.context
+
+.. _concept-sale.reporting:
+
+Sale Reporting
+==============
+
+Each of the different *Sale Reporting* concepts are based on either an
+``Abstract`` sales report, or an ``AbstractTimeseries``.
+There is also a base ``Context`` that is inherited and used to specify things
+such as the date range that is used by the report.
+
+The ``Abstract`` provides the basic properties that makes up a sales report
+including the number of sales and revenue.
+The ``AbstractTimeseries`` is used to extend this with a date.
+This is used in sales reports that cover multiple periods of time.
+These are combined together with additional specific properties to create the
+different sales reports.
+
+.. seealso::
+
+ Sales reports can be accessed from the main menu item:
+
+ :menuselection:`Sales --> Reporting --> Sales`
+
+.. _model-sale.reporting.customer:
+.. _model-sale.reporting.customer.time_series:
+
+By Customer
+-----------
+
+The sales reporting that is done *By Customer* splits the sales up based on
+what each `Customer <party:model-party.party>` bought.
+This is done in two separate parts.
+One that shows the sales, in total, for the selected period from the
+``Context``.
+Another that breaks them down by date into smaller chunks.
+
+.. _model-sale.reporting.product:
+.. _model-sale.reporting.product.time_series:
+
+By Product
+----------
+
+Sales reporting that is done *By Product* splits up the sales based on the
+`Product <product:concept-product>` that was sold.
+This is structured as two parts.
+One that shows the total sales for the selected period of time, and another
+that shows how the sales were distributed over time.
+
+.. _model-sale.reporting.category.tree:
+.. _model-sale.reporting.category:
+.. _model-sale.reporting.category.time_series:
+
+By Category
+-----------
+
+The *By Category* sales reporting shows the sales based on the
+`Category <product:model-product.category>` that a product is in.
+This works in the same way as the `By Product <model-sale.reporting.product>`
+sales reporting, but there is also an additional report that shows the
+categories in their natural tree structure.
+
+.. _model-sale.reporting.region:
+
+By Region
+---------
+
+The sales reporting that is done *By Region* shows sales based on where the
+customer is located.
+This is done by combining together in a tree structure the sales
+`By Country <model-sale.reporting.country>` below which are the sales
+`By Subdivision <model-sale.reporting.country.subdivision>`.
+
+.. _model-sale.reporting.country:
+.. _model-sale.reporting.country.time_series:
+
+By Country
+^^^^^^^^^^
+
+The *By Country* concept groups sales based on the
+`Country <country:model-country.country>` in which the customer is located.
+This is done in two parts, one for total sales and one showing how the sales
+were distributed over time.
+
+.. _model-sale.reporting.country.subdivision:
+.. _model-sale.reporting.country.subdivision.time_series:
+
+By Subdivision
+^^^^^^^^^^^^^^
+
+The *By Subdivision* concept groups sales based on which
+`Subdivision <country:model-country.subdivision>` of a country a customer is
+located.
+This is done in two parts, one for total sales and one showing how the sales
+were distributed over time.
+
+Wizards
+^^^^^^^
+
+.. _wizard-sale.reporting.region.open:
+
+Open Region
+"""""""""""
+
+The *Open Region* wizard ensures that the correct type of time series gets
+opened.
+This may be a time series for either a country, or subdivision, depending on
+what line from the `By Region <model-sale.reporting.region>` was opened.
+
+.. _model-sale.configuration:
+
+Configuration
+=============
+
+The *Sale Configuration* concept is used for the settings that affect the
+general behaviour and default values for sales related activities.
+
+.. note::
+
+ Some of the sales configuration options have no effect unless the
+ :doc:`Task Queue<trytond:topics/task_queue>` has been setup and some
+ workers are running.
+
+.. seealso::
+
+ Sales configuration settings are found by opening the main menu item:
+
+ |Sales --> Configuration --> Sales Configuration|__
+
+ .. |Sales --> Configuration --> Sales Configuration| replace::
:menuselection:`Sales --> Configuration --> Sales Configuration`
+ __ https://demo.tryton.org/model/sale.configuration/1
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/index.rst
--- a/doc/index.rst Sat Apr 10 23:46:24 2021 +0200
+++ b/doc/index.rst Sun Apr 11 21:39:18 2021 +0100
@@ -1,86 +1,15 @@
+###########
Sale Module
###########
-The sale module defines the Sale model.
-
-
-Sale
-****
-
-The sale is mainly defined by a party to which the products will be
-sold and a list of sale lines, each one containing a product and a
-quantity. Here is the extensive list of the fields, most of them are
-optional or completed with sensible default values:
-
-- Party: The customer.
-- Contact: The contact who placed the order.
-- Invoice Party: An optional different party to invoice.
-- Invoice Address: The invoice address of the customer.
-- Shipment Party: An optional different party where the shipment will be sent.
-- Shipment Address: The address where the shipment will be sent.
-- Description: An optional description for the order.
-- Number: The internal reference of the sale (will be generated
- automatically on confirmation).
-- Reference: The optional external reference of the order.
-- Sale Date: The date the sale is made.
-- Payment Term: Define which payment term will be use for the future
- invoice.
-- Warehouse: Define the warehouse from which the goods will be sent.
-- Currency: define the currency to use for this sale. All product
- prices will be computed accordingly.
-- Sale Lines:
+The *Sale Module* helps organise and manage sales made by the company.
+It adds the concept of a sale to Tryton and allows it to be tracked through
+its states from draft to done.
+It also oversees the creation of customer shipments and invoices for the sales,
+and allows reports to be generated that contain aggregated sales figures.
- - Type: The type of the line. The default value is *Line* which
- means that the current sale line contains the fields defined
- hereunder. The other values of Type (*Comment*, *Subtotal*,
- *Title*) are used to add extra lines that will appear on the
- report, thus allowing to easily customise it.
- - Sequence: Allow to order lines. The value of this field is also
- updated with a drag and drop between the lines.
- - Product: An optional reference to the product to sale.
- - Description: The description of the product to sale.
- - Quantity: The quantity to sale.
- - Unit: The unit of measure in which is expressed the quantity.
- - Unit Price: The unit price of the product expressed in the
- currency of the sale.
- - Amount: The amount of the current line (Unit Price multiplied by
- Quantity).
- - Taxes: The list of taxes that will be applied to the current line.
-
-- Invoice State: The state of the invoice related to the sale.
-- Shipment State: The state of the shipment related to the sale.
-- Untaxed: The untaxed amount.
-- Tax: The tax amount.
-- Total: The total amount.
-- State: The state of the sale. May take one of the following
- values: Draft, Quotation, Confirmed, Processing, Cancelled.
-- Company: The company which issue the sale order.
-- Invoice Method: May take one of the following values:
+.. toctree::
+ :maxdepth: 2
- - On Order Processed: The invoice is created when the sale order is
- processed.
- - On Shipment Sent: The invoice is created when the shipment is sent
- and will contains the shipped quantities. If there are several
- shipments for the same sale, several invoices will be created.
- - Manual: Tryton doesn't create any invoice automatically.
-
-- Shipment Method: May take one of the following values:
-
- - On Order Processed: The customer shipment is created when the sale
- order is processed.
- - On Invoice Paid: The customer shipment is created when the invoice
- is paid.
- - Manual: Tryton doesn't create any shipment automatically.
-
- One should note that choosing *On Shipment Sent* for the Invoice
- Method and *On Invoice Paid* for the Shipment Method is an invalid
- combination.
-
-- Comments: A text fields to add custom comments.
-- Invoices: The list of related invoices.
-- Moves: The list of related stock moves.
-- Shipments: The list of related shipments.
-- Return Shipments: The list of related shipments return.
-
-The *Sale* report allow to print the sale orders or to send
-them by mail.
+ usage/index
+ design
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/usage/index.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/usage/index.rst Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,14 @@
+*****
+Usage
+*****
+
+Configuration, management, and reporting tasks relating to sales can be found
+under the [:menuselection:`Sales`] main menu item.
+
+.. toctree::
+ :maxdepth: 1
+
+ presales
+ process
+ returns
+ reporting
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/usage/presales.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/usage/presales.rst Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,52 @@
+.. _Listing customers:
+
+Listing customers
+=================
+
+In Tryton, by definition, the `Parties <party:model-party.party>` that
+have bought `Products <product:concept-product>` from your
+`Company <company:model-company.company>` are its customers.
+The *Sale Module* lets you get a list of these from the
+[:menuselection:`Party --> Parties --> Parties associated to Sales`]
+main menu item.
+
+.. tip::
+
+ For some companies it is important to know which parties are, or may
+ eventually be, customers before they have bought anything.
+ One way you can do this is to create a ``Customer``
+ `Category <party:model-party.category>`, and add all the appropriate
+ parties to it.
+
+.. _Making products salable:
+
+Making products salable
+=======================
+
+Before you can add a `Product <product:concept-product>` to a
+`Sale <model-sale.sale>` it must be marked as salable.
+When you do this you will also be able to set some additional properties such
+as the `Unit of Measure <product:model-product.uom>` the product is normally
+sold in and how long it normally takes before the product can be delivered.
+
+.. _Finding sale prices and availability:
+
+Finding sale prices and availability
+====================================
+
+Before making a `Sale <model-sale.sale>` it is sometimes useful to know how
+much of a `Product <product:concept-product>` is available, and what the sale
+price will be.
+
+You can get a list of this information for the salable products by using the
+[:menuselection:`Sales --> Salable Products`] main menu item.
+The `Sale Context <model-product.sale.context>` allows you to adjust the
+various parameters that can effect stock availability and price, such as which
+`Warehouse <stock:concept-stock.location.warehouse>` will be supplying the
+product, who the customer is and how much they want to buy.
+
+.. tip::
+
+ As with all Tryton data you can export this list to a
+ :abbr:`CSV (Comma Separated Value)` file by using the form's
+ :guilabel:`Export` menu item.
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/usage/process.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/usage/process.rst Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,113 @@
+.. _Creating a sales order:
+
+Creating a sales order
+======================
+
+Creating a new sales order is simply a matter of creating a new
+`Sale <model-sale.sale>` and adding the lines that are required.
+Most of the fields are optional or have sensible default values.
+
+.. tip::
+
+ The sale's reference field is intended to be used to keep track of the
+ customers reference for the sale.
+ This can be filled in at any time even when the sale is done.
+
+.. _Changing a sales order:
+
+Changing a sales order
+======================
+
+The `Sale <model-sale.sale>` needs to be in a draft state in order to change
+the values in most of the fields.
+
+There are also few fields, such as the `Party <party:model-party.party>` and
+`Currency <currency:model-currency.currency>`, which become read-only when any
+lines are added to the order.
+In order to change these without needing to remove the sales lines you can use
+the :guilabel:`Modify Header` button to start the
+`Modify Header <wizard-sale.modify_header>` wizard.
+
+.. _Shipping a sale:
+
+Shipping a sale
+===============
+
+Any goods that were sold as part of the sale are
+`sent to the customer <stock:Sending and receiving deliveries>` using a
+`Customer Shipment <stock:model-stock.shipment.out>`.
+
+Depending on the shipment method chosen for the sale, the customer shipment
+may be created for you automatically.
+
+.. tip::
+
+ The customer shipments that have been generated from the sale can be found
+ using the sale's :guilabel:`Shipments` link.
+
+ The :guilabel`Shipments` and stock :guilabel:`Moves` related to a sale
+ can also be found using the items in the sale's
+ :guilabel:`Open related records` menu.
+
+.. _Part shipments:
+
+Part shipments
+^^^^^^^^^^^^^^
+
+In some cases you may want to send a sale to a customer in stages.
+If you want to do this then you just need to make sure that the shipment's
+inventory moves are correct.
+Once the shipment is packed, or the sale is processed again, the sale will
+automatically create a new shipment that contains any remaining quantities.
+This new customer shipment, often referred to as a back-order, can then be
+shipped at a later date, split up further, or cancelled.
+
+.. _Invoicing a sale:
+
+Invoicing a sale
+================
+
+The `Sale's <model-sale.sale>` invoice method determines whether the sale will
+automatically generate `Invoices <account_invoice:model-account.invoice>`.
+
+.. tip::
+
+ The invoices that have been generated from the sale can be found using the
+ sale's :guilabel:`Invoices` link or the :guilabel`Invoices` item found in
+ the sale's :guilabel:`Open related records` menu.
+
+.. _Handling shipment and invoice exceptions:
+
+Handling shipment and invoice exceptions
+========================================
+
+Sometimes you may have cancelled items from a `Sale's <model-sale.sale>`
+`Shipment <stock:model-stock.shipment.out>`, or cancelled a sale's
+`Invoice <account_invoice:model-account.invoice>`, and need to recreate
+them.
+Other times you may have cancelled things because you no longer want to ship,
+or invoice, them.
+As Tryton does not know if a cancelled item needs to be recreated, or not,
+it shows this as an exception in the sale's shipment or invoice state.
+
+For sales that have a shipment or invoice exception you can use the
+`Handle Shipment Exception <wizard-sale.handle.shipment.exception>` or
+`Handle Invoice Exception <wizard-sale.handle.invoice.exception>` wizards
+to recreate the items that need recreating, and ignore the rest.
+
+.. tip::
+
+ When using the wizard the moves and invoices to recreate will, by default,
+ already be selected.
+ This means you will need to deselect any that you do not want to recreate.
+
+.. _Finishing a sale:
+
+Finishing a sale
+================
+
+In Tryton once a `Sale <model-sale.sale>` is being processed there is no
+button that moves the sale into a done state.
+This will happen automatically once the sale's
+`Shipments <stock:model-stock.shipment.out>` and
+`Invoices <account_invoice:model-account.invoice>` are completed.
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/usage/reporting.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/usage/reporting.rst Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,20 @@
+.. _Getting sales data:
+
+Getting sales data
+==================
+
+You can analyse aggregated sales data using the items found under the
+[:menuselection:`Sales --> Reporting`] main menu item.
+These `Sales Reports <concept-sale.reporting>` allow you to view sales
+grouped by a range of different factors.
+
+.. note::
+
+ The value of the sales in these reports are always shown in the
+ `Company's <company:model-company.company>`
+ `Currency <currency:model-currency.currency>`.
+
+ To ensure the values that are shown are correct you must ensure that you
+ have correctly `set the currency exchange rates
+ <currency:Setting currency exchange rates>` for any currencies that you
+ use, including for the company's currency.
diff -r 9e40baf43be1 -r 3eef9f032cfb doc/usage/returns.rst
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/doc/usage/returns.rst Sun Apr 11 21:39:18 2021 +0100
@@ -0,0 +1,42 @@
+.. _Cancelling sales:
+
+Cancelling sales
+================
+
+You can easily cancel `Sales <model-sale.sale>` that are not yet confirmed
+using the :guilabel:`Cancel` button.
+
+Confirmed sales cannot be cancelled, but you can put them back to a state
+where they can be cancelled.
+However, as soon as a confirmed sale starts to be processed it can no longer
+be cancelled.
+This may happen immediately when it is confirmed, or after a delay if one has
+been correctly `Configured <model-sale.configuration>`.
+
+Once a sale has started to be processed, to effectively cancel the sale,
+you must cancel its `Customer Shipments <stock:model-stock.shipment.out>` and
+`Invoices <account_invoice:model-account.invoice>`.
+Once you have done this you must
+`handle the exceptions <Handling shipment and invoice exceptions>` this
+generates, ensuring that none of the moves or invoices are selected for
+recreation.
+
+.. _Handling customer returns:
+
+Handling customer returns
+=========================
+
+Sometimes a customer may decide to return a `Sale <model-sale.sale>`, or part
+of a sale, to you.
+In Tryton this is represented by a sale that has negative quantities.
+
+One way of creating a customer return is to use the
+`Return Sale <wizard-sale.return_sale>` wizard.
+This creates a new draft sales return for the whole of the selected sale.
+
+If the customer has only returned part of the sale, then the sales return can
+be altered as required.
+When it gets processed it will automatically create
+`Credit Notes <account_invoice:model-account.invoice>` and
+`Customer Return Shipments <stock:model-stock.shipment.out.return>` where
+required.
diff -r 9e40baf43be1 -r 3eef9f032cfb setup.py
--- a/setup.py Sat Apr 10 23:46:24 2021 +0200
+++ b/setup.py Sun Apr 11 21:39:18 2021 +0100
@@ -10,9 +10,12 @@
def read(fname):
- return io.open(
+ content = io.open(
os.path.join(os.path.dirname(__file__), fname),
'r', encoding='utf-8').read()
+ content = re.sub(
+ r'(?m)^\.\. toctree::\r?\n((^$|^\s.*$)\r?\n)*', '', content)
+ return content
def get_require_version(name):
@@ -80,7 +83,7 @@
download_url=download_url,
project_urls={
"Bug Tracker": 'https://bugs.tryton.org/',
- "Documentation": 'https://docs.tryton.org/',
+ "Documentation": 'https://docs.tryton.org/projects/modules-sale/',
"Forum": 'https://www.tryton.org/forum',
"Source Code": 'https://hg.tryton.org/modules/sale',
},