Languages

Previous versions

1.2
1.1

Source code for openPLM.plmapp.models

#! -*- coding:utf-8 -*-

############################################################################
# openPLM - open source PLM
# Copyright 2010 Philippe Joulaud, Pierre Cosquer
#
# This file is part of openPLM.
#
#    openPLM is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    openPLM is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with openPLM.  If not, see <http://www.gnu.org/licenses/>.
#
# Contact :
#    Philippe Joulaud : ninoo.fr@gmail.com
#    Pierre Cosquer : pcosquer@linobject.com
################################################################################

u"""
Introduction
=============

Models for openPLM

This module contains openPLM's main models.

There are 5 kinds of models:
    * User and group related:
        - :class:`.UserProfile`
        - :class:`.GroupInfo`
        - :class:`.Invitation`
    * Lifecycle related models:
        - :class:`.Lifecycle`
        - :class:`.State`
        - :class:`.LifecycleStates`
        - there are some functions that may be useful:
            - :func:`.get_default_lifecycle`
            - :func:`.get_default_state`
    * History models:
        - :class:`.AbstractHistory`
        - :class:`.History`
        - :class:`.UserHistory`
        - :class:`.GroupHistory`
        - :class:`.history.StateHistory`
    * PLMObject models:
        - :class:`.PLMObject` is the base class
        - :class:`.Part`
        - :class:`.Document` and related classes:
            - :class:`.DocumentStorage` (see also :obj:`.docfs`)
            - :class:`.DocumentFile`
            - :class:`.PrivateFile`
        - functions:
            - :func:`.get_all_plmobjects`
            - :func:`.part.get_all_parts`
            - :func:`.get_all_documents`
            - :func:`.import_models`
    * :class:`.link.Link` models:
        - :class:`.RevisionLink`
        - :class:`.ParentChildLink`
        - :class:`.DocumentPartLink`
        - :class:`.DelegationLink`
        - :class:`.PLMObjectUserLink`
        - :class:`.AlternatePartSet`


Inheritance diagrams
=====================

Users and groups
----------------

.. inheritance-diagram:: openPLM.plmapp.models.user  openPLM.plmapp.models.group
    :parts: 1

Lifecycles
----------

.. inheritance-diagram:: openPLM.plmapp.models.lifecycle
    :parts: 1

PLMObjects
----------

.. inheritance-diagram::  openPLM.plmapp.models.plmobject  openPLM.plmapp.models.part openPLM.plmapp.models.document
    :parts: 1

Histories
----------

.. inheritance-diagram:: openPLM.plmapp.models.history
    :parts: 1

Links
-----

.. inheritance-diagram:: openPLM.plmapp.models.link
    :parts: 1

Classes and functions
========================

.. note::
    This module imports all the following functions and classes.

"""

import os
import fnmatch

from openPLM.plmapp.models.lifecycle import *
from openPLM.plmapp.models.group import *
from openPLM.plmapp.models.user import *
from openPLM.plmapp.models.plmobject import *
from openPLM.plmapp.models.part import *
from openPLM.plmapp.models.document import *
from openPLM.plmapp.models.history import *
from openPLM.plmapp.models.link import *

# monkey patch Comment models to select related fields
from django.contrib.comments.models import Comment
from django.contrib.comments.managers import CommentManager

class CommentManager(CommentManager):
    def get_query_set(self):
        return (super(CommentManager, self)
            .get_query_set()
            .select_related('user', 'user__profile'))
Comment.add_to_class('objects', CommentManager())

# import_models should be the last function

[docs]def import_models(force_reload=False): u""" Imports recursively all modules in directory *plmapp/customized_models* """ MODELS_DIR = "customized_models" IMPORT_ROOT = "openPLM.plmapp.%s" % MODELS_DIR if __name__ != "openPLM.plmapp.models": # this avoids to import models twice return if force_reload or not hasattr(import_models, "done"): import_models.done = True models_dir = os.path.join(os.path.split(__file__)[0], MODELS_DIR) # we browse recursively models_dir for root, dirs, files in os.walk(models_dir): # we only look at python files for module in sorted(fnmatch.filter(files, "*.py")): if module == "__init__.py": # these files are empty continue # import_name should respect the format # 'openPLM.plmapp.customized_models.{module_name}' module_name = os.path.splitext(os.path.basename(module))[0] import_dir = root.split(MODELS_DIR, 1)[-1].replace(os.path.sep, ".") import_name = "%s.%s.%s" % (IMPORT_ROOT, import_dir, module_name) import_name = import_name.replace("..", ".") try: __import__(import_name, globals(), locals(), [], -1) except ImportError, exc: print "Exception in import_models", module_name, exc except StandardError, exc: print "Exception in import_models", module_name, type(exc), exc
import_models()