Index: /tags/1.0.0/sara_cmt/AUTHORS
===================================================================
--- /tags/1.0.0/sara_cmt/AUTHORS	(revision 14193)
+++ /tags/1.0.0/sara_cmt/AUTHORS	(revision 14193)
@@ -0,0 +1,9 @@
+# CMT was originally created at SARA Computing and Networking Services, which
+# is based in Amsterdam and known as SARA nowadays.
+# 
+# More info about SARA can be found at http://www.sara.nl/
+
+MAIN DEVELOPERS:
+
+Ramon Bastiaans         <ramon.bastiaans@sara.nl>
+Sil Westerveld          <sil.westerveld@sara.nl>
Index: /tags/1.0.0/sara_cmt/CHANGES
===================================================================
--- /tags/1.0.0/sara_cmt/CHANGES	(revision 14193)
+++ /tags/1.0.0/sara_cmt/CHANGES	(revision 14193)
@@ -0,0 +1,11 @@
+v1.0, 16 May 2012 -- Initial packaged release.
+
+* From now on the config is distributed as a sample config file, which differs
+  from previous config files.
+  Users have to modify the sample config file to reflect their settings and
+  rename it to activate the settings.   
+* All extra templatetags are in a single file now, and some of them have been
+  changed a little.
+  Users have to check their current templates to be sure they are still working
+  as expected.
+* CMT is now distributed as a package, installable with pip.
Index: /tags/1.0.0/sara_cmt/LICENSE
===================================================================
--- /tags/1.0.0/sara_cmt/LICENSE	(revision 14193)
+++ /tags/1.0.0/sara_cmt/LICENSE	(revision 14193)
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute 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 and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+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
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the 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 a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, 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.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE 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.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) <year>  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) year name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Index: /tags/1.0.0/sara_cmt/LICENSE.sara
===================================================================
--- /tags/1.0.0/sara_cmt/LICENSE.sara	(revision 14193)
+++ /tags/1.0.0/sara_cmt/LICENSE.sara	(revision 14193)
@@ -0,0 +1,13 @@
+# This program is being developed by Sil Westerveld <Sil.Westerveld@sara.nl>
+# and Ramon Bastiaans <Ramon.Bastiaans@sara.nl>
+# 
+# Copyright (C) 2012, SARA.
+# 
+#   Permission to use, copy, modify, and distribute this software and its
+# documentation without fee is hereby granted, provided that the above
+# copyright notice appears in all copies and that both the copyright notice and
+# this permission notice appear in supporting documentation.
+# 
+#   Neither SARA nor the nor the author make any representations about the
+# suitability of this software for any purpose.  This software is provided
+# ''as is'' without express or implied warranty.
Index: /tags/1.0.0/sara_cmt/MANIFEST.in
===================================================================
--- /tags/1.0.0/sara_cmt/MANIFEST.in	(revision 14193)
+++ /tags/1.0.0/sara_cmt/MANIFEST.in	(revision 14193)
@@ -0,0 +1,10 @@
+# Client only:
+include AUTHORS CHANGES README LICENSE
+include bin/cmt
+recursive-include etc *.conf*
+#include templates/
+recursive-include templates/examples header *.cmt
+#exclude sara_cmt/settings_db.py # only comment out during testing
+
+# Server only:
+#include sara_cmt/apache/django.wsgi
Index: /tags/1.0.0/sara_cmt/README
===================================================================
--- /tags/1.0.0/sara_cmt/README	(revision 14193)
+++ /tags/1.0.0/sara_cmt/README	(revision 14193)
@@ -0,0 +1,34 @@
+CMT is a Cluster Management Tool originally created at SARA Computing and
+Networking Services, which is based in Amsterdam and known as SARA nowadays.
+
+The main reason behind CMT's existence is that we needed a tool that's capable
+of generating configuration-files for certain software running on our clusters.
+CMT has a database, where we store information about our hardware, which is
+used to (let CMT) generate configuration-files, based on templates. At SARA
+it's used in production, to generate configuration-files for services like for
+example dhcpd and bind.
+
+
+DEPENDENCIES
+
+CMT is dependent on the following packages:
+ * Django==1.2, <1.3
+ * IPy==0.75
+ * django-extensions==0.4
+ * django-tagging==0.3.1
+ * psycopg2==2.4.4
+
+Besides these Python-packages, the following software should be installed on your system:
+ * Python>=2.6
+ * header files and a static library for Python
+ * header files for libpq (PostgreSQL library)
+
+
+MORE INFO
+
+For more information can be found at http://subtrac.sara.nl/oss/cmt/
+
+
+CONTACT
+
+For bugs, requests or suggestions, please mail to cmt@sara.nl
Index: /tags/1.0.0/sara_cmt/TODO
===================================================================
--- /tags/1.0.0/sara_cmt/TODO	(revision 14193)
+++ /tags/1.0.0/sara_cmt/TODO	(revision 14193)
@@ -0,0 +1,28 @@
+We want views for:
+  * addresses
+
+
+Fields in models:
+  * HardwareModel.formfactor
+  * Connection.type (leverancier, support, ...)
+
+
+Commandline Interface:
+  * Logging
+  * --script option
+
+
+Web Interface:
+  * Filters:
+    - Racks on Address
+    - Hardware on Room and Address
+
+
+Templates:
+
+
+Feature requests:
+  * Reservering van poorten voor bv SAN, FK naar contactpersoon/klant
+  * Support calls
+  * Colo nummering racks op basis van grid van vloertegels
+  * Link Interfaces, Hardware, and Racks via Slots
Index: /tags/1.0.0/sara_cmt/bin/cmt
===================================================================
--- /tags/1.0.0/sara_cmt/bin/cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/bin/cmt	(revision 14193)
@@ -0,0 +1,494 @@
+#!/usr/bin/env python
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+#####
+#
+# <Setup environment for Django's DB API>
+#
+from sara_cmt import settings
+from django.core.management import setup_environ
+setup_environ(settings)
+import os
+os.environ['DJANGO_SETTINGS_MODULE'] = settings.__name__
+#
+# </Setup environment for Django's DB API>
+#
+#####
+
+#####
+#
+# <Some imports for our Django-template related action>
+#
+from django.template.loader import render_to_string
+from django.template import TemplateDoesNotExist
+import re
+#
+# </Some imports for our Django-template related action>
+#
+#####
+
+from types import ListType, StringTypes
+
+import datetime
+
+import ConfigParser
+import sys
+
+from sara_cmt.django_cli import ModelExtension, ObjectManager, QueryManager, \
+    logger, parser
+
+import sara_cmt.cluster.models
+
+
+from django.db.models import get_model
+
+
+def search_model(value):
+    return get_model('cluster', value)
+
+
+#####
+#
+# <Decorators/etc/cmt/>
+#
+
+
+def crud_validate(func):
+    """
+        Validate the entity given as an argument to CRUD-functions
+    """
+
+    def crudFunc(option, opt_str, value, parser, *args, **kwargs):
+        model = search_model(value)
+        if model:
+            return func(option, opt_str, value, parser, *args, **kwargs)
+        else:
+            logger.error('Entity %s not known.' % (value.__repr__()))
+            sys.exit(1)
+    return crudFunc
+#
+# </Decorators>
+#
+#####
+
+
+
+#####
+#
+# <CMT-specific settings from file>
+#
+
+# Instantiate ConfigParser
+#TODO: think about a (better) way to make this dynamic:
+import site
+
+if site.sys.prefix in [ '/usr', '/' ]:
+    ETC_PREPEND = ''
+else:
+    ETC_PREPEND = site.sys.prefix
+
+configfile = '%s/etc/cmt/cmt.conf' % ETC_PREPEND
+config_parser = ConfigParser.ConfigParser()
+config_parser.optionxform = lambda x: x
+# ^^ Hack for case-insensitivity, reference:
+#    http://www.finalcog.com/python-config-parser-lower-case-names
+config_parser.read(configfile)
+
+# Setup the logger for logging
+loglevel = config_parser.get('defaults', 'LOGLEVEL')
+if loglevel == 'NOTSET' and settings.DEBUG == True:
+    logger.setLevel(config_parser.getint('loglevels', 'DEBUG'))
+else:
+    logger.setLevel(config_parser.getint('loglevels', loglevel))
+
+
+# Collect package information
+CMTSARA_VERSION = config_parser.get('info', 'version').strip("'")
+CMTSARA_DESCRIPTION = config_parser.get('info', 'description').strip("'")
+
+#
+# </CMT-specific settings from file>
+#
+#####
+
+
+
+#####
+#
+# <Managers for database related interactions>
+#
+object_mgr = ObjectManager()
+query_mgr = QueryManager()
+#
+# </Managers for database related interactions>
+#
+#####
+
+
+
+#####
+#
+# <CRUD methods>
+#
+
+
+@crud_validate
+def add(option, opt_str, value, parser, *args, **kwargs):
+    """
+        Add an object according to the given values.
+
+        When the INTERACTIVE-flag has been set and an object is not complete
+        yet, the user should be given the opportunity to add data to the
+        missing fields on an interactive manner.
+    """
+    my_args = collect_args(option, parser)    # get method-specific args-list
+    query_mgr.push_args(my_args, search_model(value), ['set'])
+    query = query_mgr.get_query()
+
+    new_obj = search_model(value)()
+    logger.debug('Initiated a new %s' % new_obj.__class__.__name__)
+
+    new_obj.setattrs_from_dict(query['set'])
+
+    # Complete if needed (only in interactive mode)
+    if parser.values.INTERACTIVE:
+        new_obj.interactive_completion()
+
+    # Save object
+    save_msg = 'Added a new %s'%value
+    if not parser.values.DRYRUN:
+        try:
+            new_obj.save()
+        except Exception, e:
+            logger.error('Could not add new %s: '%(value,e))
+    else:
+        logger.info('[DRYRUN] %s'%save_msg)
+
+
+@crud_validate
+def show(option, opt_str, value, parser, *args, **kwargs):
+    """
+        Show the objects which match the given values (queries).
+    """
+    # Split all given args to dict
+    my_args = collect_args(option, parser)
+    query_mgr.push_args(my_args, search_model(value), ['get'])
+    query = query_mgr.get_query()
+
+    objects = object_mgr.get_objects(query)
+
+    # !!! TODO: either print short, or print long lists !!!
+    # !!! TODO: use config files for fields (not) to print (maybe
+    for _object in objects:
+        ModelExtension.display(_object)
+
+
+@crud_validate
+def change(option, opt_str, value, parser, *args, **kwargs):
+    """
+        Search for an object which matches the given values, and change
+        it/them.
+    """
+    my_args = collect_args(option, parser)
+    query_mgr.push_args(my_args, search_model(value), ['get', 'set'])
+    query = query_mgr.get_query()
+
+    objects = object_mgr.get_objects(query)
+
+    if objects:
+        # Temporary try-except. See subtrac.sara.nl/osd/interne-services/ticket/164
+        try:
+            logger.info('Found %s entities matching query: %s'
+                % (len(objects), ', '.join([_object.label for _object in objects])))
+        except AttributeError:
+            logger.info('Found %s entities matching query: %s'
+                % (len(objects), ', '.join([_object.__unicode__() for _object in objects])))
+        confirmed = not parser.values.INTERACTIVE or \
+            raw_input('Are you sure? [Yn] ')
+        if confirmed in ['', 'y', 'Y', True]:
+            for _object in objects:
+                attr_set_msg = 'Attributes has been set: %s' % _object
+                if not parser.values.DRYRUN:
+                    _object.setattrs_from_dict(query['set'])
+                    logger.debug(attr_set_msg)
+                else:
+                    logger.debug('[DRYRUN] %s' % attr_set_msg)
+        else:
+            logger.info('Change has been cancelled')
+
+
+@crud_validate
+def remove(option, opt_str, value, parser, *args, **kwargs):
+    """
+        Remove the objects which match the given values (queries).
+    """
+    my_args = collect_args(option, parser)
+    query_mgr.push_args(my_args, search_model(value), ['get'])
+    query = query_mgr.get_query()
+
+    objects = object_mgr.get_objects(query)
+
+    if objects:
+        logger.info('Found %s objects matching query: %s'\
+            % (len(objects), ', '.join([_object.__str__()
+                for _object in objects])))
+        confirmation = not parser.values.INTERACTIVE or \
+            raw_input('Are you sure? [Yn] ')
+        print 'confirmation', confirmation
+        # Delete and log
+        if confirmation in ['', 'y', 'Y', True]:
+            logger.info('deleting...')
+            for _object in objects:
+                del_msg = 'Deleted %s' % _object
+                if not parser.values.DRYRUN:
+                    _object.delete()
+                    logger.info(del_msg)
+                else:
+                    logger.info('[DRYRUN] %s' % del_msg)
+
+    else:
+        logger.info('No existing objects found matching query')
+#
+# </CRUD methods>
+#
+#####
+
+
+def generate(option, opt_str, value, parser, *args, **kwargs):
+    from django.template import Context
+
+    # Save full path of templatefile to generate
+    template_filename = value
+
+    # Make a dict with filenames of the available templates
+    files = [f for f in os.listdir(settings.CMT_TEMPLATES_DIR) if f[-4:]=='.cmt']
+    files.sort()
+
+    fdict = {}
+    i = 1
+    for f in files:
+        fdict[i] = f
+        i+=1
+
+    if template_filename[-4:] != '.cmt':
+        template_filename += '.cmt'
+
+    # Loop until a valid template has been chosen by the user
+    while template_filename not in fdict.values():
+        logger.warning("File '%s' not known"%template_filename)
+
+        # Give a numbered overview of the available templates
+        for key,val in fdict.items():
+            print '%s : %s'%(str(key).rjust(2),val)
+        logger.debug('fdict: %s'%fdict.values())
+        template_filename = raw_input('\nChoose: ')
+
+        # If number given, lookup the filename in the dictionary
+        if template_filename.isdigit():
+            num = int(template_filename)
+            if num <= len(fdict):
+                template_filename = fdict[num]
+                logger.debug('filename: %s'%template_filename)
+            else:
+                continue
+        # Else check for the extension
+        elif template_filename[-4:] != '.cmt':
+            template_filename += '.cmt'
+
+        logger.debug('%s (%s)'%(template_filename,type(template_filename)))
+
+    template_fullpath = os.path.join(settings.CMT_TEMPLATES_DIR, template_filename)
+
+    try:
+        # Initialize a Context to render the template with
+        template_data = {}
+        template_data['version'] = CMTSARA_VERSION
+        template_data['svn_id'] = '$Id:$'
+        template_data['svn_url'] = '$URL:$'
+        template_data['input'] = template_fullpath
+        template_data['__template_outputfiles__'] = {} # reserved for data to write to files
+        template_data['epilogue'] = []
+        context = Context(template_data)
+
+        template_data['stores'] = template_data['__template_outputfiles__'] # to stay bw compatible with ramon's code (temporary)
+        
+        rendered_string = render_to_string(template_filename, context_instance=context)
+        # While rendering the template there are variables added to the
+        # Context, so these can be used for post-processing.
+        logger.debug('<RESULT>\n%s\n</RESULT>'%rendered_string)
+
+    except IOError, e:
+        logger.error('Template does not exist: %s' % e)
+
+    for outputfile, content in context['__template_outputfiles__'].items():
+        write_msg = 'Writing outputfile: %s' % outputfile
+        created_msg = 'Outputfile(s) created: %s' % outputfile
+
+        if not parser.values.DRYRUN: # Write output file(s)
+            try:
+                logger.info(write_msg)
+                f = open(outputfile, 'w')
+                f.writelines(content)
+                f.close()
+                logger.info(created_msg)
+            except IOError, e:
+                logger.error('Failed creating outputfile: %s' % e)
+            except KeyError, e:
+                logger.error('No outputfiles defined in template')
+        else:
+            write_msg = '[DRYRUN] %s' % write_msg
+            created_msg = '[DRYRUN] %s' % created_msg
+            logger.info(write_msg)
+            logger.info(created_msg)
+
+    if not parser.values.DRYRUN:
+        try:
+            for script in context['epilogue']:
+                logger.info('Executing epilogue script')
+                os.system(script)
+                logger.info('Finished epilogue script')
+        except KeyError, e:
+            logger.debug('No epilogue script found')
+    return
+
+
+#####
+#
+# <Methods for processing of arguments>
+#
+
+
+def collect_args(option, parser):
+    """
+        Collects the arguments belonging to the given option, and removes them
+        from the arguments-datastructue. Returns the collected arguments as a
+        list.
+    """
+    collected = []
+
+    if parser.rargs:
+
+        def floatable(str):
+            try:
+                float(str)
+                return True
+            except ValueError:
+                return False
+
+        for arg in parser.rargs:
+            # stop on --foo like options
+            if arg[:2] == '--' and len(arg) > 2:
+                break
+            # stop on -a, but not on -3 or -3.0
+            if arg[:1] == '-' and len(arg) > 1 and not floatable(arg):
+                break
+            collected.append(arg)
+
+        parser.largs.extend(parser.rargs[:len(collected)])
+        del parser.rargs[:len(collected)]
+        setattr(parser.values, option.dest, collected)
+
+    logger.debug('Collected arguments for %s: %s' % (option, collected))
+    return collected
+
+
+def main():
+    parser.version = CMTSARA_VERSION
+    parser.description = CMTSARA_DESCRIPTION
+
+    parser.add_option('-n', '--dry-run',
+        action='store_true',
+        dest='DRYRUN',
+        default=config_parser.getboolean('defaults', 'DRYRUN'),
+        help='This flag has to be given before -[aclmr]')
+    parser.add_option('--script',
+        action='store_false',
+        dest='INTERACTIVE',
+        default=config_parser.getboolean('defaults', 'INTERACTIVE'))
+    parser.add_option('-a', '--add',
+        action='callback',
+        callback=add,
+        type='string',
+        metavar='ENTITY',
+        nargs=1,
+        help='Add an object of the given ENTITY. '\
+            'Extra arguments should be given like `set ASSIGNMENTS`, '\
+            'where ASSIGNMENTS are formatted like `ATTR=VAL`')
+    parser.add_option('-c', '--change',
+        action='callback',
+        callback=change,
+        type='string',
+        metavar='ENTITY',
+        nargs=1,
+        help='Change value(s) of object(s) of the given ENTITY. '\
+            'Arguments should be given like `get QUERY set ASSIGNMENTS`, '\
+            'where both QUERY and ASSIGNMENTS consist out of one or more '\
+            'terms formatted like `ATTR=VAL`. Only objects matching QUERY '\
+            'will be changed according to the given ASSIGNMENTS')
+    parser.add_option('-g', '--generate',
+        action='callback',
+        callback=generate,
+        type='string',
+        metavar='TEMPLATE',
+        nargs=1,
+        help='Render the given TEMPLATE, and store the result if specified')
+    parser.add_option('-l', '--list',
+        action='callback',
+        callback=show,
+        type='string',
+        metavar='ENTITY',
+        nargs=1,
+        help='List object(s) of the given ENTITY. Arguments should be given '\
+            'like `get QUERY`, where QUERY consists out of one or more terms '\
+            'formatted like `ATTR=VAL`')
+    parser.add_option('-r', '--remove',
+        action='callback',
+        callback=remove,
+        type='string',
+        metavar='ENTITY',
+        nargs=1,
+        help='Remove object(s) of the given ENTITY. '\
+            'Arguments should be given like `get QUERY`, where QUERY '\
+            'consists out of one or more terms formatted like `ATTR=VAL`. '\
+            'Only objects matching QUERY will be listed')
+
+    # TODO: implement the following option(s)
+    parser.add_option('-v', '--verbose',
+        action='store_true',
+        dest='VERBOSE',
+        default=config_parser.getboolean('defaults', 'VERBOSE'))
+
+    (options, args) = parser.parse_args()
+    logger.debug('(options, args) = (%s, %s)' % (options, args))
+
+    if len(sys.argv) == 1:
+        # No arguments are given
+        parser.print_help()
+        return 1
+
+    return 0
+#
+# </Methods for processing of arguments>
+#
+#####
+
+
+if __name__ == '__main__':
+    status = main()
+    sys.exit(status)
Index: /tags/1.0.0/sara_cmt/etc/cmt.conf.sample
===================================================================
--- /tags/1.0.0/sara_cmt/etc/cmt.conf.sample	(revision 14193)
+++ /tags/1.0.0/sara_cmt/etc/cmt.conf.sample	(revision 14193)
@@ -0,0 +1,27 @@
+[info]
+version       : 'SARA CMT CLI 0.9'
+description   : 'This is the commandline interface of the SARA package SARA CMT.'
+
+[loglevels]
+# Only messages with level of LOGLEVEL or higher will be logged
+CRITICAL  : 50
+ERROR     : 40
+WARNING   : 30
+INFO      : 20
+DEBUG     : 10
+NOTSET    : 0
+
+[defaults]
+DRYRUN      : False
+INTERACTIVE : True
+LOGLEVEL    : INFO
+VERBOSE     : False
+
+[database]
+ENGINE    : postgresql_psycopg2
+NAME      : sara_cmt
+USER      : cmt
+#PASSWORD  : <set_me>
+HOST      : cmt.osd.sara.nl
+#PORT      : <optional>
+TEST_NAME : sara_cmt_test
Index: /tags/1.0.0/sara_cmt/etc/logging.conf
===================================================================
--- /tags/1.0.0/sara_cmt/etc/logging.conf	(revision 14193)
+++ /tags/1.0.0/sara_cmt/etc/logging.conf	(revision 14193)
@@ -0,0 +1,28 @@
+[loggers]
+keys=root,cli
+
+[handlers]
+keys=consoleHandler
+
+[formatters]
+keys=simpleFormatter
+
+[logger_root]
+level=DEBUG
+handlers=consoleHandler
+
+[logger_cli]
+level=DEBUG
+handlers=consoleHandler
+qualname=cli
+propagate=0
+
+[handler_consoleHandler]
+class=StreamHandler
+level=DEBUG
+formatter=simpleFormatter
+args=(sys.stdout,)
+
+[formatter_simpleFormatter]
+#format=%(levelname)-8s %(asctime)s %(name)s %(funcName)s %(lineno)d :: %(message)s
+format=%(levelname)-8s %(funcName)s %(lineno)d :: %(message)s
Index: /tags/1.0.0/sara_cmt/sara_cmt/apache/django.wsgi
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/apache/django.wsgi	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/apache/django.wsgi	(revision 14193)
@@ -0,0 +1,35 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import os, sys
+
+# Append django-libs and directory which holds the sara_cmt project
+sys.path.append('/var/lib/python-support/python%s/django'%sys.version[:3])
+
+# Append SARA CMT specific paths
+PROJECTPATH = os.path.normpath('/opt/sara_cmt')
+
+sys.path.append(PROJECTPATH)
+sys.path.append(os.path.join(PROJECTPATH,'site-packages')) # should be a symbolic link to (non-global) site-packages
+
+
+os.environ['DJANGO_SETTINGS_MODULE'] = 'sara_cmt.settings'
+
+import django.core.handlers.wsgi
+
+application = django.core.handlers.wsgi.WSGIHandler()
+
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/admin.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/admin.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/admin.py	(revision 14193)
@@ -0,0 +1,261 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.contrib import admin
+
+from sara_cmt.cluster.models import Cluster, HardwareUnit, Interface, Network, Rack
+from sara_cmt.cluster.models import Country, Address, Room
+from sara_cmt.cluster.models import Company, Telephonenumber, Connection
+from sara_cmt.cluster.models import HardwareModel, Role, InterfaceType
+from sara_cmt.cluster.models import WarrantyContract, WarrantyType
+
+
+# Some info about the Django admin site can be found at:
+#   http://docs.djangoproject.com/en/dev/intro/tutorial02/#intro-tutorial02
+
+
+
+######
+#
+# A global admin to inherit from
+#
+
+
+class GlobalAdmin(admin.ModelAdmin):
+    date_hierarchy = 'created_on'
+    fields = ('note', 'tags')
+    list_filter = ('created_on', 'updated_on', 'tags')
+    list_per_page = 50
+    extra_fieldset = ('Additional fields', {
+        'fields': fields,
+        'classes': ('collapse',)})
+
+#
+#
+#
+######
+
+
+
+######
+#
+# Inlines
+#
+
+
+class AddressInline(admin.TabularInline):
+    model = Address
+    exclude = GlobalAdmin.fields
+
+
+class InterfaceInline(admin.TabularInline):
+    model = Interface
+    exclude = GlobalAdmin.fields
+
+
+class PhoneInline(admin.TabularInline):
+    model = Telephonenumber
+    exclude = GlobalAdmin.fields
+
+
+class RoomInline(admin.TabularInline):
+    model = Room
+    exclude = GlobalAdmin.fields
+
+#
+#
+#
+######
+
+
+class ClusterAdmin(admin.ModelAdmin):
+    fields       = ('name',) + GlobalAdmin.fields
+    list_display = GlobalAdmin.list_display
+    list_filter  = GlobalAdmin.list_filter
+
+
+class HardwareUnitAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Host info', {'fields': (('cluster', 'label'),)}),
+        ('Configuration', {'fields': (('state', 'role'),)}),
+        ('Machine specifications', {'fields': ('specifications', 'warranty',
+                                               'warranty_tag', 'serial_number')}
+        ),
+        ('Physical location', {'fields': (('rack', 'first_slot'),)}),
+        ('Involved parties', {'fields': ('seller', 'owner')}),
+        GlobalAdmin.extra_fieldset)
+
+    list_display = ('__unicode__', 'warranty_tag', 'cluster', 'address', 'room', 'rack',
+        'first_slot', 'specifications', 'roles', 'in_support')
+    list_filter  = ('cluster', 'rack', 'role', 'specifications', 'warranty') + \
+        GlobalAdmin.list_filter
+    inlines = [InterfaceInline]
+    search_fields = ('label', 'warranty_tag')
+
+
+class CountryAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('None', {'fields': (('name', 'country_code'),)}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('country_code', 'name')
+    list_filter  = GlobalAdmin.list_filter
+
+
+class AddressAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Location', {'fields': ('address', 'postalcode', 'city', 'country'),
+                      'classes': ('wide',)}),
+        GlobalAdmin.extra_fieldset)
+    list_display  = ('address', 'postalcode', 'city', 'country', 'companies')
+    list_filter   = ('country', 'city') + GlobalAdmin.list_filter
+    search_fields = ('address',)
+
+    inlines = [RoomInline]
+
+
+class RoomAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': (('address', 'floor', 'label'),)}),
+        GlobalAdmin.extra_fieldset)
+    list_filter = ('address', 'floor') + GlobalAdmin.list_filter
+    list_display = ('address', 'floor', 'label')
+
+
+class ConnectionAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Summary', {
+            'fields': (('name', 'active'), ('email', 'company', 'address')),
+            'classes': ['wide']
+        }),
+        GlobalAdmin.extra_fieldset)
+    list_display  = ('__unicode__', 'company', 'email')
+    list_filter   = ('company', 'active') + GlobalAdmin.list_filter
+    search_fields = ('name',)
+    inlines       = [PhoneInline]
+
+
+class RackAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': (('room', 'label', 'capacity'),)}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('label', 'address', 'room')
+    list_filter  = ('room',) + GlobalAdmin.list_filter
+
+
+class InterfaceAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Physical', {'fields': (('iftype', 'host'), ('hwaddress', 'ip'))}),
+        ('Network', {'fields': ('network', ('label', 'aliases'))}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('__unicode__', 'network', 'hwaddress', 'ip', 'iftype')
+    list_filter  = ('network', 'iftype') + GlobalAdmin.list_filter
+    search_fields = ('label', 'aliases', 'hwaddress', 'ip', 'host__label')
+
+
+class InterfaceTypeAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Properties', {'fields': (('label', 'vendor'),)}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('label', 'vendor')
+    list_filter  = ('vendor',) + GlobalAdmin.list_filter
+
+
+class RoleAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': ('label',)}),
+        GlobalAdmin.extra_fieldset)
+    list_filter = GlobalAdmin.list_filter
+
+
+class HardwareModelAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Vendor-specific', {'fields': ('vendor', 'name', 'vendorcode')}),
+        ('Dimensions', {'fields': (('rackspace', 'expansions'),)}),
+        GlobalAdmin.extra_fieldset)
+
+    list_display = ('vendor', 'name', 'tags')
+    list_filter  = ('vendor', 'tags') + GlobalAdmin.list_filter
+
+
+class NetworkAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': (('name', 'hostnames', 'domain'),
+                           ('netaddress', 'netmask', 'gateway', 'vlan'))}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('name', 'vlan', 'cidr', 'gateway', 'domain', 'hostnames',
+                    'count_ips_assigned', 'count_ips_free')
+    list_filter  = GlobalAdmin.list_filter
+
+
+class CompanyAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': ('name', )}),
+        ('Contact info', {'fields': ('website', 'addresses')}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('name', 'website', 'get_addresses')
+    list_filter  = GlobalAdmin.list_filter
+    filter_horizontal = ('addresses', )
+
+
+class TelephonenumberAdmin(admin.ModelAdmin):
+    fieldsets = (
+        ('Owner', {'fields': (('connection', 'number_type'),)}),
+        ('Number', {'fields': (('country', 'areacode', 'subscriber_number'),)}),
+        GlobalAdmin.extra_fieldset)
+    list_display = ('connection', 'number_type', '__unicode__')
+    list_filter  = ('number_type', 'country', 'areacode') + GlobalAdmin.list_filter
+
+
+class WarrantyContractAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': (('label', 'warranty_type'), ('contract_number', 'annual_cost'))}),
+        ('Period', {'fields': (('date_from', 'date_to'),)}),
+        GlobalAdmin.extra_fieldset)
+
+    list_display = ('label', 'date_from', 'date_to', 'expired')
+    list_filter  = ('date_to', ) + GlobalAdmin.list_filter
+
+
+class WarrantyTypeAdmin(admin.ModelAdmin):
+    fieldsets = (
+        (None, {'fields': (('label', 'contact'),)}),
+        GlobalAdmin.extra_fieldset)
+
+    list_display = ('label', 'contact')
+    list_filter  = GlobalAdmin.list_filter
+
+
+admin.site.register(Cluster, ClusterAdmin)
+admin.site.register(HardwareUnit, HardwareUnitAdmin)
+admin.site.register(Interface, InterfaceAdmin)
+admin.site.register(Network, NetworkAdmin)
+admin.site.register(Rack, RackAdmin)
+
+admin.site.register(Country, CountryAdmin)
+admin.site.register(Address, AddressAdmin)
+admin.site.register(Room, RoomAdmin)
+
+admin.site.register(Company, CompanyAdmin)
+admin.site.register(Telephonenumber, TelephonenumberAdmin)
+admin.site.register(Connection, ConnectionAdmin)
+
+admin.site.register(HardwareModel, HardwareModelAdmin)
+admin.site.register(Role, RoleAdmin)
+admin.site.register(InterfaceType, InterfaceTypeAdmin)
+
+admin.site.register(WarrantyContract, WarrantyContractAdmin)
+admin.site.register(WarrantyType, WarrantyTypeAdmin)
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/filters.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/filters.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/filters.py	(revision 14193)
@@ -0,0 +1,49 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.db import models
+from django.contrib.admin.filterspecs import FilterSpec, ChoicesFilterSpec, DateFieldFilterSpec
+#from django.utils.encoding import smart_unicode
+from django.utils.translation import ugettext as _
+from datetime import date, timedelta
+
+class InSupportFilterSpec(DateFieldFilterSpec):
+    """
+        Adds filtering by warranty-status values in the admin filter sidebar.
+        Set the in_support_filter filter in the model field attribute
+        'in_support_filter'.
+        
+        my_model_field.in_support_filter = True
+    """
+
+    def __init__(self, f, request, params, model, model_admin):
+        super(InSupportFilterSpec, self).__init__(f, request, params, model, model_admin)
+        
+        today = date.today()
+        days_thirty = today + timedelta(30)
+        self.links = (
+            (_('All'), {}),
+            (_('In Support'), {'%s__gte' % self.field.name: str(today), }),
+            (_('Expiring in 30 days'), {'%s__gte' % self.field.name: str(today), '%s__lte' % self.field.name: str(days_thirty) }),
+            (_('Expired'), {'%s__lte' % self.field.name: str(today), }),
+        )
+
+    def title(self):
+        return 'warranty status'
+
+# register the filter
+FilterSpec.filter_specs.insert(0, (lambda f: getattr(f, 'in_support_filter', False), InSupportFilterSpec))
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0001_initial.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0001_initial.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0001_initial.py	(revision 14193)
@@ -0,0 +1,595 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding model 'Cluster'
+        db.create_table('cluster_cluster', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+        ))
+        db.send_create_signal('cluster', ['Cluster'])
+
+        # Adding model 'HardwareUnit'
+        db.create_table('cluster_hardwareunit', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('cluster', self.gf('django.db.models.fields.related.ForeignKey')(related_name='hardware', to=orm['cluster.Cluster'])),
+            ('specifications', self.gf('django.db.models.fields.related.ForeignKey')(related_name='hardware', blank=True, null=True, to=orm['cluster.HardwareModel'])),
+            ('warranty', self.gf('django.db.models.fields.related.ForeignKey')(related_name='hardware', blank=True, null=True, to=orm['cluster.WarrantyContract'])),
+            ('rack', self.gf('django.db.models.fields.related.ForeignKey')(related_name='contents', to=orm['cluster.Rack'])),
+            ('serialnumber', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, null=True, blank=True)),
+            ('service_tag', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, null=True, blank=True)),
+            ('first_slot', self.gf('django.db.models.fields.PositiveIntegerField')()),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255)),
+        ))
+        db.send_create_signal('cluster', ['HardwareUnit'])
+
+        # Adding unique constraint on 'HardwareUnit', fields ['rack', 'first_slot']
+        db.create_unique('cluster_hardwareunit', ['rack_id', 'first_slot'])
+
+        # Adding M2M table for field role on 'HardwareUnit'
+        db.create_table('cluster_hardwareunit_role', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('hardwareunit', models.ForeignKey(orm['cluster.hardwareunit'], null=False)),
+            ('role', models.ForeignKey(orm['cluster.role'], null=False))
+        ))
+        db.create_unique('cluster_hardwareunit_role', ['hardwareunit_id', 'role_id'])
+
+        # Adding model 'Alias'
+        db.create_table('cluster_alias', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+        ))
+        db.send_create_signal('cluster', ['Alias'])
+
+        # Adding model 'Interface'
+        db.create_table('cluster_interface', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('network', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interfaces', to=orm['cluster.Network'])),
+            ('hardware', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interfaces', to=orm['cluster.HardwareUnit'])),
+            ('type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interfaces', to=orm['cluster.InterfaceType'])),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('hwaddress', self.gf('django.db.models.fields.CharField')(max_length=17, unique=True, blank=True)),
+            ('ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15, null=True, blank=True)),
+        ))
+        db.send_create_signal('cluster', ['Interface'])
+
+        # Adding M2M table for field aliasses on 'Interface'
+        db.create_table('cluster_interface_aliasses', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interface', models.ForeignKey(orm['cluster.interface'], null=False)),
+            ('alias', models.ForeignKey(orm['cluster.alias'], null=False))
+        ))
+        db.create_unique('cluster_interface_aliasses', ['interface_id', 'alias_id'])
+
+        # Adding model 'Network'
+        db.create_table('cluster_network', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('netaddress', self.gf('django.db.models.fields.IPAddressField')(max_length=15)),
+            ('netmask', self.gf('django.db.models.fields.IPAddressField')(max_length=15)),
+            ('domain', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('vlan', self.gf('django.db.models.fields.PositiveIntegerField')(max_length=3, null=True, blank=True)),
+            ('hostnames', self.gf('django.db.models.fields.CharField')(max_length=255)),
+        ))
+        db.send_create_signal('cluster', ['Network'])
+
+        # Adding model 'Rack'
+        db.create_table('cluster_rack', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('room', self.gf('django.db.models.fields.related.ForeignKey')(related_name='racks', to=orm['cluster.Room'])),
+            ('label', self.gf('django.db.models.fields.SlugField')(max_length=255, db_index=True)),
+            ('capacity', self.gf('django.db.models.fields.PositiveIntegerField')()),
+        ))
+        db.send_create_signal('cluster', ['Rack'])
+
+        # Adding model 'Country'
+        db.create_table('cluster_country', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+            ('country_code', self.gf('django.db.models.fields.PositiveIntegerField')(unique=True)),
+        ))
+        db.send_create_signal('cluster', ['Country'])
+
+        # Adding model 'Address'
+        db.create_table('cluster_address', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('country', self.gf('django.db.models.fields.related.ForeignKey')(related_name='addresses', blank=True, null=True, to=orm['cluster.Country'])),
+            ('address', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('postalcode', self.gf('django.db.models.fields.CharField')(max_length=9, blank=True)),
+            ('city', self.gf('django.db.models.fields.CharField')(max_length=255)),
+        ))
+        db.send_create_signal('cluster', ['Address'])
+
+        # Adding unique constraint on 'Address', fields ['address', 'city']
+        db.create_unique('cluster_address', ['address', 'city'])
+
+        # Adding model 'Room'
+        db.create_table('cluster_room', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('address', self.gf('django.db.models.fields.related.ForeignKey')(related_name='rooms', to=orm['cluster.Address'])),
+            ('floor', self.gf('django.db.models.fields.IntegerField')(max_length=2)),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255)),
+        ))
+        db.send_create_signal('cluster', ['Room'])
+
+        # Adding unique constraint on 'Room', fields ['address', 'floor', 'label']
+        db.create_unique('cluster_room', ['address_id', 'floor', 'label'])
+
+        # Adding model 'Site'
+        db.create_table('cluster_site', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+        ))
+        db.send_create_signal('cluster', ['Site'])
+
+        # Adding model 'Company'
+        db.create_table('cluster_company', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('website', self.gf('django.db.models.fields.URLField')(max_length=200)),
+        ))
+        db.send_create_signal('cluster', ['Company'])
+
+        # Adding M2M table for field addresses on 'Company'
+        db.create_table('cluster_company_addresses', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('company', models.ForeignKey(orm['cluster.company'], null=False)),
+            ('address', models.ForeignKey(orm['cluster.address'], null=False))
+        ))
+        db.create_unique('cluster_company_addresses', ['company_id', 'address_id'])
+
+        # Adding model 'Connection'
+        db.create_table('cluster_connection', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('address', self.gf('django.db.models.fields.related.ForeignKey')(related_name='connections', to=orm['cluster.Address'])),
+            ('company', self.gf('django.db.models.fields.related.ForeignKey')(related_name='companies', to=orm['cluster.Company'])),
+            ('active', self.gf('django.db.models.fields.BooleanField')(default=True, blank=True)),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
+        ))
+        db.send_create_signal('cluster', ['Connection'])
+
+        # Adding unique constraint on 'Connection', fields ['company', 'name']
+        db.create_unique('cluster_connection', ['company_id', 'name'])
+
+        # Adding model 'Telephonenumber'
+        db.create_table('cluster_telephonenumber', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('country', self.gf('django.db.models.fields.related.ForeignKey')(related_name='telephone_numbers', to=orm['cluster.Country'])),
+            ('connection', self.gf('django.db.models.fields.related.ForeignKey')(related_name='telephone_numbers', to=orm['cluster.Connection'])),
+            ('areacode', self.gf('django.db.models.fields.CharField')(max_length=4)),
+            ('subscriber_number', self.gf('django.db.models.fields.IntegerField')(max_length=15)),
+            ('type', self.gf('django.db.models.fields.CharField')(max_length=1)),
+        ))
+        db.send_create_signal('cluster', ['Telephonenumber'])
+
+        # Adding model 'HardwareModel'
+        db.create_table('cluster_hardwaremodel', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('vendor', self.gf('django.db.models.fields.related.ForeignKey')(related_name='model specifications', to=orm['cluster.Company'])),
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+            ('rackspace', self.gf('django.db.models.fields.PositiveIntegerField')()),
+            ('expansions', self.gf('django.db.models.fields.PositiveIntegerField')(default=0)),
+        ))
+        db.send_create_signal('cluster', ['HardwareModel'])
+
+        # Adding model 'Role'
+        db.create_table('cluster_role', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+        ))
+        db.send_create_signal('cluster', ['Role'])
+
+        # Adding model 'InterfaceType'
+        db.create_table('cluster_interfacetype', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255)),
+            ('vendor', self.gf('django.db.models.fields.related.ForeignKey')(related_name='interfaces', blank=True, null=True, to=orm['cluster.Company'])),
+        ))
+        db.send_create_signal('cluster', ['InterfaceType'])
+
+        # Adding model 'WarrantyType'
+        db.create_table('cluster_warrantytype', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('contact', self.gf('django.db.models.fields.related.ForeignKey')(related_name='warranty types', to=orm['cluster.Connection'])),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+        ))
+        db.send_create_signal('cluster', ['WarrantyType'])
+
+        # Adding model 'WarrantyContract'
+        db.create_table('cluster_warrantycontract', (
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+            ('tags', self.gf('tagging.fields.TagField')(default='')),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('type', self.gf('django.db.models.fields.related.ForeignKey')(related_name='contracts', blank=True, null=True, to=orm['cluster.WarrantyType'])),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+            ('date_from', self.gf('django.db.models.fields.DateField')()),
+            ('date_to', self.gf('django.db.models.fields.DateField')()),
+        ))
+        db.send_create_signal('cluster', ['WarrantyContract'])
+
+
+    def backwards(self, orm):
+        
+        # Deleting model 'Cluster'
+        db.delete_table('cluster_cluster')
+
+        # Deleting model 'HardwareUnit'
+        db.delete_table('cluster_hardwareunit')
+
+        # Removing unique constraint on 'HardwareUnit', fields ['rack', 'first_slot']
+        db.delete_unique('cluster_hardwareunit', ['rack_id', 'first_slot'])
+
+        # Removing M2M table for field role on 'HardwareUnit'
+        db.delete_table('cluster_hardwareunit_role')
+
+        # Deleting model 'Alias'
+        db.delete_table('cluster_alias')
+
+        # Deleting model 'Interface'
+        db.delete_table('cluster_interface')
+
+        # Removing M2M table for field aliasses on 'Interface'
+        db.delete_table('cluster_interface_aliasses')
+
+        # Deleting model 'Network'
+        db.delete_table('cluster_network')
+
+        # Deleting model 'Rack'
+        db.delete_table('cluster_rack')
+
+        # Deleting model 'Country'
+        db.delete_table('cluster_country')
+
+        # Deleting model 'Address'
+        db.delete_table('cluster_address')
+
+        # Removing unique constraint on 'Address', fields ['address', 'city']
+        db.delete_unique('cluster_address', ['address', 'city'])
+
+        # Deleting model 'Room'
+        db.delete_table('cluster_room')
+
+        # Removing unique constraint on 'Room', fields ['address', 'floor', 'label']
+        db.delete_unique('cluster_room', ['address_id', 'floor', 'label'])
+
+        # Deleting model 'Site'
+        db.delete_table('cluster_site')
+
+        # Deleting model 'Company'
+        db.delete_table('cluster_company')
+
+        # Removing M2M table for field addresses on 'Company'
+        db.delete_table('cluster_company_addresses')
+
+        # Deleting model 'Connection'
+        db.delete_table('cluster_connection')
+
+        # Removing unique constraint on 'Connection', fields ['company', 'name']
+        db.delete_unique('cluster_connection', ['company_id', 'name'])
+
+        # Deleting model 'Telephonenumber'
+        db.delete_table('cluster_telephonenumber')
+
+        # Deleting model 'HardwareModel'
+        db.delete_table('cluster_hardwaremodel')
+
+        # Deleting model 'Role'
+        db.delete_table('cluster_role')
+
+        # Deleting model 'InterfaceType'
+        db.delete_table('cluster_interfacetype')
+
+        # Deleting model 'WarrantyType'
+        db.delete_table('cluster_warrantytype')
+
+        # Deleting model 'WarrantyContract'
+        db.delete_table('cluster_warrantycontract')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'addresses'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_interfaces'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.site': {
+            'Meta': {'object_name': 'Site'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contracts'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0002_auto__del_unique_hardwareunit_serialnumber__del_unique_hardwareunit_se.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0002_auto__del_unique_hardwareunit_serialnumber__del_unique_hardwareunit_se.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0002_auto__del_unique_hardwareunit_serialnumber__del_unique_hardwareunit_se.py	(revision 14193)
@@ -0,0 +1,262 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Removing unique constraint on 'HardwareUnit', fields ['serialnumber']
+        db.delete_unique('cluster_hardwareunit', ['serialnumber'])
+
+        # Removing unique constraint on 'HardwareUnit', fields ['service_tag']
+        db.delete_unique('cluster_hardwareunit', ['service_tag'])
+
+        # Adding unique constraint on 'HardwareUnit', fields ['serialnumber', 'service_tag']
+        db.create_unique('cluster_hardwareunit', ['serialnumber', 'service_tag'])
+
+
+    def backwards(self, orm):
+        
+        # Adding unique constraint on 'HardwareUnit', fields ['serialnumber']
+        db.create_unique('cluster_hardwareunit', ['serialnumber'])
+
+        # Adding unique constraint on 'HardwareUnit', fields ['service_tag']
+        db.create_unique('cluster_hardwareunit', ['service_tag'])
+
+        # Removing unique constraint on 'HardwareUnit', fields ['serialnumber', 'service_tag']
+        db.delete_unique('cluster_hardwareunit', ['serialnumber', 'service_tag'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'addresses'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'), ('serialnumber', 'service_tag'))", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_interfaces'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'null': 'True', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.site': {
+            'Meta': {'object_name': 'Site'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contracts'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0003_auto__chg_field_interface_ip.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0003_auto__chg_field_interface_ip.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0003_auto__chg_field_interface_ip.py	(revision 14193)
@@ -0,0 +1,250 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Interface.ip'
+        db.alter_column('cluster_interface', 'ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Interface.ip'
+        db.alter_column('cluster_interface', 'ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15, null=True, blank=True))
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'addresses'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'), ('serialnumber', 'service_tag'))", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_interfaces'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.site': {
+            'Meta': {'object_name': 'Site'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contracts'", 'blank': 'True', 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0004_auto__chg_field_hardwareunit_first_slot.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0004_auto__chg_field_hardwareunit_first_slot.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0004_auto__chg_field_hardwareunit_first_slot.py	(revision 14193)
@@ -0,0 +1,250 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'HardwareUnit.first_slot'
+        db.alter_column('cluster_hardwareunit', 'first_slot', self.gf('django.db.models.fields.PositiveIntegerField')(null=True, blank=True))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'HardwareUnit.first_slot'
+        db.alter_column('cluster_hardwareunit', 'first_slot', self.gf('django.db.models.fields.PositiveIntegerField')())
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'), ('serialnumber', 'service_tag'))", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.site': {
+            'Meta': {'object_name': 'Site'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0005_auto__del_unique_hardwareunit_serialnumber_service_tag.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0005_auto__del_unique_hardwareunit_serialnumber_service_tag.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0005_auto__del_unique_hardwareunit_serialnumber_service_tag.py	(revision 14193)
@@ -0,0 +1,250 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Removing unique constraint on 'HardwareUnit', fields ['serialnumber', 'service_tag']
+        db.delete_unique('cluster_hardwareunit', ['serialnumber', 'service_tag'])
+
+
+    def backwards(self, orm):
+        
+        # Adding unique constraint on 'HardwareUnit', fields ['serialnumber', 'service_tag']
+        db.create_unique('cluster_hardwareunit', ['serialnumber', 'service_tag'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.site': {
+            'Meta': {'object_name': 'Site'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0006_auto__chg_field_interface_ip__chg_field_interface_hwaddress.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0006_auto__chg_field_interface_ip__chg_field_interface_hwaddress.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0006_auto__chg_field_interface_ip__chg_field_interface_hwaddress.py	(revision 14193)
@@ -0,0 +1,256 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Interface.ip'
+        db.alter_column('cluster_interface', 'ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15, blank=True))
+
+        # Changing field 'Interface.hwaddress'
+        db.alter_column('cluster_interface', 'hwaddress', self.gf('django.db.models.fields.CharField')(max_length=17, unique=True, null=True, blank=True))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Interface.ip'
+        db.alter_column('cluster_interface', 'ip', self.gf('django.db.models.fields.IPAddressField')(max_length=15))
+
+        # Changing field 'Interface.hwaddress'
+        db.alter_column('cluster_interface', 'hwaddress', self.gf('django.db.models.fields.CharField')(max_length=17, unique=True, blank=True))
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.site': {
+            'Meta': {'object_name': 'Site'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0007_auto__del_site.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0007_auto__del_site.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0007_auto__del_site.py	(revision 14193)
@@ -0,0 +1,249 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Deleting model 'Site'
+        db.delete_table('cluster_site')
+
+
+    def backwards(self, orm):
+        
+        # Adding model 'Site'
+        db.create_table('cluster_site', (
+            ('name', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+            ('tags', self.gf('tagging.fields.TagField')()),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('cluster', ['Site'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'hardware': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0008_rename_fields_interface_hardware_interface_type.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0008_rename_fields_interface_hardware_interface_type.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0008_rename_fields_interface_hardware_interface_type.py	(revision 14193)
@@ -0,0 +1,245 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Interface.type'
+        #db.alter_column('cluster_interface', 'type_id', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, null=True, to=orm['cluster.InterfaceType']))
+        db.rename_column('cluster_interface', 'type_id', 'iftype_id')
+        db.rename_column('cluster_interface', 'hardware_id', 'host_id')
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Interface.type'
+        #db.alter_column('cluster_interface', 'type_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cluster.InterfaceType']))
+        db.rename_column('cluster_interface', 'iftype_id', 'type_id')
+        db.rename_column('cluster_interface', 'host_id', 'hardware_id')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0009_auto__add_field_hardwareunit_warranty_tag.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0009_auto__add_field_hardwareunit_warranty_tag.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0009_auto__add_field_hardwareunit_warranty_tag.py	(revision 14193)
@@ -0,0 +1,242 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding field 'HardwareUnit.warranty_tag'
+        db.add_column('cluster_hardwareunit', 'warranty_tag', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, null=True, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting field 'HardwareUnit.warranty_tag'
+        db.delete_column('cluster_hardwareunit', 'warranty_tag')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0010_merge_service_tag_serialnumber.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0010_merge_service_tag_serialnumber.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0010_merge_service_tag_serialnumber.py	(revision 14193)
@@ -0,0 +1,246 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+
+class Migration(DataMigration):
+
+    def forwards(self, orm):
+        "Write your forwards methods here."
+        for hw in orm.HardwareUnit.objects.all():
+            if hw.service_tag:
+                hw.warranty_tag = hw.service_tag
+            else:
+                hw.warranty_tag = hw.serialnumber
+            hw.save()
+
+
+
+    def backwards(self, orm):
+        "Write your backwards methods here."
+        raise RuntimeError("Cannot reverse this migration.")
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'serialnumber': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'service_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0011_auto__del_field_hardwareunit_serialnumber__del_field_hardwareunit_serv.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0011_auto__del_field_hardwareunit_serialnumber__del_field_hardwareunit_serv.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0011_auto__del_field_hardwareunit_serialnumber__del_field_hardwareunit_serv.py	(revision 14193)
@@ -0,0 +1,246 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Deleting field 'HardwareUnit.serialnumber'
+        db.delete_column('cluster_hardwareunit', 'serialnumber')
+
+        # Deleting field 'HardwareUnit.service_tag'
+        db.delete_column('cluster_hardwareunit', 'service_tag')
+
+
+    def backwards(self, orm):
+        
+        # Adding field 'HardwareUnit.serialnumber'
+        db.add_column('cluster_hardwareunit', 'serialnumber', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True), keep_default=False)
+
+        # Adding field 'HardwareUnit.service_tag'
+        db.add_column('cluster_hardwareunit', 'service_tag', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True), keep_default=False)
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0012_alias_field.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0012_alias_field.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0012_alias_field.py	(revision 14193)
@@ -0,0 +1,241 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding field 'Interface.aliases'
+        db.add_column('cluster_interface', 'aliases', self.gf('django.db.models.fields.CharField')(max_length=255, null=True, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting field 'Interface.aliases'
+        db.delete_column('cluster_interface', 'aliases')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0013_auto__add_field_network_gateway.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0013_auto__add_field_network_gateway.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0013_auto__add_field_network_gateway.py	(revision 14193)
@@ -0,0 +1,242 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding field 'Network.gateway'
+        db.add_column('cluster_network', 'gateway', self.gf('django.db.models.fields.IPAddressField')(default='0.0.0.0', max_length=15, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting field 'Network.gateway'
+        db.delete_column('cluster_network', 'gateway')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.alias': {
+            'Meta': {'object_name': 'Alias'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'aliasses': ('django.db.models.fields.related.ManyToManyField', [], {'blank': 'True', 'related_name': "'_interfaces'", 'null': 'True', 'symmetrical': 'False', 'to': "orm['cluster.Alias']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0014_auto__del_alias.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0014_auto__del_alias.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0014_auto__del_alias.py	(revision 14193)
@@ -0,0 +1,251 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Deleting model 'Alias'
+        db.delete_table('cluster_alias')
+
+        # Removing M2M table for field aliasses on 'Interface'
+        db.delete_table('cluster_interface_aliasses')
+
+
+    def backwards(self, orm):
+        
+        # Adding model 'Alias'
+        db.create_table('cluster_alias', (
+            ('tags', self.gf('tagging.fields.TagField')()),
+            ('label', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True)),
+            ('note', self.gf('django.db.models.fields.TextField')(blank=True)),
+            ('created_on', self.gf('django_extensions.db.fields.CreationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('updated_on', self.gf('django_extensions.db.fields.ModificationDateTimeField')(default=datetime.datetime.now, blank=True)),
+            ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+        ))
+        db.send_create_signal('cluster', ['Alias'])
+
+        # Adding M2M table for field aliasses on 'Interface'
+        db.create_table('cluster_interface_aliasses', (
+            ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+            ('interface', models.ForeignKey(orm['cluster.interface'], null=False)),
+            ('alias', models.ForeignKey(orm['cluster.alias'], null=False))
+        ))
+        db.create_unique('cluster_interface_aliasses', ['interface_id', 'alias_id'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0015_auto__chg_field_interface_hwaddress.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0015_auto__chg_field_interface_hwaddress.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0015_auto__chg_field_interface_hwaddress.py	(revision 14193)
@@ -0,0 +1,232 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Interface.hwaddress'
+        db.alter_column('cluster_interface', 'hwaddress', self.gf('django.db.models.fields.CharField')(unique=True, max_length=17, blank=True))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Interface.hwaddress'
+        db.alter_column('cluster_interface', 'hwaddress', self.gf('django.db.models.fields.CharField')(unique=True, max_length=17, null=True, blank=True))
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'connections'", 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0016_auto__chg_field_connection_address.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0016_auto__chg_field_connection_address.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0016_auto__chg_field_connection_address.py	(revision 14193)
@@ -0,0 +1,232 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Connection.address'
+        db.alter_column('cluster_connection', 'address_id', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, null=True, to=orm['cluster.Address']))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Connection.address'
+        db.alter_column('cluster_connection', 'address_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cluster.Address']))
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0017_standardize_mac_addresses.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0017_standardize_mac_addresses.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0017_standardize_mac_addresses.py	(revision 14193)
@@ -0,0 +1,235 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import DataMigration
+from django.db import models
+
+import re
+
+class Migration(DataMigration):
+
+    def forwards(self, orm):
+        "Write your forwards methods here."
+        # All existing mac-addresses have to be converted to lowercase notation delimited by a colon.
+        for iface in orm.Interface.objects.all():
+            iface.hwaddress = ':'.join(re.findall(r'[A-Za-z\d]{2}', iface.hwaddress.lower()))
+            iface.save()
+
+
+    def backwards(self, orm):
+        "Write your backwards methods here."
+        # Not necessary to go backwards
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0018_auto__add_unique_rack_room_label.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0018_auto__add_unique_rack_room_label.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0018_auto__add_unique_rack_room_label.py	(revision 14193)
@@ -0,0 +1,232 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding unique constraint on 'Rack', fields ['room', 'label']
+        db.create_unique('cluster_rack', ['room_id', 'label'])
+
+
+    def backwards(self, orm):
+        
+        # Removing unique constraint on 'Rack', fields ['room', 'label']
+        db.delete_unique('cluster_rack', ['room_id', 'label'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0019_auto__add_unique_interface_ip_network.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0019_auto__add_unique_interface_ip_network.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0019_auto__add_unique_interface_ip_network.py	(revision 14193)
@@ -0,0 +1,232 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding unique constraint on 'Interface', fields ['ip', 'network']
+        db.create_unique('cluster_interface', ['ip', 'network_id'])
+
+
+    def backwards(self, orm):
+        
+        # Removing unique constraint on 'Interface', fields ['ip', 'network']
+        db.delete_unique('cluster_interface', ['ip', 'network_id'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'ip'),)", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0020_rename_fields_telephonenumber_type_warrantycontract_type.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0020_rename_fields_telephonenumber_type_warrantycontract_type.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0020_rename_fields_telephonenumber_type_warrantycontract_type.py	(revision 14193)
@@ -0,0 +1,236 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Telephonenumber.connection'
+        #db.alter_column('cluster_telephonenumber', 'connection_id', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, to=orm['cluster.Connection']))
+        db.rename_column('cluster_telephonenumber', 'type', 'number_type')
+        db.rename_column('cluster_warrantycontract', 'type_id', 'warranty_type_id')
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Telephonenumber.connection'
+        #db.alter_column('cluster_telephonenumber', 'connection_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['cluster.Connection']))
+        db.rename_column('cluster_telephonenumber', 'number_type', 'type')
+        db.rename_column('cluster_warrantycontract', 'warranty_type_id', 'type_id')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'ip'),)", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '17', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'number_type': ('django.db.models.fields.CharField', [], {'default': "'T'", 'max_length': '1'}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'warranty_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0021_auto__chg_field_interface_hwaddress.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0021_auto__chg_field_interface_hwaddress.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0021_auto__chg_field_interface_hwaddress.py	(revision 14193)
@@ -0,0 +1,232 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'Interface.hwaddress'
+        db.alter_column('cluster_interface', 'hwaddress', self.gf('django.db.models.fields.CharField')(max_length=17, unique=True, null=True, blank=True))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'Interface.hwaddress'
+        db.alter_column('cluster_interface', 'hwaddress', self.gf('django.db.models.fields.CharField')(max_length=17, unique=True, blank=True))
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'ip'),)", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'number_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0022_auto__add_field_hardwareunit_seller__add_field_hardwareunit_owner__add.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0022_auto__add_field_hardwareunit_seller__add_field_hardwareunit_owner__add.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0022_auto__add_field_hardwareunit_seller__add_field_hardwareunit_owner__add.py	(revision 14193)
@@ -0,0 +1,275 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Adding field 'HardwareUnit.seller'
+        db.add_column('cluster_hardwareunit', 'seller', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='sold', null=True, to=orm['cluster.Connection']), keep_default=False)
+
+        # Adding field 'HardwareUnit.owner'
+        db.add_column('cluster_hardwareunit', 'owner', self.gf('django.db.models.fields.related.ForeignKey')(blank=True, related_name='owns', null=True, to=orm['cluster.Connection']), keep_default=False)
+
+        # Adding field 'HardwareUnit.state'
+        db.add_column('cluster_hardwareunit', 'state', self.gf('django.db.models.fields.CharField')(default='unknown', max_length=3, null=True, blank=True), keep_default=False)
+
+        # Adding field 'HardwareUnit.serial_number'
+        db.add_column('cluster_hardwareunit', 'serial_number', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, null=True, blank=True), keep_default=False)
+
+        # Adding field 'HardwareModel.vendorcode'
+        db.add_column('cluster_hardwaremodel', 'vendorcode', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, null=True, blank=True), keep_default=False)
+
+        # Adding field 'WarrantyContract.contract_number'
+        db.add_column('cluster_warrantycontract', 'contract_number', self.gf('django.db.models.fields.CharField')(max_length=255, unique=True, null=True, blank=True), keep_default=False)
+
+        # Adding field 'WarrantyContract.annual_cost'
+        db.add_column('cluster_warrantycontract', 'annual_cost', self.gf('django.db.models.fields.DecimalField')(null=True, max_digits=8, decimal_places=2, blank=True), keep_default=False)
+
+
+    def backwards(self, orm):
+        
+        # Deleting field 'HardwareUnit.seller'
+        db.delete_column('cluster_hardwareunit', 'seller_id')
+
+        # Deleting field 'HardwareUnit.owner'
+        db.delete_column('cluster_hardwareunit', 'owner_id')
+
+        # Deleting field 'HardwareUnit.state'
+        db.delete_column('cluster_hardwareunit', 'state')
+
+        # Deleting field 'HardwareUnit.serial_number'
+        db.delete_column('cluster_hardwareunit', 'serial_number')
+
+        # Deleting field 'HardwareModel.vendorcode'
+        db.delete_column('cluster_hardwaremodel', 'vendorcode')
+
+        # Deleting field 'WarrantyContract.contract_number'
+        db.delete_column('cluster_warrantycontract', 'contract_number')
+
+        # Deleting field 'WarrantyContract.annual_cost'
+        db.delete_column('cluster_warrantycontract', 'annual_cost')
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"}),
+            'vendorcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owns'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'seller': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sold'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'serial_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'unknown'", 'max_length': '3', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'ip'),)", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'number_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'annual_cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2', 'blank': 'True'}),
+            'contract_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0023_auto__del_unique_interface_hwaddress__add_unique_interface_hwaddress_n.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0023_auto__del_unique_interface_hwaddress__add_unique_interface_hwaddress_n.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0023_auto__del_unique_interface_hwaddress__add_unique_interface_hwaddress_n.py	(revision 14193)
@@ -0,0 +1,245 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Removing unique constraint on 'Interface', fields ['hwaddress']
+        db.delete_unique('cluster_interface', ['hwaddress'])
+
+        # Adding unique constraint on 'Interface', fields ['hwaddress', 'network']
+        db.create_unique('cluster_interface', ['hwaddress', 'network_id'])
+
+
+    def backwards(self, orm):
+        
+        # Adding unique constraint on 'Interface', fields ['hwaddress']
+        db.create_unique('cluster_interface', ['hwaddress'])
+
+        # Removing unique constraint on 'Interface', fields ['hwaddress', 'network']
+        db.delete_unique('cluster_interface', ['hwaddress', 'network_id'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"}),
+            'vendorcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owns'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'seller': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sold'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'serial_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'unknown'", 'max_length': '3', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'ip'), ('network', 'hwaddress'))", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'number_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'annual_cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2', 'blank': 'True'}),
+            'contract_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0024_auto__del_unique_interface_ip_network.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0024_auto__del_unique_interface_ip_network.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0024_auto__del_unique_interface_ip_network.py	(revision 14193)
@@ -0,0 +1,239 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Removing unique constraint on 'Interface', fields ['ip', 'network']
+        db.delete_unique('cluster_interface', ['ip', 'network_id'])
+
+
+    def backwards(self, orm):
+        
+        # Adding unique constraint on 'Interface', fields ['ip', 'network']
+        db.create_unique('cluster_interface', ['ip', 'network_id'])
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"}),
+            'vendorcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owns'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'seller': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sold'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'serial_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'unknown'", 'max_length': '3', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'hwaddress'),)", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'number_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'annual_cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2', 'blank': 'True'}),
+            'contract_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {'default': "''"}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0025_auto__chg_field_hardwareunit_state.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0025_auto__chg_field_hardwareunit_state.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/migrations/0025_auto__chg_field_hardwareunit_state.py	(revision 14193)
@@ -0,0 +1,239 @@
+# encoding: utf-8
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+class Migration(SchemaMigration):
+
+    def forwards(self, orm):
+        
+        # Changing field 'HardwareUnit.state'
+        db.alter_column('cluster_hardwareunit', 'state', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True))
+
+
+    def backwards(self, orm):
+        
+        # Changing field 'HardwareUnit.state'
+        db.alter_column('cluster_hardwareunit', 'state', self.gf('django.db.models.fields.CharField')(max_length=3, null=True, blank=True))
+
+
+    models = {
+        'cluster.address': {
+            'Meta': {'unique_together': "(('address', 'city'),)", 'object_name': 'Address'},
+            'address': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'city': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'addresses'", 'null': 'True', 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'postalcode': ('django.db.models.fields.CharField', [], {'max_length': '9', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.cluster': {
+            'Meta': {'object_name': 'Cluster'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.company': {
+            'Meta': {'object_name': 'Company'},
+            'addresses': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'_companies'", 'symmetrical': 'False', 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'website': ('django.db.models.fields.URLField', [], {'max_length': '200'})
+        },
+        'cluster.connection': {
+            'Meta': {'unique_together': "(('company', 'name'),)", 'object_name': 'Connection'},
+            'active': ('django.db.models.fields.BooleanField', [], {'default': 'True', 'blank': 'True'}),
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'connections'", 'null': 'True', 'to': "orm['cluster.Address']"}),
+            'company': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'companies'", 'to': "orm['cluster.Company']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.country': {
+            'Meta': {'object_name': 'Country'},
+            'country_code': ('django.db.models.fields.PositiveIntegerField', [], {'unique': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.hardwaremodel': {
+            'Meta': {'object_name': 'HardwareModel'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'expansions': ('django.db.models.fields.PositiveIntegerField', [], {'default': '0'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'rackspace': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'model specifications'", 'to': "orm['cluster.Company']"}),
+            'vendorcode': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.hardwareunit': {
+            'Meta': {'unique_together': "(('rack', 'first_slot'),)", 'object_name': 'HardwareUnit'},
+            'cluster': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'hardware'", 'to': "orm['cluster.Cluster']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'first_slot': ('django.db.models.fields.PositiveIntegerField', [], {'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'through': "orm['cluster.Interface']", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'owner': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'owns'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'rack': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'contents'", 'to': "orm['cluster.Rack']"}),
+            'role': ('django.db.models.fields.related.ManyToManyField', [], {'related_name': "'hardware'", 'symmetrical': 'False', 'to': "orm['cluster.Role']"}),
+            'seller': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'sold'", 'null': 'True', 'to': "orm['cluster.Connection']"}),
+            'serial_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'specifications': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.HardwareModel']"}),
+            'state': ('django.db.models.fields.CharField', [], {'default': "'unknown'", 'max_length': '10', 'null': 'True', 'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'hardware'", 'null': 'True', 'to': "orm['cluster.WarrantyContract']"}),
+            'warranty_tag': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.interface': {
+            'Meta': {'unique_together': "(('network', 'hwaddress'),)", 'object_name': 'Interface'},
+            'aliases': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'host': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.HardwareUnit']"}),
+            'hwaddress': ('django.db.models.fields.CharField', [], {'max_length': '17', 'null': 'True', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'iftype': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.InterfaceType']"}),
+            'ip': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'network': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'interfaces'", 'to': "orm['cluster.Network']"}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.interfacetype': {
+            'Meta': {'object_name': 'InterfaceType'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vendor': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'interfaces'", 'null': 'True', 'to': "orm['cluster.Company']"})
+        },
+        'cluster.network': {
+            'Meta': {'object_name': 'Network'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'domain': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'gateway': ('django.db.models.fields.IPAddressField', [], {'max_length': '15', 'blank': 'True'}),
+            'hostnames': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'netaddress': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'netmask': ('django.db.models.fields.IPAddressField', [], {'max_length': '15'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'vlan': ('django.db.models.fields.PositiveIntegerField', [], {'max_length': '3', 'null': 'True', 'blank': 'True'})
+        },
+        'cluster.rack': {
+            'Meta': {'unique_together': "(('room', 'label'),)", 'object_name': 'Rack'},
+            'capacity': ('django.db.models.fields.PositiveIntegerField', [], {}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.SlugField', [], {'max_length': '255', 'db_index': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'room': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'racks'", 'to': "orm['cluster.Room']"}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.role': {
+            'Meta': {'object_name': 'Role'},
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.room': {
+            'Meta': {'unique_together': "(('address', 'floor', 'label'),)", 'object_name': 'Room'},
+            'address': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'rooms'", 'to': "orm['cluster.Address']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'floor': ('django.db.models.fields.IntegerField', [], {'max_length': '2'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.telephonenumber': {
+            'Meta': {'object_name': 'Telephonenumber'},
+            'areacode': ('django.db.models.fields.CharField', [], {'max_length': '4'}),
+            'connection': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Connection']"}),
+            'country': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'telephone_numbers'", 'to': "orm['cluster.Country']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'number_type': ('django.db.models.fields.CharField', [], {'max_length': '1'}),
+            'subscriber_number': ('django.db.models.fields.IntegerField', [], {'max_length': '15'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        },
+        'cluster.warrantycontract': {
+            'Meta': {'object_name': 'WarrantyContract'},
+            'annual_cost': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2', 'blank': 'True'}),
+            'contract_number': ('django.db.models.fields.CharField', [], {'max_length': '255', 'unique': 'True', 'null': 'True', 'blank': 'True'}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'date_from': ('django.db.models.fields.DateField', [], {}),
+            'date_to': ('django.db.models.fields.DateField', [], {}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'warranty_type': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'contracts'", 'null': 'True', 'to': "orm['cluster.WarrantyType']"})
+        },
+        'cluster.warrantytype': {
+            'Meta': {'object_name': 'WarrantyType'},
+            'contact': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'warranty types'", 'to': "orm['cluster.Connection']"}),
+            'created_on': ('django_extensions.db.fields.CreationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'}),
+            'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+            'label': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255'}),
+            'note': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+            'tags': ('tagging.fields.TagField', [], {}),
+            'updated_on': ('django_extensions.db.fields.ModificationDateTimeField', [], {'default': 'datetime.datetime.now', 'blank': 'True'})
+        }
+    }
+
+    complete_apps = ['cluster']
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/models.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/models.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/models.py	(revision 14193)
@@ -0,0 +1,681 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.db import models
+from django.core.validators import RegexValidator
+
+import re
+from datetime import date
+
+from psycopg2 import IntegrityError
+
+from IPy import IP
+
+from sara_cmt.logger import Logger
+logger = Logger().getLogger()
+
+from sara_cmt.django_cli import ModelExtension
+
+from tagging.fields import TagField
+from django_extensions.db.fields import CreationDateTimeField, \
+                                        ModificationDateTimeField
+
+
+
+######
+#
+# Classes of sara_cmt.core
+#
+
+
+class Cluster(ModelExtension):
+    """
+        A labeled group of hardware pieces.
+    """
+    name = models.CharField(max_length=255, unique=True)
+
+    class Meta:
+        ordering = ('name',)
+
+    def __unicode__(self):
+        return self.name or None
+
+
+class HardwareUnit(ModelExtension):
+    """
+        A specific piece of hardware.
+    """
+    STATE_CHOICES = (
+        ('new', 'new'),
+        ('clean', 'clean'),
+        ('configured', 'configured'),
+        ('unknown', 'unknown'),
+        ('off', 'off'))
+        
+    cluster      = models.ForeignKey('Cluster', related_name='hardware')
+    role         = models.ManyToManyField('Role', related_name='hardware')
+    network      = models.ManyToManyField('Network', related_name='hardware',
+                                          through='Interface')
+    specifications = models.ForeignKey('HardwareModel',
+                                       related_name='hardware', null=True,
+                                       blank=True)
+    warranty     = models.ForeignKey('WarrantyContract',
+                                     related_name='hardware', null=True,
+                                     blank=True)
+    rack         = models.ForeignKey('Rack', related_name='contents')
+    seller = models.ForeignKey('Connection', related_name='sold', null=True, blank=True)
+    owner = models.ForeignKey('Connection', related_name='owns', null=True, blank=True)
+    state = models.CharField(max_length=10, null=True, blank=True, choices=STATE_CHOICES, default='unknown')
+    warranty_tag = models.CharField(max_length=255, blank=True, null=True,
+                                    help_text='Service tag',
+                                    unique=True)
+    serial_number = models.CharField(max_length=255, blank=True, null=True, unique=True)
+    first_slot   = models.PositiveIntegerField(blank=True, null=True)
+    label        = models.CharField(max_length=255)
+
+    class Meta:
+        #verbose_name = "piece of hardware"
+        verbose_name_plural = "hardware"
+        #ordering = ('cluster__name', 'rack__label', 'first_slot')
+        ordering = ('rack__label', 'first_slot')
+        unique_together = ('rack', 'first_slot')
+
+    @property
+    def address(self):
+        return self.rack.address
+
+    @property
+    def room(self):
+        return self.rack.room
+
+    @property
+    def roles(self):
+        return [str(role.label) for role in self.role.all()]
+
+    @property
+    def in_support(self):
+        retval = False
+        try:
+            assert bool(self.warranty), 'No warranty contract for %s %s' % \
+                (self.__class__.__name__, self.label)
+            retval = not self.warranty.expired
+        except:
+            retval = False
+            logger.warning("Hardware with label '%s' hasn't got a warranty \
+                contract" % self.label)
+        return retval
+
+    def __unicode__(self):
+        try:
+            assert self.label, "piece of hardware hasn't got a label yet"
+            return self.label
+        except AssertionError, e:
+            return e
+
+    def save(self, force_insert=False, force_update=False):
+        """
+            First check if the label has already been filled in. If it's still
+            empty, then set it to the default basename (based on rack# and
+            node#).
+        """
+        if not self.label:
+            self.label = self.default_label()
+
+        # Solution for empty unique fields described on:
+        # http://stackoverflow.com/questions/454436/unique-fields-that-allow-nulls-in-django
+        if not self.warranty_tag:
+            self.warranty_tag = None
+        if not self.serial_number:
+            self.serial_number = None
+        if not self.first_slot:
+            self.first_slot = None
+
+        super(HardwareUnit, self).save(force_insert, force_update)
+
+    def default_label(self):
+        # TODO: make dynamic for different types of clusters
+        try:
+            assert self.rack.label is not None and self.first_slot is not \
+                None, 'not able to generate a label'
+            return 'r%sn%s' % (self.rack.label, self.first_slot)
+        except:
+            pass
+
+
+class Interface(ModelExtension):
+    """
+        An interface of a piece of hardware.
+    """
+    re_valid_mac = re.compile(r'([A-Fa-f\d]{2}[:-]?){5}[A-Fa-f\d]{2}')
+    re_mac_octets = re.compile(r'[A-Fa-f\d]{2}')
+    hwaddress_validator = RegexValidator(re_valid_mac,'Enter a valid hardware address.', 'invalid')
+
+    network   = models.ForeignKey('Network', related_name='interfaces')
+    host      = models.ForeignKey('HardwareUnit', related_name='interfaces',
+                                  verbose_name='machine')
+    iftype    = models.ForeignKey('InterfaceType', related_name='interfaces',
+                                  verbose_name='type')
+    label     = models.CharField(max_length=255, help_text='Automagically \
+                                 generated if kept empty')
+    aliases   = models.CharField(max_length=255, help_text='Cnames comma-seperated', blank=True, null=True)
+
+    hwaddress = models.CharField(max_length=17, blank=True, null=True,
+                                 verbose_name='hardware address',
+                                 help_text="6 Octets, optionally delimited by \
+                                 a space ' ', a hyphen '-', or a colon ':'.",
+                                 validators=[hwaddress_validator])
+    ip        = models.IPAddressField(blank=True)
+
+    class Meta:
+        unique_together = ('network', 'hwaddress')
+        ordering = ('host__cluster__name', 'host__rack__label', 'host__first_slot')
+
+    @property
+    def fqdn(self):
+        return '%s.%s' % (self.label, self.network.domain)
+
+    @property
+    def cnames(self):
+        if self.aliases:
+            return self.aliases.split(',')
+
+    def __unicode__(self):
+        #return self.fqdn
+        return self.label or 'anonymous'
+
+
+    def save(self, force_insert=False, force_update=False):
+        """
+            First check for a correct IP address before saving the object.
+            Pick a new one in the related network when the IP hasn't been set
+            yet, or when the network has been changed.
+        """
+        try:
+            if not self.hwaddress:
+                self.hwaddress = None
+
+            if self.hwaddress and len(self.hwaddress) >= 12:
+                self.hwaddress = ':'.join(self.re_mac_octets.findall(self.hwaddress.lower()))
+            # To be sure that the interface has a valid network
+            #assert isinstance(self.network, Network), "network doesn't exist"
+
+            try:
+                if self.network:
+                    network = IP('%s/%s' % (self.network.netaddress,
+                                            self.network.netmask))
+            except ValueError, e:
+                print ValueError, e
+            except Exception, e:
+                print 'An error occured:', e
+
+            # Pick a new IP when it's not defined yet or when the network has
+            # been changed
+            ip = IP(self.ip or 0)
+            if ip not in network:
+                self.ip = self.network.pick_ip()
+
+            self.label = self.label or \
+                         self.network.construct_interface_label(self.host)
+
+            try:
+                super(Interface, self).save(force_insert, force_update)
+            except IntegrityError, e:
+                logger.error(e)
+        except AssertionError, e: # !!! TODO: exception on other errors !!!
+            print AssertionError, e
+
+
+class Network(ModelExtension):
+    """
+        Class with information about a network. Networks are connected with
+        Interfaces (and HardwareUnits as equipment through Interface).
+    """
+    name       = models.CharField(max_length=255, help_text='example: \
+                                  infiniband')
+    netaddress = models.IPAddressField(help_text='example: 192.168.1.0')
+    netmask    = models.IPAddressField(help_text='example: 255.255.255.0')
+    gateway    = models.IPAddressField(blank=True, help_text='Automagically generated if kept empty')
+    domain     = models.CharField(max_length=255, help_text='example: \
+                                  irc.sara.nl')
+    vlan       = models.PositiveIntegerField(max_length=3, null=True,
+                                             blank=True)
+    hostnames  = models.CharField(max_length=255, help_text='''stringformat \
+                                  of hostnames in the network, example: \
+                                  'ib-{machine}''')
+
+    class Meta:
+        ordering = ('name', 'domain')
+        verbose_name = 'network'
+        verbose_name_plural = 'networks'
+
+    def __unicode__(self):
+        return self.name
+
+    #
+    def _rev_name(self):
+        network = IP("%s/%s" % (self.netaddress, self.netmask))
+        reverse_name = network.reverseName()
+        return reverse_name
+
+    #
+    def _rev_names(self):
+        network = IP("%s/%s" % (self.netaddress, self.netmask))
+        reverse_names = network.reverseNames()
+        return reverse_names
+
+    def _max_hosts(self):
+        """
+            Give the total amount of IP-addresses which could be assigned to hosts in
+            this network.
+
+            Returns an integer.
+        """
+        network = IP("%s/%s" % (self.netaddress, self.netmask))
+        return int(network.len()-2)
+
+    def _ips_assigned(self):
+        """
+            Make a set with already assigned IP-addresses in the network.
+
+            Returns a set.
+        """
+        return set([interface.ip for interface in
+            Interface.objects.filter(network=self).filter(ip__isnull=False)])
+
+    def count_ips_assigned(self):
+        """
+            Count the amount of assigned IP-addresses in the network.
+
+            Returns an integer.
+        """
+        return len(self._ips_assigned())
+
+    def count_ips_free(self):
+        """
+            Calculate the size of the pool of unassigned IP-addresses in the network.
+
+            Returns an integer.
+        """
+        return self._max_hosts() - self.count_ips_assigned()
+
+    def pick_ip(self):
+        """
+            Pick an IP-address in the network which hasn't been assigned yet.
+
+            Returns a string.
+        """
+        assigned = self._ips_assigned()
+        network = IP("%s/%s" % (self.netaddress, self.netmask))
+        netaddress = network.net().ip
+        broadcast = network.broadcast().ip
+        poll_ip = netaddress + 1 # netaddress is in use already
+
+        found = False
+        while not found and poll_ip < broadcast:
+            poll_ip_str = IP(poll_ip).strNormal()
+            if poll_ip_str in assigned or poll_ip_str == self.gateway:
+                poll_ip += 1
+                continue
+            found = True
+
+        if found:
+            #ip = IP(poll_ip).strNormal()
+            ip = poll_ip_str
+        else:
+            logger.warning("No more IP's available in network '%s'"%self)
+            ip = None
+
+        return ip
+
+    def default_gateway(self):
+        """
+            Return the first available ip address as the default gateway.
+        """
+        network = IP("%s/%s" % (self.netaddress, self.netmask))
+        return IP(network.ip+1).strNormal()
+
+    def construct_interface_label(self, machine):
+        """
+            Construct a label for an interface that's asking for it. The default
+            label of an interface is based on info of its machine and network.
+        """
+        interface_label = self.hostnames.format(machine=machine)
+        return interface_label
+
+    @property
+    def cidr(self):
+        network = IP("%s/%s" % (self.netaddress, self.netmask))
+        return network.strNormal()
+
+    def save(self, force_insert=False, force_update=False):
+        if not self.gateway:
+            self.gateway = self.default_gateway() 
+        try:
+            super(Network, self).save(force_insert, force_update)
+        except IntegrityError, e:
+            logger.error(e)
+
+
+
+class Rack(ModelExtension):
+    """
+        A Rack is a standardized system for mounting various HardwareUnits in a
+        stack of slots.
+    """
+
+    room = models.ForeignKey('Room', related_name='racks')
+
+    label    = models.SlugField(max_length=255)
+    capacity = models.PositiveIntegerField(verbose_name='number of slots')
+
+    class Meta:
+        unique_together = ('room', 'label')
+        ordering = ('label',)
+        verbose_name = 'rack'
+        verbose_name_plural = 'racks'
+
+    @property
+    def address(self):
+        return self.room.address
+
+    def __unicode__(self):
+        return 'rack %s' % (self.label)
+
+#
+#
+#
+######
+
+
+
+######
+#
+# Classes for sara_cmt.locations
+#
+
+
+class Country(ModelExtension):
+    """
+        Model for country - country-code pairs. Country-codes can be found on:
+            http://www.itu.int/dms_pub/itu-t/opb/sp/T-SP-E.164D-2009-PDF-E.pdf
+    """
+    name         = models.CharField(max_length=255, unique=True)
+    country_code = models.PositiveIntegerField(unique=True, help_text='''Example: In case of The Netherlands it's 31''')
+
+    class Meta:
+        verbose_name_plural = 'countries'
+        ordering = ('name',)
+
+    def __unicode__(self):
+        return self.name
+
+
+class Address(ModelExtension):
+    """
+        A class to hold information about the physical location of a model.
+    """
+    country    = models.ForeignKey(Country, null=True, blank=True, related_name='addresses')
+    address    = models.CharField(max_length=255)
+    postalcode = models.CharField(max_length=9, blank=True)
+    city       = models.CharField(max_length=255)
+
+    @property
+    def companies(self):
+        return ' | '.join([comp.name for comp in self._companies.all()]) or '-'
+
+    class Meta:
+        unique_together = ('address', 'city')
+        verbose_name_plural = 'addresses'
+        ordering = ('postalcode',)
+
+    def __unicode__(self):
+        return '%s - %s' % (self.city, self.address)
+
+
+class Room(ModelExtension):
+    """
+        A room is located at an address. This is where racks of hardware can be
+        found.
+    """
+    address = models.ForeignKey(Address, related_name='rooms')
+
+    floor   = models.IntegerField(max_length=2)
+    label   = models.CharField(max_length=255, blank=False)
+
+    class Meta:
+        unique_together = ('address', 'floor', 'label')
+        ordering = ('address__postalcode', 'floor')
+
+    def __unicode__(self):
+        #return unicode('%s - %s'%(self.address,self.label))
+        return '%s (%s, %s)' % (self.label, self.address.address, self.address.city)
+
+#
+#
+#
+######
+
+
+######
+#
+# Classes for sara_cmt.contacts
+#
+
+
+class Company(ModelExtension):
+    """
+        The Company-model can be linked to hardware. This way you are able to define
+        contactpersons for a specific piece of hardware.
+    """
+
+    addresses = models.ManyToManyField(Address, related_name='_companies')
+
+    #type    = models.ChoiceField() # !!! TODO: add choices like vendor / support / partner / customer / etc... !!!
+    name    = models.CharField(max_length=255)
+    website = models.URLField()
+
+    def get_addresses(self):
+        return ' | '.join([address.address for address in self.addresses.all()]) or '-'
+
+    def __unicode__(self):
+        return self.name
+
+    class Meta:
+        verbose_name_plural = 'companies'
+        ordering = ('name',) 
+
+
+class Connection(ModelExtension):
+    """
+        Contacts can be linked to different sites, hardware, or its vendors.
+        This makes it possible to lookup contactpersons in case of problems on a
+        site or with specific hardware.
+    """
+    address = models.ForeignKey(Address, blank=True, null=True, related_name='connections')
+    company = models.ForeignKey(Company, related_name='companies')
+
+    active = models.BooleanField(editable=True, default=True)
+    name   = models.CharField(verbose_name='full name', max_length=255)
+    email  = models.EmailField(blank=True, null=True)
+
+    def __unicode__(self):
+        return self.name
+
+    def _address(self):
+        return address.address
+
+    class Meta:
+        verbose_name = 'contact'
+        unique_together = ('company', 'name')
+        ordering = ('company', 'address')
+
+
+class Telephonenumber(ModelExtension):
+    """
+        Telephonenumber to link to a contact. Split in country-, area- and
+        subscriber-part for easy filtering.
+    """
+    NUMBER_CHOICES = (
+        ('T', 'Telephone'),
+        ('C', 'Cellphone'),
+        ('F', 'Fax'))
+    country      = models.ForeignKey(Country, related_name='telephone_numbers')
+    connection = models.ForeignKey(Connection, blank=False, null=False, related_name='telephone_numbers')
+    areacode          = models.CharField(max_length=4) # because it can start with a zero
+    subscriber_number = models.IntegerField(verbose_name='number', max_length=15)
+    number_type = models.CharField(max_length=1, choices=NUMBER_CHOICES)
+
+    # !!! TODO: link to company / contact / etc... !!!
+
+    def __unicode__(self):
+        return '+%i(%s)%s-%i' % (self.country.country_code, self.areacode[:1], self.areacode[1:], self.subscriber_number)
+
+    class Meta:
+        ordering = ('connection',)
+
+
+#
+#
+#
+#####
+
+
+######
+#
+# Classes for sara_cmt.specifications
+#
+
+
+class HardwareModel(ModelExtension):
+    """
+        This model is being used to specify some extra information about a
+        specific type (model) of hardware.
+    """
+    vendor = models.ForeignKey(Company, related_name='model specifications')
+
+    name       = models.CharField(max_length=255, unique=True)
+    vendorcode = models.CharField(max_length=255, blank=True, null=True, unique=True, help_text='example: CISCO7606-S')
+    rackspace  = models.PositiveIntegerField(help_text='size in U for example')
+    expansions = models.PositiveIntegerField(default=0, help_text='number of expansion slots')
+
+    class Meta:
+        verbose_name = 'model'
+        ordering = ('vendor', 'name')
+
+    def __unicode__(self):
+        return '%s (%s)' % (self.name, self.vendor)
+
+
+class Role(ModelExtension):
+    """
+        This describes a possible role of a HardwareUnit in the cluster. A piece of
+        hardware can have a role like 'switch', 'compute node', 'patchpanel', 'pdu',
+        'admin node', 'login node', etc...
+        Those roles can be used for all kinds of rules on HardwareUnits which exist
+        in the cluster.
+    """
+    label = models.CharField(max_length=255, unique=True)
+
+    class Meta:
+        ordering = ('label',)
+        verbose_name = 'role'
+        verbose_name_plural = 'roles'
+
+    def __unicode__(self):
+        return str(self.label)
+
+
+class InterfaceType(ModelExtension):
+    """
+        Contains information about different types of interfaces.
+    """
+    vendor = models.ForeignKey('Company', null=True, blank=True, related_name='interfaces')
+
+    label = models.CharField(max_length=255, help_text="'DRAC 4' for example")
+
+    class Meta:
+        # Note in docs of Model Meta options,
+        # see http://docs.djangoproject.com/en/dev/ref/models/options/#ordering
+        # "Regardless of how many fields are in ordering, the admin site uses
+        # only the first field."
+        #ordering = ('vendor', 'label')
+        ordering = ('label',)
+        verbose_name = 'type of interface'
+        verbose_name_plural = 'types of interfaces'
+
+    def __unicode__(self):
+        return self.label
+
+#
+#
+#
+######
+
+
+######
+#
+# Classes for sara_cmt.support
+#
+
+
+class WarrantyType(ModelExtension):
+    """
+        A type of warranty offered by a company.
+    """
+    contact = models.ForeignKey(Connection, related_name='warranty types')
+
+    label = models.CharField(max_length=255, unique=True)
+
+    class Meta:
+        ordering = ('contact__company__name', 'label')
+    def __unicode__(self):
+        return self.label
+
+
+class WarrantyContract(ModelExtension):
+    """
+        A class which contains warranty information of (a collection of) hardware. (SLA)
+    """
+    warranty_type = models.ForeignKey(WarrantyType, blank=True, null=True, related_name='contracts')
+
+    contract_number = models.CharField(max_length=255, blank=True, null=True, unique=True, help_text='NSEN420201')
+    annual_cost = models.DecimalField(max_digits=8, decimal_places=2, blank=True, null=True, help_text='433.61')
+    label     = models.CharField(max_length=255, unique=True)
+    date_from = models.DateField(verbose_name='valid from')
+    date_to   = models.DateField(verbose_name='expires at')
+    date_to.in_support_filter = True
+
+    class Meta:
+        ordering = ('label',)
+
+    @property
+    def expired(self):
+        return self.date_to < date.today()
+
+    def __unicode__(self):
+        return self.label
+
+    def save(self, force_insert=False, force_update=False):
+        """
+            The contract number is an optional field, but when filled in it
+            should have a unique value. When kept blank, it should be stored as
+            None.
+        """
+        if not self.contract_number:
+            self.contract_number = None
+
+        super(WarrantyContract, self).save(force_insert, force_update)
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/base.html
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/base.html	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/base.html	(revision 14193)
@@ -0,0 +1,84 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" lang="{{ LANGUAGE_CODE|default:"en-us" }}" xml:lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}>
+<head>
+<title>{% block title %}{% endblock %}</title>
+<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" />
+{% block extrastyle %}{% endblock %}
+<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="{% block stylesheet_ie %}{% load adminmedia %}{% admin_media_prefix %}css/ie.css{% endblock %}" /><![endif]-->
+{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" />{% endif %}
+<script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";</script>
+{% block extrahead %}{% endblock %}
+{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
+</head>
+{% load i18n %}
+
+<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
+
+<!-- Container -->
+<div id="container">
+
+    {% if not is_popup %}
+    <!-- Header -->
+    <div id="header">
+        <div id="branding">
+        {% block branding %}{% endblock %}
+        </div>
+        {% if user.is_active and user.is_staff %}
+        <div id="user-tools">
+            {% trans 'Welcome,' %}
+            <strong>{% filter force_escape %}{% firstof user.first_name user.username %}{% endfilter %}</strong>.
+            {% block userlinks %}
+                {% url django-admindocs-docroot as docsroot %}
+                {% if docsroot %}
+                    <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> /
+                {% endif %}
+                {% url admin:password_change as password_change_url %}
+                {% if password_change_url %}
+                    <a href="{{ password_change_url }}">
+                {% else %}
+                    <a href="{{ root_path }}password_change/">
+                {% endif %}
+                {% trans 'Change password' %}</a> /
+                {% url admin:logout as logout_url %}
+                {% if logout_url %}
+                    <a href="{{ logout_url }}">
+                {% else %}
+                    <a href="{{ root_path }}logout/">
+                {% endif %}
+                {% trans 'Log out' %}</a> /
+                <a href="https://subtrac.sara.nl/oss/cmt">
+                {% trans 'Documentation' %}</a>
+            {% endblock %}
+        </div>
+        {% endif %}
+        {% block nav-global %}{% endblock %}
+    </div>
+    <!-- END Header -->
+    {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} &rsaquo; {{ title }}{% endif %}</div>{% endblock %}
+    {% endif %}
+
+        {% if messages %}
+        <ul class="messagelist">{% for message in messages %}
+          <li{% if message.tags %} class="{{ message.tags }}"{% endif %}>{{ message }}</li>
+	{% endfor %}</ul>
+        {% endif %}
+
+    <!-- Content -->
+    <div id="content" class="{% block coltype %}colM{% endblock %}">
+        {% block pretitle %}{% endblock %}
+        {% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
+        {% block content %}
+        {% block object-tools %}{% endblock %}
+        {{ content }}
+        {% endblock %}
+        {% block sidebar %}{% endblock %}
+        <br class="clear" />
+    </div>
+    <!-- END Content -->
+
+    {% block footer %}<div id="footer"></div>{% endblock %}
+</div>
+<!-- END Container -->
+
+</body>
+</html>
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/base_site.html
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/base_site.html	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/base_site.html	(revision 14193)
@@ -0,0 +1,10 @@
+{% extends "admin/base.html" %}
+{% load i18n %}
+
+{% block title %}{{ title }} | {% trans 'SARA CMT admin' %}{% endblock %}
+
+{% block branding %}
+<h1 id="site-name">{% trans 'SARA Config Management Tool' %}</h1>
+{% endblock %}
+
+{% block nav-global %}{% endblock %}
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/index.html
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/index.html	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/templates/admin/index.html	(revision 14193)
@@ -0,0 +1,85 @@
+{% extends "admin/base_site.html" %}
+{% load i18n %}
+
+{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css" />{% endblock %}
+
+{% block coltype %}colMS{% endblock %}
+
+{% block bodyclass %}dashboard{% endblock %}
+
+{% block breadcrumbs %}{% endblock %}
+
+{% block content %}
+<div id="content-main">
+
+{% if app_list %}
+    {% for app in app_list %}
+        <div class="module">
+        <table summary="{% blocktrans with app.name as name %}Models available in the {{ name }} application.{% endblocktrans %}">
+        <caption><a href="{{ app.app_url }}" class="section">{% blocktrans with app.name as name %}{{ name }}{% endblocktrans %}</a></caption>
+        {% for model in app.models %}
+            <tr>
+            {% if model.perms.change %}
+                <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }}</a></th>
+            {% else %}
+                <th scope="row">{{ model.name }}</th>
+            {% endif %}
+
+            {% if model.perms.add %}
+                <td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td>
+            {% else %}
+                <td>&nbsp;</td>
+            {% endif %}
+
+            {% if model.perms.change %}
+                <td><a href="{{ model.admin_url }}" class="changelink">{% trans 'Change' %}</a></td>
+            {% else %}
+                <td>&nbsp;</td>
+            {% endif %}
+            </tr>
+        {% endfor %}
+        </table>
+        </div>
+    {% endfor %}
+{% else %}
+    <p>{% trans "You don't have permission to edit anything." %}</p>
+{% endif %}
+</div>
+{% endblock %}
+
+{% block sidebar %}
+<div id="content-related">
+    <div class="module" id="recent-actions-module">
+        <h2>{% trans 'Recent Actions' %}</h2>
+        <h3>{% trans 'Our Actions' %}</h3>
+            {% load log %}
+            {# get_admin_log 10 as admin_log for_user user #}
+            {% get_admin_log 20 as admin_log %}
+            {% if not admin_log %}
+            <p>{% trans 'None available' %}</p>
+            {% else %}
+            <ul class="actionlist">
+            {% for entry in admin_log %}
+            <li class="{% if entry.is_addition %}addlink{% endif %}{% if entry.is_change %}changelink{% endif %}{% if entry.is_deletion %}deletelink{% endif %}">
+                <span class="mini quiet">On {{ entry.action_time }}</span>
+                <br/>
+                {{ entry.user }}
+                {% if entry.is_addition or entry.is_change %}
+                    {% if entry.is_addition %}added{% endif %}{% if entry.is_change%}changed{% endif %}
+                    <a href="{{ entry.get_admin_url }}">{{ entry.object_repr }}</a>
+                {% else %}
+                    deleted {{ entry.object_repr }}
+                {% endif %}
+                <br/>
+                {% if entry.content_type %}
+                    <span class="mini quiet">{% filter capfirst %}{% trans entry.content_type.name %}{% endfilter %}</span>
+                {% else %}
+                    <span class="mini quiet">{% trans 'Unknown content' %}</span>
+                {% endif %}
+            </li>
+            {% endfor %}
+            </ul>
+            {% endif %}
+    </div>
+</div>
+{% endblock %}
Index: /tags/1.0.0/sara_cmt/sara_cmt/cluster/templatetags/cmt_client.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/cluster/templatetags/cmt_client.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/cluster/templatetags/cmt_client.py	(revision 14193)
@@ -0,0 +1,440 @@
+import os, re, string
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+# Inspired by Django tips on:
+#   http://www.b-list.org/weblog/2006/jun/07/django-tips-write-better-template-tags/
+from django import template
+from django.template.defaultfilters import stringfilter
+from django.utils.encoding import smart_unicode, force_unicode
+
+from sara_cmt.logger import Logger
+logger = Logger().getLogger()
+
+#from django.db.models import get_model
+
+register = template.Library()
+
+class NoBlankLinesNode(template.Node):
+    """
+        Renderer that'll remove all blank lines.
+    """
+
+    def __init__(self, nodelist):
+        self.nodelist = nodelist
+
+    def render(self, context):
+        return re.sub('\n([\ \t]*\n)+', '\n', force_unicode(
+            self.nodelist.render(context)))
+
+@register.tag
+def noblanklines(parser, token):
+    nodelist = parser.parse(('endnoblanklines',))
+    parser.delete_first_token()
+    return NoBlankLinesNode(nodelist)
+
+@stringfilter
+def arpanize(value):
+    """
+        Converts a IP (range) to reversed DNS style arpa notation
+
+        Usage:
+            {{{ <variable>|arpanize }}}
+
+        I.e.:
+            {% assign broadcast = '192.168.1.0' %}
+            {{{ broastcast|arpanize }}}
+        Results in output:
+            1.168.192.in-addr.arpa
+    """
+    ip_blocks = value.split('.')
+
+    reverse_block = [ ip_blocks[2], ip_blocks[1], ip_blocks[0], 'in-addr.arpa' ]
+
+    return string.join( reverse_block, '.' )
+
+register.filter( 'arpanize', arpanize )
+
+@stringfilter
+def base_net(value):
+    """
+        Converts a IP (range) to it's first 3 octects
+
+        Usage:
+            {{{ <variable>|base_net }}}
+
+        I.e.:
+            {% assign broadcast = '192.168.1.0' %}
+            {{{ broastcast|base_net }}}
+        Results in output:
+            192.168.1
+    """
+    ip_blocks = value.split('.')
+
+    return string.join( ip_blocks[:3], '.' )
+
+register.filter( 'base_net', base_net )
+
+@stringfilter
+def ip_last_digit(value):
+    """
+        Converts a IP (range) to it's last octect
+
+        Usage:
+            {{{ <variable>|ip_last_digit }}}
+
+        I.e.:
+            {% assign myip = '192.168.1.123' %}
+            {{{ myip|ip_last_digit }}}
+        Results in output:
+            123
+    """
+    ip_blocks = value.split('.')
+
+    return ip_blocks[3]
+
+register.filter( 'ip_last_digit', ip_last_digit )
+
+@register.tag(name='assign')
+def do_assign(parser,token):
+
+    """
+        Variable assignment within template
+
+        Usage: {% assign newvar = <space seperated list of strings/vars> %}
+         i.e.: {% assign file_name = '/var/tmp/rack-' rack.label '.txt' %}
+    """
+    definition = token.split_contents()
+
+    if len(definition) < 4:
+        raise template.TemplateSyntaxError, '%r tag requires at least 4 arguments' % tag
+
+    tag = definition[0]
+    new_var = definition[1]
+    is_teken = definition[2]
+    assignees = definition[3:]
+
+    return resolveVariables( new_var, assignees )
+
+class resolveVariables(template.Node):
+
+    def __init__(self, varname, varlist ):
+
+        self.varname = varname
+        self.varlist = varlist
+
+    def render(self, context):
+        resvars = [ ]
+
+        for a in self.varlist:
+
+            var_str = ''
+
+            if not (a[0] == a[-1] and a[0] in ('"', "'")):
+                try:
+                    # RB: no quotes must mean its a variable
+                    #
+                    a_var = template.Variable( a )
+                    var_str = a_var.resolve(context)
+
+                except template.VariableDoesNotExist:
+
+                    #RB: still think not allowed to raise exceptions from render function
+                    #
+                    #raise template.TemplateSyntaxError, 'cannot resolve variable %r' %(  str( self.path ) )
+                    pass
+
+                resvars.append( str(var_str) )
+
+            else:
+                #RB: assume strings are quoted
+                #RB: strip quotes from string
+                #
+                a = str( a.strip("'").strip('"') )
+                resvars.append( str(a) )
+
+        #RB: finally assign the concatenated string to new varname
+        context[ self.varname ] = string.join( resvars, '' )
+
+        #RB: Django render functions not supposed/allowed to raise Exception, I think
+        return ''
+
+@register.tag(name='store')
+def do_save_meta(parser, token):
+    """
+        Compilation function to use for meta-info.
+
+        Usage: {% store '/path/to/file' %}
+               {% store variable %} # variable = '/path/to/file'
+    """
+    definition = token.split_contents()
+
+    if len(definition) != 4 and len(definition) != 2:
+        raise template.TemplateSyntaxError, '%r tag requires at least 1 arguments' % tag
+
+    tag = definition[0]
+    path_arg = definition[1]
+
+    if len(definition) == 4:
+
+	    #RB: OLDSTYLE
+        #RB: 4 arguments means: {% store /path/filename as output %}
+        #RB: old style: DONT try to resolve variable
+        #RB: instead convert filename to quoted string
+
+        kw_as = definition[2]
+        kw_output_name = definition[3]
+
+        path_str = "'%s'" %path_arg
+
+        # RB: parse the entire template for old-style
+        nodelist = parser.parse()
+
+    else:
+    	#RB: NEWSTYLE
+        #RB: 2 arguments can mean: {% store 'string' %}
+        #RB: 2 arguments can mean: {% store variable %}
+
+        kw_output_name = None
+
+        path_str = path_arg
+
+        # RB: parse the template thing until %endstore found
+        nodelist = parser.parse(('endstore',))
+        # RB: throw away %endstore tag
+        parser.delete_first_token()
+
+    # RB: Now lets start writing output files
+    return generateStoreOutput(tag, path_str, nodelist, kw_output_name)
+
+class generateStoreOutput(template.Node):
+
+    def __init__(self, tag, path_str, nodelist, kw_output_name=None):
+        self.tag = tag
+        self.nodelist = nodelist
+        self.path_str = path_str
+        self.kw_output_name = kw_output_name
+
+    def render(self, context):
+
+        if (self.path_str[0] == self.path_str[-1] and self.path_str[0] in ('"', "'")):
+
+            mypath_str = str(self.path_str)[1:-1]
+
+        else:
+            # RB: Not quoted: must be a variable: attempt to resolve to value
+            try:
+                pathvar = template.Variable( str(self.path_str) )
+                mypath_str = pathvar.resolve(context)
+            except template.VariableDoesNotExist:
+                #raise template.TemplateSyntaxError, '%r tag argument 1: not a variable %r' %( tag, path_str )
+                pass
+
+        if self.kw_output_name:
+            # RB: store 'output' variable filename for BW compat
+
+            context[ self.kw_output_name ] = mypath_str
+
+        # RB: render template between store tags
+        output = self.nodelist.render(context)
+
+        # RB: store output in context dict for later writing to file
+        context['stores'][ mypath_str ] = output
+
+        # RB: output generated into context dict, so we return nothing
+        return ''
+
+class ScriptNode(template.Node):
+    """
+        Renderer, which executes the lines included in the script-tags.
+    """
+
+    def __init__(self, nodelist):
+        self.nodelist = nodelist
+
+    def render(self, context):
+        script = self.nodelist.render(context)
+        if context.has_key('epilogue'):
+            context['epilogue'].append(script)
+        else:
+            context['epilogue'] = [script]
+        # All content between {% epilogue %} and {% endepilogue %} is parsed now
+        return ''
+
+@register.tag(name='epilogue')
+def do_epilogue(parser, token):
+    """
+        Saving the contents between the epilogue-tags
+    """
+    nodelist = parser.parse(('endepilogue',))
+    parser.delete_first_token()
+    return ScriptNode(nodelist)
+
+from django.db.models import get_model
+
+@register.tag(name='getbasenets')
+def do_getbasenets(parser, token):
+
+    try:
+        tag, network_name, kw_as, varname = token.split_contents()
+    except ValueError:
+        raise template.TemplateSyntaxError, '%r tag requires exactly 4 arguments' % tag
+
+    return getBaseNets( varname, network_name )
+
+class getBaseNets(template.Node):
+
+    """
+        Get list of basenets in a network (name)
+
+        Usage: {% getbasenets <network name> as <listname> %}
+    """
+
+    def __init__(self, varname, network_name ):
+
+        self.varname = varname
+        self.network_name = network_name.strip("'").strip('"').__str__()
+        self.basenets = [ ]
+
+    def render(self, context):
+
+        if (self.network_name[0] == self.network_name[-1] and self.network_name[0] in ('"', "'")):
+
+            network_str = str( self.network_name.strip("'").strip('"') )
+        else:
+            # RB: Not quoted: must be a variable: attempt to resolve to value
+            try:
+                networkvar = template.Variable( str(self.network_name) )
+                network_str = networkvar.resolve(context)
+            except template.VariableDoesNotExist:
+                #raise template.TemplateSyntaxError, '%r tag argument 1: not a variable %r' %( tag, path_str )
+                pass
+
+        from IPy import IP
+
+        network_units = get_model('cluster', 'Network').objects.filter( name=str(network_str) )
+
+        for n in network_units:
+
+            for ipnum in IP( n.cidr ):
+                if not base_net( ipnum ) in self.basenets:
+                    self.basenets.append( str( base_net( ipnum ) ) )
+
+        context[ self.varname ] = self.basenets
+        self.basenets = [ ]
+
+        return ''
+
+@register.tag(name='getracks')
+def do_getracks(parser, token):
+
+    try:
+        tag, cluster, kw_as, name = token.split_contents()
+    except ValueError:
+        raise template.TemplateSyntaxError, '%r tag requires exactly 4 arguments' % tag
+
+    return getRacks( name, cluster )
+
+class getRacks(template.Node):
+
+    """
+        Get list of racks in a cluster
+
+        Usage: {% getracks <cluster> as <listname> %}
+    """
+
+    def __init__(self, name, cluster):
+
+        self.name = name
+        self.cluster = cluster.strip("'").strip('"').__str__()
+        self.racks = [ ]
+
+    def render(self, context):
+
+        cluster_units = get_model('cluster', 'HardwareUnit').objects.filter( cluster__name=str(self.cluster) )
+
+        for u in cluster_units:
+            if u.rack not in self.racks:
+                self.racks.append( u.rack )
+
+        context[ self.name ] = self.racks
+        return ''
+
+@register.tag(name='use')
+def do_use(parser, token):
+    """
+        Compilation function to definine Querysets for later use.
+        
+        Usage: {% use <entity> with <attribute>=<value> as <list/var> <key> %}
+    """
+    tag = token.contents.split()[0]
+
+    try:
+        definition = token.split_contents()
+        # definition should look like ['use', <entity>, 'with' <query>, 'as', '<key>']
+    except ValueError:
+        raise template.TemplateSyntaxError, '%r tag requires at least 5 arguments' % tag
+    if len(definition) != 6:
+        raise template.TemplateSyntaxError, '%r tag requires at least 5 arguments' % tag
+    if definition[2] != 'with':
+        raise template.TemplateSyntaxError, "second argument of %r tag has to be 'with'" % tag
+    if definition[-2] != 'as':
+        raise template.TemplateSyntaxError, "second last argument of %r tag has to be 'as'" % tag
+
+    entity = definition[1]
+    query = definition[-3]
+    key = definition[-1]
+
+    return QuerySetNode(entity, query, key)
+
+class QuerySetNode(template.Node):
+    """
+        Renderer, which fetches objects from the database.
+    """
+
+    def __init__(self, entity, query, key):
+        self.entity = entity
+        self.query = query
+        self.key = key
+
+    def render(self, context):
+
+        if (self.query[0] == self.query[-1] and self.query[0] in ('"', "'")):
+
+            myquery_str = str( self.query.strip("'").strip('"') )
+        else:
+            # RB: Not quoted: must be a variable: attempt to resolve to value
+            try:
+                queryvar = template.Variable( str(self.query) )
+                myquery_str = queryvar.resolve(context)
+            except template.VariableDoesNotExist:
+                #raise template.TemplateSyntaxError, '%r tag argument 1: not a variable %r' %( tag, path_str )
+                pass
+
+        attr, val = myquery_str.split('=')
+        queryset = get_model('cluster', self.entity).objects.filter(**{attr:val})
+        if len(queryset) == 1:
+            queryset = queryset[0]
+        context[self.key] = queryset
+        logger.debug('context = %s'%context)
+        return ''
+
+# use <entity> with <attribute>=<value> as <key>
+
+
+        
Index: /tags/1.0.0/sara_cmt/sara_cmt/django_cli.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/django_cli.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/django_cli.py	(revision 14193)
@@ -0,0 +1,497 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.db.models.fields import FieldDoesNotExist
+from django.db.models.fields.related import ForeignKey, ManyToManyField, \
+    OneToOneField, RelatedField
+
+from types import StringTypes
+
+import sqlite3
+from sqlite3 import IntegrityError
+
+from sara_cmt.logger import Logger
+logger = Logger().getLogger()
+
+from sara_cmt.parser import Parser
+parser = Parser().getParser()
+
+from django.db import models
+
+import tagging
+from tagging.fields import TagField
+from django_extensions.db.fields import CreationDateTimeField, \
+                                        ModificationDateTimeField
+
+import settings
+if not settings.CLIENT_ONLY:
+    # To be able to migrate fields of 3rd party app django-extensions
+    from south.modelsinspector import add_introspection_rules
+    add_introspection_rules([], ["^django_extensions\.db\.fields"])
+
+
+class ModelExtension(models.Model):
+    """
+        The ModelExtension of Django-CLI is meant as a Mixin for a Django
+        Model.
+    """
+    tags = TagField()
+    created_on = CreationDateTimeField()
+    updated_on = ModificationDateTimeField()
+    note = models.TextField(blank=True)
+
+    class Meta:
+        abstract = True
+
+
+#####
+#
+# <STATIC METHODS>
+#
+
+    @staticmethod
+    def display(instance):
+        """
+            Print all values given in list_display of the model's admin
+        """
+        # First get access to the admin
+        admin_class_name = instance._meta.object_name + 'Admin'
+        import sara_cmt.cluster.admin
+        admin_list_display = eval('sara_cmt.cluster.admin.' \
+                                + admin_class_name + '.list_display')
+
+        # Determine longest value-string to display
+        longest_key = 0
+        for val in admin_list_display:
+            if len(val) > longest_key:
+                longest_key = len(val)
+
+        # Print the values
+        print ' .---[  %s  ]---' % instance
+        for key in admin_list_display:
+            if key not in ('__unicode__', '__str__'):
+                print ' : %s : %s' % (key.ljust(longest_key), \
+                                      instance.__getattribute__(key))
+        print " '---\n"
+#
+# </STATIC METHODS>
+#
+#####
+
+    def _required_fields(self):
+        """
+            Checks which fields are required, and returns these fields in a
+            set.
+        """
+        fields = [fld for fld in self._meta.fields if not fld.blank]
+        return fields
+
+    def _required_local_fields(self):
+        """
+            Checks which local fields are required, and returns these fields
+            in a set. A local field can be of any type except ForeignKey and
+            ManyToManyField.
+        """
+        fields = [fld for fld in self._required_fields() if \
+            not isinstance(fld, RelatedField)]
+        return fields
+
+    def _required_refering_fields(self):
+        """
+            Checks which refering fields are required, and returns these
+            fields in a set. A refering field is of the type ForeignKey or
+            ManyToManyField.
+        """
+        fields = [fld for fld in self._required_fields() if \
+            isinstance(fld, RelatedField)]
+        return fields
+
+    def _is_fk(self, field):
+        """
+            Checks if a given field is a ForeignKey.
+            Returns a boolean value.
+        """
+        # First be sure that we check a field
+        if isinstance(field, StringTypes):
+            field = self._meta.get_field(field)
+            logger.warning('Checking for a ForeignKey with the \
+                string-representation of a field')
+        retval = isinstance(field, ForeignKey)
+        return retval
+
+    def _is_m2m(self, field):
+        """
+            Checks if a given field is a ManyToManyField.
+            Returns a boolean value.
+        """
+        # First be sure that we check a field
+        if isinstance(field, StringTypes):
+            field = self._meta.get_field(field)
+            logger.warning('Checking for a ManyToMany with the \
+                string-representation of a field')
+        retval = isinstance(field, ManyToManyField)
+        return retval
+
+    def is_complete(self):
+        """
+            Check if all the required fields has been assigned.
+        """
+        return not self._missing_fields()
+
+    def setattrs_from_dict(self, arg_dict):
+        """
+            Set attributes according to the arguments, given in a dictionary.
+            Each key in the dictionary should match a fieldname in the model.
+        """
+        m2ms = [] # to collect M2Ms (which should be done at last)
+
+        for arg in arg_dict:
+            field = self._meta.get_field(arg)
+            logger.debug("Have to assign %s to attribute '%s' (%s)" \
+                % (arg_dict[arg], arg, field.__class__.__name__))
+
+            # In case of an id-field: Just ignore it.
+            if arg == 'id':
+                logger.error("Better to not set an id-field, so I'll skip \
+                    this one")
+                continue
+
+            # Leave M2Ms for later, because they need an object's id
+            elif type(field) == ManyToManyField:
+                m2ms.append([field, arg_dict[arg]])
+
+            self._setattr(field=arg, value=arg_dict[arg])
+
+        # Save object to give it an id, and make the M2M relations
+        if not parser.values.DRYRUN:
+            try:
+                self.save()
+            except Exception as err:
+                logger.warning('%s: %s. Maybe not enough (unique) data provided?' % (type(err), err[-1] ))
+
+        for m2m in m2ms:
+            self._setm2m(m2m[0], m2m[1])
+
+        if self.is_complete():
+            save_msg = 'Saved %s %s' % (self.__class__.__name__, self)
+            if not parser.values.DRYRUN:
+                try:
+                    self.save()
+                    logger.info(save_msg)
+                except (sqlite3.IntegrityError, ValueError), err: # ??? what if using non-sqlite db? ???
+                    logger.error(err)
+            else:
+                logger.info('[DRYRUN] %s' % save_msg)
+
+        logger.debug('attrs_from_dict(%s) => %s' % (arg_dict, self.__dict__))
+
+    def _missing_fields(self):
+        """
+            Checks if the required fields all have a value assigned to it, to
+            be sure it can be saved to the database.
+            Returns the set of missing editable fields.
+        """
+        required, missing = self._required_fields(), []
+
+        # Isolate all missing fields from required fields.
+        for field in required:
+            try:
+                if not self.__getattribute__(field.name) and field.editable:
+                    # Field hasn't been set
+                    missing.append(field)
+            except:
+                # FK hasn't been set
+                missing.append(field)
+        return missing
+
+    def interactive_completion(self):
+        """
+            Lets the user assign values to the missing fields, by iterating
+            over the missing fields. Iteration will stop when all required
+            fields are given.
+        """
+        # !!! Note: This function should only be called in INTERACTIVE mode !!!
+
+        # ??? TODO: Validation via forms:
+        #     http://docs.djangoproject.com/en/dev/ref/forms/validation/ ???
+
+        missing = self._missing_fields()
+
+        while missing:
+            logger.info('Missing required attributes: %s'
+                % ' '.join([field.name for field in missing]))
+
+            current_field = missing[0]
+            interactive_input = [raw_input(current_field.verbose_name + ': ')]
+            logger.debug('INTERACTIVE INPUT: %s'%interactive_input)
+            try:
+                assert bool(interactive_input), 'Field cannot be left blank'
+                # Input for missing attribute is now stored in var 'input'.
+                #i = self._setattr(current_field, input)
+                #self.save()
+                self._setattr(current_field, interactive_input)
+                missing.remove(current_field)
+            except AssertionError, err:
+                logger.error(err)
+            except sqlite3.IntegrityError, err: # ??? what if using non-sqlite db? ???
+                logger.error('IntegrityError:', err)
+
+            logger.debug('Current values: %s' % self.__dict__)
+            missing = self._missing_fields()
+
+    def _setfk(self, field, value, subfields=None):
+        """
+            Set the FK of the given field to the id of an object with the
+            given value in one of its required fields (minus 'id' and FKs).
+        """
+        to_model = field.rel.to
+        logger.debug("Trying to save '%s' (type:%s) in FK to %s"
+            % (value, type(value), to_model.__name__))
+
+        if isinstance(value, StringTypes):
+            value = [value]
+            logger.debug("Transformed value '%s' in list '%s'"%(value[0], value))
+
+        # determine which fields should be searched for
+        if not subfields:
+            subfields = to_model()._required_local_fields() # exclude FKs
+
+        logger.debug('Searching a %s matching on fields %s'
+            % (to_model.__name__, [f.name for f in subfields]))
+
+        qset = models.query.EmptyQuerySet(model=to_model)
+        # OR-filtering QuerySets
+        # !!! TODO: have to use Q-objects for this !!!
+        # !!! TODO: have to write a Custom Manager for this !!!
+        for subfield in subfields:
+            # !!! TODO: support multiple values[] !!!
+            try:
+                found = to_model.objects.filter(
+                    **{'%s__in' % subfield.name: value})
+                logger.debug('Iteration done, found: %s (%s)'%(found, type(found)))
+                # higher priority on the label-field:
+                if len(found) == 1 and (subfield.name == 'label' or subfield.name == 'name'):
+                    qset = found
+                    break
+                qset |= found
+            except ValueError, e:
+                logger.warning(e)
+        logger.debug('Found the following matching objects: %s' % qset)
+
+        objects = [_object for _object in qset]
+        object_count = len(objects)
+        if object_count is 0:
+            logger.warning('No matching object found; Change your query.')
+        elif object_count is 1:
+            _object = objects[0]
+            logger.debug('Found 1 match: %s' % _object)
+            self.__setattr__(field.attname, _object.id)
+            logger.debug('%s now references to %s' % (field.name, _object))
+        else:
+            # !!! TODO: let the user refine the search !!!
+            logger.warning('To many matching objects; Refine your query.')
+            # Try the match with the highest number of matches, ...
+
+    def _setm2m(self, field, values, subfields=None):
+        """
+            Set a ManyToMany-relation.
+        """
+        to_model = field.rel.to
+        logger.debug("Trying to make M2M-relations to %s based on '%s'" \
+            % (to_model.__name__, values))
+
+        # determine which fields should be searched for
+        if not subfields:
+            #subfields = to_model()._required_fields()
+            subfields = to_model()._required_local_fields() # exclude FKs
+
+        qset = models.query.EmptyQuerySet(model=to_model)
+        # OR-filtering QuerySets
+        # !!! TODO: have to write a Custom Manager for this !!!
+        for subfield in subfields:
+            logger.debug("Searching in field '%s'" % subfield.name)
+            qset |= to_model.objects.filter(
+                **{'%s__in' % subfield.name: values})
+        logger.debug('Found the following matching objects: %s' % qset)
+
+        objects = [_object for _object in qset]
+        object_count = len(objects)
+        if object_count is 0:
+            logger.warning('No matching object found; Change your query.')
+            pass
+        else:
+            for _object in objects:
+                # !!! TODO: make options to add (+=), remove(-=), and set (=)
+                self.__getattribute__(field.name).add(_object)
+
+        pass
+
+
+    def _setattr(self, field, value):
+        """
+            Assign the given value to the attribute belonging to the given
+            field. The field can be given as a field in the model, or as the
+            string matching its name.
+            When given as a string, it may be followed by '__<attr>', to
+            search for already existing entities with the <attr>-field equal
+            to the given value.
+            If the search results to a single match, the id of the matching
+            entity is assigned to the given ForeignKey-field.
+        """
+        # First init the field itself if it's given as a string
+        if isinstance(field, StringTypes):
+            field = self._meta.get_field(field)
+
+        logger.debug("Trying to set attribute '%s' (%s) to %s" \
+            % (field.name, field.__class__.__name__, value.__repr__()))
+
+        if isinstance(field, ForeignKey):
+            self._setfk(field, value)
+        elif isinstance(field, ManyToManyField):
+            logger.debug("""Found an M2M field. Can't assign it as long as the" \
+                object doesn't have an id, so leave this for later""")
+        else:
+            logger.debug('Trying to set attribute of %s'%type(field))
+            for e in value: # iterate through all elements
+                self.__setattr__(field.name, e)
+            if len(value) > 1:
+                # !!! TODO: append values, instead of overwrite !!!
+                # like: for v in value: self.<append>(v)
+                logger.debug('Functionality to append values is still missing')
+
+
+class ObjectManager():
+    """
+        The ObjectManager is responsible for operations on objects in the
+        database.
+        Operations are based on a given Query-object.
+    """
+
+    def __init__(self):
+        logger.debug('Initializing ObjectManager')
+
+    def get_objects(self, query):
+        """
+            Retrieve objects from the database, corresponding to the entity
+            and terms in the given query. The terms are OR-ed by default.
+        """
+        # !!! TODO: Implement AND !!!
+        kwargs = {}
+
+        logger.debug('CHECK query: %s' % query)
+        for attr, val in query['get'].items():
+            try:
+                fld = query['ent']._meta.get_field(attr)
+                logger.debug('CHECK %s: %s' \
+                    % (fld.__class__.__name__, fld.name))
+                if type(fld) in (ForeignKey, ManyToManyField):
+                    # Default field to search in
+                    if 'label' in fld.rel.to().__dict__:
+                        label = 'label'
+                    else:
+                        label = 'name'
+                    # ??? TODO: maybe use %s__str ???
+                    attr = '%s__%s' % (attr, label)
+                kwargs['%s__in' % attr] = val
+            except FieldDoesNotExist, err:
+                logger.error(err)
+
+        objects = query['ent'].objects.filter(**kwargs)
+        return objects.distinct()
+
+    def save_objects(self, qset):
+        """
+            Save all objects of the given QuerySet.
+        """
+        # TODO: implement
+        for _object in qset:
+            try:
+                self._save_object(_object)
+            except:
+                logger.error('Error saving %s %s' \
+                    % (_object.__class__.__name__, _object))
+
+    def display(self, instance):
+        """
+            Print all values
+        """
+        # TODO: implement
+        pass
+
+
+class QueryManager():
+    """
+        The QueryManager has knowledge about building Queries based on
+        arguments that are given on the commandline. Those arguments can be
+        pushed to the QueryManager with push_args(), which on its turn will
+        build a new Query, which can be retrieved with get_query().
+    """
+
+    def __init__(self):
+        logger.debug('Initializing QueryManager')
+        self.query = self.Query()
+
+    class Query(dict):
+        """
+            Query holds a dictionary of the given args.
+        """
+
+        def __init__(self, ent=None):
+            logger.debug('Initializing new Query')
+            if ent:
+                self._new(ent)
+
+        def _new(self, ent=None):
+            self['ent'] = ent
+            self['get'] = {}
+            self['set'] = {}
+            # ??? TODO: maybe implement something like `self['fields'] = {}`
+            #     to narrow the searchspace ???
+
+    def push_args(self, args, entity, keys=['default']):
+        """
+            # args = list of args from cli, like:
+            #     ['get', 'label=fs7', 'label=fs6']
+            # entity = class of given entity, like:
+            #     <class 'sara_cmt.cluster.models.HardwareUnit'>
+            # keys = the key(s) to use (which depends on the given option),
+            # like:
+            #     ['get']
+        """
+        self.query = self.Query(entity)
+
+        key = keys[0]
+
+        for arg in args:
+            #logger.debug("checking arg '%s' of args '%s'"%(arg,args))
+            if arg in keys: # it's a key like 'get', 'set'
+                key = arg
+            else: # it's an assignment like 'label=fs6'
+                attr, val = arg.split('=', 1)
+
+                if attr in self.query[key]:
+                    # this isn't the first time we see this attribute, so
+                    # assign an extra value to it
+                    self.query[key][attr].append(val)
+                else:
+                    # this is the first time we see this attribute
+                    self.query[key][attr] = [val]
+
+        logger.debug("push_args built query '%s'" % self.query)
+
+    def get_query(self):
+        return self.query
Index: /tags/1.0.0/sara_cmt/sara_cmt/logger.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/logger.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/logger.py	(revision 14193)
@@ -0,0 +1,54 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import logging
+import logging.config
+
+
+class Logger:
+    """
+        A logging facility, implemented with the borg design pattern. Makes
+        use of the Python logging lib, see:
+            http://docs.python.org/library/logging.html
+    """
+    __shared_state = {}
+
+    # Check for existence of a global logging object, otherwise make one
+    if 'logger' not in __shared_state.keys():
+        #TODO: think about a (better) way to make this dynamic:
+        import site
+
+        if site.sys.prefix in [ '/usr', '/' ]:
+            ETC_PREPEND = ''
+        else:
+            ETC_PREPEND = site.sys.prefix
+
+        logging.config.fileConfig('%s/etc/cmt/logging.conf'%ETC_PREPEND)
+        __shared_state['logger'] = logging.getLogger('cli')
+
+    def __init__(self):
+        """
+            Assigns the global __shared_state to __dict__ to be able to use
+            the class like a singleton.
+        """
+        self.__dict__ = self.__shared_state
+
+    def getLogger(self):
+        """
+            Returns the only logger instance (or state, to be exactly).
+        """
+        return self.__dict__['logger']
Index: /tags/1.0.0/sara_cmt/sara_cmt/manage.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/manage.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/manage.py	(revision 14193)
@@ -0,0 +1,29 @@
+#!/usr/bin/env python
+
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.core.management import execute_manager
+try:
+    import settings # Assumed to be in the same directory.
+except ImportError:
+    import sys
+    sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__)
+    sys.exit(1)
+
+if __name__ == "__main__":
+    execute_manager(settings)
Index: /tags/1.0.0/sara_cmt/sara_cmt/parser.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/parser.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/parser.py	(revision 14193)
@@ -0,0 +1,35 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import optparse
+
+
+class Parser:
+    """
+        Optionparser, implemented with the borg design pattern.
+    """
+    __shared_state = {}
+
+    # Check for existence of a global parser object, otherwise make one
+    if 'parser' not in __shared_state.keys():
+        __shared_state['parser'] = optparse.OptionParser()
+
+    def __init__(self):
+        self.__dict__ = self.__shared_state
+
+    def getParser(self):
+        return self.__dict__['parser']
Index: /tags/1.0.0/sara_cmt/sara_cmt/settings.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/settings.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/settings.py	(revision 14193)
@@ -0,0 +1,310 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+import os, os.path, sys, ConfigParser, site, string, time
+
+from socket import gethostbyname_ex
+
+if site.sys.prefix in [ '/usr', '/' ]:
+    ETC_PREPEND = ''
+else:
+    ETC_PREPEND = site.sys.prefix
+
+# Path's customizable through virtualenv
+sample_configfile = '%s/etc/cmt/cmt.conf.sample' % ETC_PREPEND
+configfile = '%s/etc/cmt/cmt.conf' % ETC_PREPEND
+
+def count_configlines( filename ):
+
+	line_count	= 0
+	cfg_fp		= open( filename )
+
+	for line in cfg_fp.readlines():
+
+		line = line.strip()
+
+		if len( line ) == 0:
+			continue
+
+		# RB: ConfigParser considers lines starting with # or ; as comments
+		if line[0] == '#' or line[0] == ';':
+			continue
+
+		line_count += 1
+
+	cfg_fp.close()
+
+	return line_count
+
+if not os.path.exists( configfile ):
+
+	print 'Unable to find config file: %s' %configfile
+
+	if os.path.exists( sample_configfile ):
+
+		print ''
+		print 'Please modify the sample config file: %s to reflect your settings' %sample_configfile
+		print 'and then rename it to: %s' %configfile
+
+	else:
+
+		print ''
+		print 'Also no sample config file was found: %s' %sample_configfile
+		print 'Something is terribly wrong here ;)'
+
+	print ''
+	print 'Fatal: Giving up and exiting now..'
+
+	sys.exit(1)
+
+# We are still here: both configfile AND sample_configfile found
+if os.path.exists( sample_configfile ):
+
+	# Is the sample configfile newer?
+	if os.path.getmtime( sample_configfile ) > os.path.getmtime( configfile ):
+
+		# Well this is weird, but not fatal
+		print 'Warning: sample config file(%s) is newer than original config(%s)' %(sample_configfile, configfile)
+
+		# Does the sample config file contain more options?
+		if count_configlines( sample_configfile ) > count_configlines( configfile ):
+
+			print 'Warning: sample config file contains MORE OPTIONS than original config!'
+			print ''
+			print 'This happens for example if you upgraded CMT and the new release incorporates new configuration options!'
+			print ''
+			print 'Please update your original config(%s) to incorporate the new config options from sample config(%s)' %( configfile, sample_configfile )
+			print ''
+
+		# Give them some time to think about warnings and generally annoy them just enough to fix it
+		time.sleep(2)
+
+		# Moving right along; print empty line for cosmetic reasons
+		print ''
+
+config = ConfigParser.RawConfigParser()
+config.read( configfile )
+
+try:
+	DATABASE_USER		= config.get('database', 'USER')
+	DATABASE_PASSWORD	= config.get('database', 'PASSWORD')
+	DATABASE_HOST		= config.get('database', 'HOST')
+	DATABASE_ENGINE		= config.get('database', 'ENGINE')
+	DATABASE_NAME		= config.get('database', 'NAME')
+
+except (ConfigParser.NoOptionError, ConfigParser.NoSectionError), details:
+
+	print 'Config file error: %s' %str(details)
+	print ''
+	print 'Giving up and exiting now..'
+	sys.exit(1)
+
+try: # Optional
+	DATABASE_PORT = config.get('database', 'PORT')
+
+except ConfigParser.NoOptionError, details:
+
+	pass
+
+try: # Optional
+	TEST_DATABASE_NAME = config.get('database', 'TEST_NAME')
+
+except ConfigParser.NoOptionError, details:
+
+	pass
+
+try:
+	gethostbyname_ex( DATABASE_HOST )
+
+except socket.gaierror, details:
+
+	print 'Unable to resolve database host: %s' %DATABASE_HOST
+	print ''
+	print 'Giving up and exiting now..'
+	sys.exit(1)
+
+# Documentation of settings can be found on:
+#
+#   http://docs.djangoproject.com/en/dev/ref/settings/
+
+# Only set CLIENT_ONLY to False on the central CMT-server
+CLIENT_ONLY = True
+
+DEBUG = True
+
+ADMINS = (
+    ('Sil Westerveld', 'sil.westerveld@sara.nl'),
+    #('Your Name', 'your_email@domain.com'),
+)
+
+MANAGERS = ADMINS
+
+#####
+#
+# <AUTH AGAINST LDAP> (based on http://packages.python.org/django-auth-ldap/)
+#
+if not CLIENT_ONLY:
+    import ldap
+    from django_auth_ldap.config import LDAPSearch, PosixGroupType
+
+
+    # Baseline configuration.
+    AUTH_LDAP_SERVER_URI = "ldaps://ldap.cua.sara.nl"
+
+    # Set AUTH_LDAP_USER_DN_TEMPLATE to a template that will produce the
+    # authenticating user's DN directly. This template should have one
+    # placeholder, %(user)s.
+    AUTH_LDAP_USER_DN_TEMPLATE = 'uid=%(user)s,ou=Users,dc=hpcv,dc=sara,dc=nl'
+
+    # Set up the basic group parameters.
+    AUTH_LDAP_GROUP_SEARCH = LDAPSearch('ou=Groups,dc=hpcv,dc=sara,dc=nl',
+        ldap.SCOPE_SUBTREE, '(objectClass=posixGroup)',
+    )
+    AUTH_LDAP_GROUP_TYPE = PosixGroupType()
+
+    ## Only users in this group can log in.
+    AUTH_LDAP_REQUIRE_GROUP = 'cn=cmt,ou=Groups,dc=hpcv,dc=sara,dc=nl'
+
+    # Populate the Django user from the LDAP directory.
+    AUTH_LDAP_USER_ATTR_MAP = {
+        'first_name': 'givenName',
+        'last_name': 'sn',
+        'email': 'mail',
+    }
+
+    AUTH_LDAP_USER_FLAGS_BY_GROUP = {
+        'is_active': 'cn=cmt,ou=Groups,dc=hpcv,dc=sara,dc=nl',
+        'is_staff': 'cn=cmt,ou=Groups,dc=hpcv,dc=sara,dc=nl',
+        'is_superuser': 'cn=cmt,ou=Groups,dc=hpcv,dc=sara,dc=nl',
+    }
+
+    # This is the default, but I like to be explicit.
+    AUTH_LDAP_ALWAYS_UPDATE_USER = True
+
+    # Cache group memberships for an hour to minimize LDAP traffic
+    AUTH_LDAP_CACHE_GROUPS = True
+    AUTH_LDAP_GROUP_CACHE_TIMEOUT = 3600
+
+    # Keep ModelBackend around for per-user permissions and maybe a local
+    # superuser.
+    AUTHENTICATION_BACKENDS = (
+        'django_auth_ldap.backend.LDAPBackend',
+        'django.contrib.auth.backends.ModelBackend',
+    )
+#
+# </AUTH AGAINST LDAP>
+#
+#####
+
+
+
+
+
+# Local time zone for this installation. Choices can be found here:
+# http://en.wikipedia.org/wiki/List_of_tz_zones_by_name
+# although not all choices may be available on all operating systems.
+# If running in a Windows environment this must be set to the same as your
+# system time zone.
+TIME_ZONE = 'Europe/Amsterdam'
+
+# Language code for this installation. All choices can be found here:
+# http://www.i18nguy.com/unicode/language-identifiers.html
+LANGUAGE_CODE = 'en-us'
+
+SITE_ID = 1
+
+# If you set this to False, Django will make some optimizations so as not
+# to load the internationalization machinery.
+USE_I18N = True
+
+# Absolute path to the directory that holds media.
+# Example: "/home/media/media.lawrence.com/"
+MEDIA_ROOT = ''
+
+# URL that handles the media served from MEDIA_ROOT. Make sure to use a
+# trailing slash if there is a path component (optional in other cases).
+# Examples: "http://media.lawrence.com", "http://example.com/media/"
+MEDIA_URL = ''
+
+# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a
+# trailing slash.
+# Examples: "http://foo.com/media/", "/media/".
+ADMIN_MEDIA_PREFIX = '/admin_media/'
+
+# Make this unique, and don't share it with anybody.
+SECRET_KEY = 'uygv6wrel4o2%x8s4dk2%i6=dp!2bt32$0ne-%_7&j=ez*u$1b'
+
+# List of callables that know how to import templates from various sources.
+TEMPLATE_LOADERS = (
+    'django.template.loaders.filesystem.load_template_source',
+    'django.template.loaders.app_directories.load_template_source',
+    #'django.template.loaders.eggs.load_template_source',
+)
+
+MIDDLEWARE_CLASSES = (
+    'django.middleware.common.CommonMiddleware',
+    'django.contrib.sessions.middleware.SessionMiddleware',
+    'django.contrib.auth.middleware.AuthenticationMiddleware',
+    'debug_toolbar.middleware.DebugToolbarMiddleware',
+)
+
+ROOT_URLCONF = 'sara_cmt.urls'
+
+# Templates for the CMT command line interface.
+# (thus, the templates for our configfiles, etc)
+#TODO: think about a (better) way to make this dynamic:
+#TODO: get this out of the settings.py, since it should be in the client config
+CMT_TEMPLATES_DIR = '%s/etc/cmt/templates' % ETC_PREPEND
+
+# Templates for the CMT web-frontend.
+TEMPLATE_DIRS = (
+    # Put strings here, like "/home/html/django_templates"
+    # or "C:/www/django/templates".
+    # Always use forward slashes, even on Windows.
+    # Don't forget to use absolute paths, not relative paths.
+    os.path.normpath(os.path.join(os.path.dirname(__file__), 'cluster/templates')),
+    CMT_TEMPLATES_DIR,
+)
+
+FIXTURE_DIRS = (
+    # A fixture is a collection of files that contain serialized contents of
+    # the database. (can be used for testing)
+    os.path.normpath(os.path.join(os.path.dirname(__file__), 'fixtures')),
+)
+
+
+INSTALLED_APPS = (
+    'django.contrib.auth',
+    'django.contrib.contenttypes',
+    'django.contrib.sessions',
+    'django.contrib.admin',
+    'django.contrib.databrowse',
+    'django.contrib.webdesign',
+    'sara_cmt.cluster',
+    'django_extensions',
+    'tagging',
+
+    # Only serverside:
+    #'debug_toolbar',
+    #'south',
+)
+
+# Append your IP to use the debug_toolbar
+INTERNAL_IPS = (
+    #'145.100.6.163', # saralt0115
+    '127.0.0.1',
+)
Index: /tags/1.0.0/sara_cmt/sara_cmt/template.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/template.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/template.py	(revision 14193)
@@ -0,0 +1,41 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.template import Template
+
+from sara_cmt.logger import Logger
+logger = Logger().getLogger()
+
+
+class CMTTemplate(Template):
+    """
+        CMTTemplate adds some smart functionalities to the Django Template.
+    """
+
+    def __init__(self, template_string, origin=None, \
+                 name='<Unknown Template>'):
+        """
+            Wraps Template.__init__()
+        """
+        logger.info('Initializing CMT Template')
+        Template.__init__(self, template_string, origin, name)
+
+        logger.info('CMT Template has been initialized')
+
+    def render(self, context):
+        rendered = super(CMTTemplate, self).render(context)
+        return rendered
Index: /tags/1.0.0/sara_cmt/sara_cmt/urls.py
===================================================================
--- /tags/1.0.0/sara_cmt/sara_cmt/urls.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/sara_cmt/urls.py	(revision 14193)
@@ -0,0 +1,76 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from django.conf.urls.defaults import *
+from django.contrib import databrowse
+
+# Uncomment the next two lines to enable the admin:
+from django.contrib import admin
+import sara_cmt.api.urls
+admin.autodiscover()
+
+urlpatterns = patterns('',
+    # Example:
+    # (r'^core/', include('core.foo.urls')),
+
+    # Uncomment the admin/doc line below and add 'django.contrib.admindocs'
+    # to INSTALLED_APPS to enable admin documentation:
+    # (r'^admin/doc/', include('django.contrib.admindocs.urls')),
+
+    # Uncomment the next line to enable the admin:
+    (r'^admin/', include(admin.site.urls)),
+    (r'^db/(.*)', databrowse.site.root),
+
+    # Piston API:
+    (r'^api/', include('sara_cmt.api.urls')),
+
+    # !!! Multiple admin-sites !!!
+    #  http://docs.djangoproject.com/en/dev/ref/contrib/admin/#multiple-admin-sites-in-the-same-urlconf
+)
+
+# core
+from sara_cmt.cluster.models import Cluster, HardwareUnit, Interface, \
+                                    Network, Rack
+databrowse.site.register(Cluster)
+databrowse.site.register(HardwareUnit)
+databrowse.site.register(Interface)
+databrowse.site.register(Network)
+databrowse.site.register(Rack)
+# locations
+from sara_cmt.cluster.models import Country, Address, Room
+databrowse.site.register(Country)
+databrowse.site.register(Address)
+databrowse.site.register(Room)
+# contacts
+from sara_cmt.cluster.models import Company, Telephonenumber, Connection
+databrowse.site.register(Company)
+databrowse.site.register(Telephonenumber)
+databrowse.site.register(Connection)
+# specifications
+from sara_cmt.cluster.models import HardwareModel, Role, InterfaceType
+databrowse.site.register(HardwareModel)
+databrowse.site.register(Role)
+databrowse.site.register(InterfaceType)
+# support
+from sara_cmt.cluster.models import WarrantyContract, WarrantyType
+databrowse.site.register(WarrantyContract)
+databrowse.site.register(WarrantyType)
+
+# tags
+from tagging.models import *
+databrowse.site.register(Tag)
+databrowse.site.register(TaggedItem)
Index: /tags/1.0.0/sara_cmt/setup.py
===================================================================
--- /tags/1.0.0/sara_cmt/setup.py	(revision 14193)
+++ /tags/1.0.0/sara_cmt/setup.py	(revision 14193)
@@ -0,0 +1,117 @@
+#    This file is part of CMT, a Cluster Management Tool made at SARA.
+#    Copyright (C) 2012  Sil Westerveld
+#
+#    This program is free software; you can redistribute it and/or modify
+#    it under the terms of the GNU General Public License as published by
+#    the Free Software Foundation; either version 2 of the License, or
+#    (at your option) any later version.
+#
+#    This program is distributed in the hope that it will be useful,
+#    but WITHOUT ANY WARRANTY; without even the implied warranty of
+#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+#    GNU General Public License for more details.
+#
+#    You should have received a copy of the GNU General Public License
+#    along with this program; if not, write to the Free Software
+#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+
+from distutils.core import setup
+import site
+
+ETC_PREPEND = ''
+
+if site.sys.prefix in [ '/usr', '/' ]:
+    ETC_PREPEND = '/'
+
+setup(
+    name = 'CMT',
+    version = '1.0',
+    description = 'Cluster Management Tool',
+    url = 'http://subtrac.sara.nl/oss/cmt/',
+    #download_url = ''
+    author = 'CMT Development team',
+    author_email = 'cmt-users@lists.osd.sara.nl',
+    license = 'GPL',
+    #long_description = open('README').read(),
+    long_description = 'CMT is a Cluster Management Tool originally created '\
+        'at SARA Computing and Networking Services, which is based in'\
+        'Amsterdam and known as SARA nowadays.',
+
+    platforms = ['linux-x86_64', 'linux-i386' ],
+
+    # see: http://pypi.python.org/pypi?:action=list_classifiers
+    classifiers = [
+        'Development Status :: 5 - Production/Stable',
+        'Environment :: Console',
+        'Environment :: Web Environment',
+        'Framework :: Django',
+        'Intended Audience :: System Administrators',
+        'License ::  OSI Approved :: GNU General Public License (GPL)',
+        'Natural Language :: English',
+        'Operating System :: POSIX :: Linux',
+        'Programming Language :: Python :: 2.6',
+        'Topic :: Database :: Front-Ends',
+        'Topic :: System :: Clustering',
+        'Topic :: System :: System Administration',
+        'Topic :: Utilities',
+    ],
+
+
+
+# http://docs.python.org/distutils/setupscript.html#listing-whole-packages
+    #packages = ['sara_cmt', 'sara_cmt/sara_cmt', 'sara_cmt/sara_cmt.cluster', 'sara_cmt/sara_cmt.cluster.templatetags'],
+    packages = ['sara_cmt', 'sara_cmt.cluster', 'sara_cmt.cluster.templatetags'],
+
+# http://docs.python.org/distutils/setupscript.html#relationships-between-distributions-and-packages
+# Dependencies on other Python modules and packages can be specified by supplying the requires keyword argument to setup(). The value must be a list of strings. Each string specifies a package that is required, and optionally what versions are sufficient.
+#
+    #
+    # Somehow 'requires' doesn't work; dependencies won't be installed
+    #requires = [
+    #    'Python (>=2.6)'
+    #    'Django (>=1.2, <1.3)',
+    #    'IPy (>=0.75)',
+    #    'django_extensions (>=0.4)',
+    #    'django_tagging (>=0.3.1)',
+    #    'psycopg2 (>=2.4.4)',
+    #],
+    install_requires = [
+        'Python>=2.6',
+        'Django>=1.2, <1.3',
+        'IPy>=0.75',
+        'django_extensions>=0.4',
+        'django_tagging>=0.3.1',
+        'psycopg2>=2.4.4'
+    ],
+
+    # http://docs.python.org/distutils/setupscript.html#installing-scripts
+    #
+    #scripts = ['sara_cmt/cmt.py'],
+    scripts = ['bin/cmt'],
+
+    # http://docs.python.org/distutils/setupscript.html#installing-additional-files
+    # The data_files option can be used to specify additional files needed by the module distribution: configuration files, message catalogs, data files, anything which doesn't fit in the previous categories.
+    # data_files specifies a sequence of (directory, files) pairs in the following way:
+    #     data_files=[('bitmaps', ['bm/b1.gif', 'bm/b2.gif']),
+    #             ('/etc/init.d', ['init-script'])]
+    #
+    # NOTE: wildcards aren't accepted here
+    data_files = [
+        # config-files
+        (ETC_PREPEND + 'etc/cmt/', [
+            'etc/cmt.conf.sample',
+            'etc/logging.conf'
+        ]),
+        # empty directory for CMT-templates
+        (ETC_PREPEND + 'etc/cmt/templates', []),
+        # examples of CMT-templates
+        ('share/doc/cmt/templates/examples', [
+            'templates/examples/simple_cnames.cmt',
+            'templates/examples/simple_hostnames.cmt',
+            'templates/examples/simple_dhcpd.conf.cmt',
+            'templates/examples/complex_dns.cmt'
+        ]),
+        # executable
+        ('bin/', ['bin/cmt']),
+    ]
+)
Index: /tags/1.0.0/sara_cmt/templates/examples/complex_dns.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/examples/complex_dns.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/examples/complex_dns.cmt	(revision 14193)
@@ -0,0 +1,115 @@
+{% load cmt_client %}
+{% noblanklines %}
+
+{% epilogue %}
+/bin/echo dummy /usr/bin/test -f /tmp//db.subdomain.example.com.manual || /bin/touch /tmp//db.subdomain.example.com.manual
+/bin/echo dummy /usr/bin/test -f /tmp//db.int.subdomain.example.com.manual || /bin/touch /tmp//db.int.subdomain.example.com.manual
+/bin/echo dummy /usr/bin/test -f /tmp//db.con.subdomain.example.com.manual || /bin/touch /tmp//db.con.subdomain.example.com.manual
+/bin/echo dummy /etc/init.d/named reload
+{% endepilogue %}
+
+{% endnoblanklines %}
+{% store '/tmp/complexdns_db.subdomain.example.com' %}
+{% noblanklines %}
+
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMT
+;
+;               SARA
+; Date        : Fri 6 Jul 2012
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+;
+
+@       IN      SOA     ns1.subdomain.example.com. root.ns1.subdomain.example.com. (
+                                         {% now "YmjH" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      ns1.subdomain.example.com.
+        IN      NS      ns2.subdomain.example.com.
+{% endnoblanklines %}
+
+$INCLUDE db.subdomain.example.com.manual
+
+{% use Network with 'name__contains=gina' as gina_networks %}
+{% for n in gina_networks %}
+  {% assign network_query = 'network__name=' n.name %}
+  {% use interface with network_query as network_interfaces %}
+
+$ORIGIN {{ n.domain }}.
+
+  {% noblanklines %}
+  {% for iface in network_interfaces %}
+
+{{ iface.label }}	IN	A	{{ iface.ip }}
+
+    {% if iface.cnames != None %}
+      {% for cname in iface.cnames %}
+
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+
+      {% endfor %}
+    {% endif %}
+  {% endfor %}
+  {% endnoblanklines %}
+{% endfor %}
+
+{% endstore %}
+
+{% for n in gina_networks %}
+  {% getbasenets n.name as network_basenets %}
+  {% for bnet in network_basenets %}
+
+    {% assign filename = '/tmp/complexdns_db.' bnet %}
+    {% epilogue %}
+
+/bin/echo /usr/bin/test -f {{ filename }}.manual || /bin/touch {{ filename }}.manual
+
+    {% endepilogue %}
+    {% store filename %}
+    {% noblanklines %}
+$TTL 3600
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : Fri 6 Jul 2012
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+@       IN      SOA     ns1.subdomain.example.com. root.ns1.subdomain.example.com. (
+                                         {% now "YmjH" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      ns1.subdomain.example.com.
+        IN      NS      ns2.subdomain.example.com.
+{% endnoblanklines %}
+
+$INCLUDE db.{{ bnet }}.manual
+
+$ORIGIN {{ bnet|arpanize }}.
+
+    {% noblanklines %}
+    {% assign network_query = 'network__name=' n.name %}
+    {% use interface with network_query as network_interfaces %}
+    {% for iface in network_interfaces %}
+      {% if iface.ip|base_net == bnet %}
+
+{{ iface.ip|ip_last_digit }}	IN	PTR	{{ iface.label }}.{{ n.domain }}.
+
+      {% endif %}
+    {% endfor %}
+
+    {% endnoblanklines %}
+    {% endstore %}
+  {% endfor %}
+{% endfor %}
Index: /tags/1.0.0/sara_cmt/templates/examples/simple_cnames.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/examples/simple_cnames.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/examples/simple_cnames.cmt	(revision 14193)
@@ -0,0 +1,33 @@
+# This file is automagicly generated by CMT
+#
+#               SARA
+# Date        : Fri, 6 Jul 2012
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an ISC DHCP v3 configuration file.
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmt_client %}
+
+{% store '/tmp/simple_cnames_example.txt' %}
+
+{% use hardwareunit with 'rack=31' as machines %}
+
+{% noblanklines %}
+{% for machine in machines %}
+{% for iface in machine.interfaces.all %}
+{{ iface }}
+{% if iface.cnames != None %}
+{% for cname in iface.cnames %}
+--> {{ iface }} :CNAME: {{cname}}
+{% endfor %}
+{% endif %}
+{% endfor %}
+{% endfor %}
+{% endnoblanklines %}
+
+{% endstore %}
Index: /tags/1.0.0/sara_cmt/templates/examples/simple_dhcpd.conf.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/examples/simple_dhcpd.conf.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/examples/simple_dhcpd.conf.cmt	(revision 14193)
@@ -0,0 +1,136 @@
+# This file is automagicly generated by CMT
+#
+#               SARA
+# Date        : Fri 6 Jul 2012
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an ISC DHCP v3 configuration file.
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmt_client %}
+
+{% store '/tmp/dhcpd_example.conf' %}
+
+{% epilogue %}
+/bin/echo dummy /etc/init.d/isc-dhcp-server restart
+{% endepilogue %}
+
+{% use network with 'name=lisa admin' as net_lisa_admin %}
+{% use interface with 'network__name=lisa admin' as ifaces_lisa_admin %}
+
+# general options
+authoritative;
+ddns-update-style none;
+
+# RB 3/3/09: Added for kvm switch BOOTP
+#
+always-broadcast on;
+always-reply-rfc1048 on;
+
+# The "host-checking" option is only used by Curtis Zinzilieta's DHCP patch.
+# The patch adds functionality to the server for removing specified host
+# addresses from ranges of available ip addresses at startup.  This addresses
+# the issue where a fixed-address reserved for a specific machine gets
+# assigned to a different machine.
+#
+# If you are running a version of dhcpd with this patch, then you will want
+# the "host-checking" option below to be uncommented.  If you are not running
+# the patched dhcpd, you should leave it commented out.  You can find the patch
+# and the matched DHCP v3.0 source code here:  http://systemimager.org/download/
+#host-checking true;
+# Imageserver
+option option-140 code 140 = text;
+option sali-imgsrv code 224 = ip-address;
+
+# log_server_port
+option option-141 code 141 = unsigned integer 32;
+
+# ssh_download_url
+option option-142 code 142 = string;
+
+# flamethrower_directory_portbase
+option option-143 code 143 = string;
+
+# tmpfs_staging
+option option-144 code 144 = string;
+
+# Sara: option-155 for master script name
+#       option-156 for starting telnetd
+option option-155 code 155 = string;
+option option-156 code 156 = string;
+
+# next-server is your network boot server
+#next-server 10.0.43.45;
+
+# log-servers
+#option log-servers 10.0.43.45;
+
+# option-141 is the port number your log server uses
+#option option-141 514;
+
+# set lease time to infinite (-1)
+default-lease-time -1;
+max-lease-time -1;
+
+# Admin network
+#
+subnet {{net_lisa_admin.netaddress}} netmask {{net_lisa_admin.netmask}} {
+
+
+  option domain-name-servers 192.168.145.38, 192.168.144.50;
+  option domain-name "{{net_lisa_admin.domain}}";
+
+  # option-140 is the IP address of your SystemImager image server
+  option sali-imgsrv 192.168.144.50;
+  next-server 192.168.144.50;
+
+  # option-143 specifies the Flamethrower directory port.
+  # The default is "9000".
+  #option option-143 "9000";
+
+  # Uncomment one of the two following lines.  The first, if you need to
+  # boot i386 clients, or the second for booting ia64 clients.
+  filename "pxelinux.0";   # i386
+
+  #
+  # option-144 tells your autoinstallclient to spool the image into a tmpfs
+  # prior to laying it down on disk.  It is not certain that this is always
+  # a good thing to do.  And if you're feeling gutsy and want to try it, be
+  # sure that your (memory + swap) is at least twice the size of your image
+  # or your image transfer will fail when the tmpfs filesystem gets full!!!
+  # If unsure, say "no".
+  #
+  option option-144 "n";
+
+  # RB: 24 Juni 2004
+  #
+  # option-156, set this to:
+  # - telnetd   to start a small telnetd before executing master script
+
+  option option-156 "telnetd";
+}
+
+group { # Start Admin network (boot) & not extern
+
+    option routers 192.168.144.1;
+
+    {% noblanklines %}
+    {% for iface in ifaces_lisa_admin %}
+    {% if iface.hwaddress != None %}
+        {% if 'externe service' not in iface.host.roles %}
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+        {% endif %}
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+} # End admin network (boot)
+
+{% endstore %}
Index: /tags/1.0.0/sara_cmt/templates/examples/simple_hostnames.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/examples/simple_hostnames.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/examples/simple_hostnames.cmt	(revision 14193)
@@ -0,0 +1,26 @@
+# This file is automagicly generated by CMT
+#
+#               SARA
+# Date        : Fri 6 Jul 2012
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an simple file containing hostnames of all machines in rack 31
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmt_client %}
+
+{% use hardwareunit with 'rack=31' as machines %}
+
+{% store '/tmp/hostnames_example.txt' %}
+
+{% noblanklines %}
+{% for machine in machines %}
+{{ machine.label }}
+{% endfor %}
+{% endnoblanklines %}
+
+{% endstore %}
Index: /tags/1.0.0/sara_cmt/templates/gina/cfrun_hosts.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gina/cfrun_hosts.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gina/cfrun_hosts.cmt	(revision 14193)
@@ -0,0 +1,39 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 27 Jan 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load ramonb_extras %}
+{% use HardwareUnit with 'cluster__name=Gina' as gina_hosts %}
+
+{% getracks 'Gina' as gina_racks %}
+
+{% for r in gina_racks %}
+  {% assign filename = '/usr/sara/etc/cfengine/hosts.' r.label '.in' %}
+
+  {% store filename %}
+  {% noblanklines %}
+
+outputdir=/data/cfengine/output
+maxchild=100
+
+  {% for h in gina_hosts %}
+    {% if h.rack.label == r.label %}
+
+{{ h.label }}
+
+    {% endif %}
+  {% endfor %}
+
+  {% endnoblanklines %}
+  {% endstore %}
+
+{% endfor %}
Index: /tags/1.0.0/sara_cmt/templates/gina/dhcpd.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gina/dhcpd.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gina/dhcpd.cmt	(revision 14193)
@@ -0,0 +1,144 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Fri, 20 Jan 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an ISC DHCP v3 configuration file.
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /etc/dhcpd.conf as output %}
+
+{% epilogue %}
+/etc/init.d/dhcpd restart
+{% endepilogue %}
+
+{% use network with 'name=gina console' as net_gina_console %}
+{% use network with 'name=gina admin' as net_gina_admin %}
+{% use network with 'name=gina productie' as net_gina_productie %}
+{% use interface with 'network__name=gina console' as ifaces_gina_console %}
+{% use interface with 'network__name=gina admin' as ifaces_gina_admin %}
+{% use interface with 'network__name=gina productie' as ifaces_gina_productie %}
+
+{% endnoblanklines %}
+
+authoritative;
+ddns-update-style none;
+
+log-facility local7;
+
+filename "pxelinux.0";
+
+# set lease time to infinite (-1)
+default-lease-time -1;
+max-lease-time -1;
+
+## Support for the SALI and the 'old' imageserver settings
+#
+option option-140 code 140 = text;
+option sali-imgsrv code 224 = ip-address;
+
+# Beheer / intern
+#
+subnet {{net_gina_admin.netaddress}} netmask {{net_gina_admin.netmask}} {
+
+        # TFTP server
+        next-server 192.168.20.9;
+        # SystemImager server
+        option sali-imgsrv 192.168.20.9;
+        option option-140 "192.168.20.9";
+
+        #option routers 192.168.20.1;
+        #option domain-name "int.gina.sara.nl";
+        option domain-name "gina.sara.nl int.gina.sara.nl con.gina.sara.nl";
+        option domain-name-servers 192.168.20.9, 192.168.20.11, 145.100.48.10, 145.100.48.11;
+#       option ntp-servers 192.168.20.9;
+}
+
+# DRAC
+#
+subnet {{net_gina_console.netaddress}} netmask {{net_gina_console.netmask}} {
+
+        option routers 192.168.32.1;
+        #option domain-name "con.gina.sara.nl";
+        option domain-name "gina.sara.nl int.gina.sara.nl con.gina.sara.nl";
+        option domain-name-servers 192.168.33.249;
+        option ntp-servers 192.168.33.249;
+}
+
+# Publiek / productie
+#
+subnet {{net_gina_productie.netaddress}} netmask {{net_gina_productie.netmask}} {
+
+        option routers 145.100.48.1;
+#       option domain-name "gina.sara.nl";
+        option domain-name "gina.sara.nl int.gina.sara.nl con.gina.sara.nl";
+        option domain-name-servers 192.168.20.9, 192.168.20.11, 145.100.48.10, 145.100.48.11;
+#       option ntp-servers 192.168.20.9;
+
+        # Wacht minstens 2 seconden na request
+        # Beheer / intern netwerk moet eerder opkomen
+        #
+        #min-secs 5;
+}
+
+# Beheer / intern
+#
+group {
+    {% noblanklines %}
+    {% for iface in ifaces_gina_admin %}
+      {% if not 'administration' in iface.host.roles %}
+
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+
+      {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+}
+
+# DRAC
+#
+group {
+    {% noblanklines %}
+    {% for iface in ifaces_gina_console %}
+      {% if not 'administration' in iface.host.roles %}
+
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+
+      {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+}
+
+# Publiek / productie
+#
+group {
+    {% noblanklines %}
+    {% for iface in ifaces_gina_productie %}
+      {% if not 'administration' in iface.host.roles %}
+
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+
+      {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+}
Index: /tags/1.0.0/sara_cmt/templates/gina/dns.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gina/dns.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gina/dns.cmt	(revision 14193)
@@ -0,0 +1,120 @@
+{% load ramonb_extras %}
+{% noblanklines %}
+
+{% epilogue %}
+/bin/echo /usr/bin/test -f /var/named/primary/db.gina.sara.nl.manual || /bin/touch /var/named/primary/db.gina.sara.nl.manual
+/usr/bin/test -f /var/named/primary/db.gina.sara.nl.manual || /bin/touch /var/named/primary/db.gina.sara.nl.manual
+/bin/echo /usr/bin/test -f /var/named/primary/db.int.gina.sara.nl.manual || /bin/touch /var/named/primary/db.int.gina.sara.nl.manual
+/usr/bin/test -f /var/named/primary/db.int.gina.sara.nl.manual || /bin/touch /var/named/primary/db.int.gina.sara.nl.manual
+/bin/echo /usr/bin/test -f /var/named/primary/db.con.gina.sara.nl.manual || /bin/touch /var/named/primary/db.con.gina.sara.nl.manual
+/usr/bin/test -f /var/named/primary/db.con.gina.sara.nl.manual || /bin/touch /var/named/primary/db.con.gina.sara.nl.manual
+/bin/echo /etc/init.d/named reload
+/etc/init.d/named reload
+{% endepilogue %}
+
+{% endnoblanklines %}
+{% store '/var/named/primary/db.gina.sara.nl' %}
+{% noblanklines %}
+
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : Jan 24 2011
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+;
+
+@       IN      SOA     ns1.gina.sara.nl. root.ns1.gina.sara.nl. (
+                                         {% now "YmjH" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      ns1.gina.sara.nl.
+        IN      NS      ns2.gina.sara.nl.
+{% endnoblanklines %}
+
+$INCLUDE db.gina.sara.nl.manual
+
+{% use Network with 'name__contains=gina' as gina_networks %}
+{% for n in gina_networks %}
+  {% assign network_query = 'network__name=' n.name %}
+  {% use interface with network_query as network_interfaces %}
+
+$ORIGIN {{ n.domain }}.
+
+  {% noblanklines %}
+  {% for iface in network_interfaces %}
+
+{{ iface.label }}	IN	A	{{ iface.ip }}
+
+    {% if iface.cnames != None %}
+      {% for cname in iface.cnames %}
+
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+
+      {% endfor %}
+    {% endif %}
+  {% endfor %}
+  {% endnoblanklines %}
+{% endfor %}
+
+{% endstore %}
+
+{% for n in gina_networks %}
+  {% getbasenets n.name as network_basenets %}
+  {% for bnet in network_basenets %}
+
+    {% assign filename = '/var/named/primary/db.' bnet %}
+    {% epilogue %}
+
+/bin/echo /usr/bin/test -f {{ filename }}.manual || /bin/touch {{ filename }}.manual
+/usr/bin/test -f {{ filename }}.manual || /bin/touch {{ filename }}.manual
+
+    {% endepilogue %}
+    {% store filename %}
+    {% noblanklines %}
+$TTL 3600
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : Jan 24 2011
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+@       IN      SOA     ns1.gina.sara.nl. root.ns1.gina.sara.nl. (
+                                         {% now "YmjH" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      ns1.gina.sara.nl.
+        IN      NS      ns2.gina.sara.nl.
+{% endnoblanklines %}
+
+$INCLUDE db.{{ bnet }}.manual
+
+$ORIGIN {{ bnet|arpanize }}.
+
+    {% noblanklines %}
+    {% assign network_query = 'network__name=' n.name %}
+    {% use interface with network_query as network_interfaces %}
+    {% for iface in network_interfaces %}
+      {% if iface.ip|base_net == bnet %}
+
+{{ iface.ip|ip_last_digit }}	IN	PTR	{{ iface.label }}.{{ n.domain }}.
+
+      {% endif %}
+    {% endfor %}
+
+    {% endnoblanklines %}
+    {% endstore %}
+  {% endfor %}
+{% endfor %}
Index: /tags/1.0.0/sara_cmt/templates/gina/netbeat.conf.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gina/netbeat.conf.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gina/netbeat.conf.cmt	(revision 14193)
@@ -0,0 +1,36 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 21 Jan 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load cmts_extras %}
+{% epilogue %} #}
+/etc/init.d/netbeat-server restart
+{% endepilogue %}
+{% noblanklines %}
+{% use interface with 'network__name=gina admin' as ifaces_gina_admin %}
+{% use interface with 'network__name=gina productie' as ifaces_gina_productie %}
+{% store /etc/netbeat-server.conf as output %}
+{% for i in ifaces_gina_admin %}
+  {% if not 'administration' in i.host.roles %}
+
+{{ i.ip }} {{ i.fqdn }}
+
+  {% endif %}
+{% endfor %}
+{% for i in ifaces_gina_productie %}
+  {% if not 'administration' in i.host.roles %}
+
+{{ i.ip }} {{ i.fqdn }}
+
+  {% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/gina/shosts.equiv.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gina/shosts.equiv.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gina/shosts.equiv.cmt	(revision 14193)
@@ -0,0 +1,44 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 20 Jan 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine/data/co5/overlay/global/etc/ssh/shosts.equiv as output %}
+
+{% epilogue %}
+/bin/cp --force /data/cfengine/data/co5/overlay/global/etc/ssh/shosts.equiv /data/cfengine/data/sl4/overlay/global/etc/ssh/shosts.equiv
+/bin/cp --force /data/cfengine/data/co5/overlay/global/etc/ssh/shosts.equiv /data/cfengine/data/co6/overlay/global/etc/ssh/shosts.equiv
+{% endepilogue %}
+
+{% use HardwareUnit with 'cluster__name=Gina' as gina_hosts %}
+
+{% for hw in gina_hosts %}
+  {% for i in hw.interfaces.all %}
+    {% if i.network.name == 'gina admin' %}
+
+{{ hw.label }}
+{{ i.fqdn }}
+{{ i.ip }}
+
+    {% endif %}
+    {% if i.network.name == 'gina productie' %}
+
+{{ i.fqdn }}
+{{ i.ip }}
+
+    {% endif %}
+  {% endfor %}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/gina/ssh_known_hosts2.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gina/ssh_known_hosts2.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gina/ssh_known_hosts2.cmt	(revision 14193)
@@ -0,0 +1,44 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 20 Jan 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine/data/co5/overlay/global/etc/ssh/ssh_known_hosts2 as output %}
+
+{% epilogue %}
+/bin/cp --force /data/cfengine/data/co5/overlay/global/etc/ssh/ssh_known_hosts2 /data/cfengine/data/sl4/overlay/global/etc/ssh/ssh_known_hosts2
+/bin/cp --force /data/cfengine/data/co5/overlay/global/etc/ssh/ssh_known_hosts2 /data/cfengine/data/co6/overlay/global/etc/ssh/ssh_known_hosts2
+{% endepilogue %}
+
+{% use HardwareUnit with 'cluster__name=Gina' as gina_hosts %}
+
+install2,install2.int.gina.sara.nl,192.168.20.9 ssh-dss AAAAB3NzaC1kc3MAAACBAPtobv+uQh2oWQHsH5PJ+UwM10e7YizPKsmc7CmM9O2CJflztwlVJXmHaEokAYKTq7Gft9G+C3lCY28teew7vMNWjrABgj9gyS3PF3pUjni+7ZkU8wNS3d7Gqn+FlRFAPYWuQZ5d4bd2aE0f+fdl5zn9oaTNJfzgcTIJ6AhcZJGlAAAAFQCvYWTK1tzwX31AdRvorbMaN3i4bwAAAIAo8oZlSrjzBEZ1Hn4WMAmz+KYLxR+RwnA9p4ttwPLWFVrQizbuTz62MTRf0pwQXLqaePX/QmOOG25LtZJtyR+w0CYrCP0JEZ3O8TjwlfiGfz9Yd3z6g/HczDZRHx1Z+sOLfoRdqN6L1tP2exRlmuBzFKNbfozEnW8cKlhsDEwjdAAAAIEAvNMBOsbaZ8U/L0/879Tsg+XuxiIpwVEep7dkUq7cRAYQz9JveWB1CAqbwHh5mEkJzYhi65bFXKJCdwf3F9zDEZE7U8QRinKreJZJsLw7DQwiv/CUQlaYX/oMOjYk0yrIkdXGu7h6n/L+Q+IQnE5mAp2v/ysuE5pzhkf8RC+FsCM=
+install2,install2.int.gina.sara.nl,192.168.20.9 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAp8fX421hd6y2jV47F+yxCQsefi5KVlDOheX9TztQnlvprY9G4L3DP96FZZW5niBA4LD2ljaDmdC50SsmRLLIVY58l3TtuQl5dExzVpYBoE80cP8EISZW5xXCyrjY/S/1CJWKzoFfu6yBBcMxMWgd9NySNYRIHK3TmIBBBSTmKx7/aQ3GpkuQHcQR19Qq/N5IPd9Fs9hQPvVQwW9yKLKasfDGJYQn9vrAvpDFGZSJHyVnygq4dqsJko8y7Ejs+CYWV3L/JrTEkpIDlAmCW01CKMCkaF8BSjP/R4J6fa7ckgcgO5VfkJGWNHumXGsLK4CVs5FnnzW1ugWL8FoBOaW0LQ==
+
+install,install.int.gina.sara.nl,192.168.20.10 ssh-dss AAAAB3NzaC1kc3MAAACBAILdYa8caEfZ+690ttczmyPwCVh139yHwwRbHqXEjgTZ6oAOm+agoepIzk6fhLcBWFYuMOG0asUiHEFg84eGqiXNuzTKJypWM3T/2QRYFLkwkXm0DvjG1U4MErnkbLrL1jSASqLGDs6qOMZQCcYvmnH0aeQ+EwEUFCP6FDZsBIW3AAAAFQCxM9IbQUhtA3u2WKEMNP49wCJvIQAAAIBHNMpW3cIgviICX8HSewc8ECnqtiKHzR1DoyvCHH1sQhMeUFonde553jgHJSy4guhpKLJcdFOzozEgSwJ7ak8Vfsnc5hs1v1pMYtsOKsiLmgb0RMDT1fAssc9Cx9crBJGPXEyKhERFPTUnTDpTqSXEAPAPm+t97W3zNsGTwNWYrAAAAIAunN9V6uhUYzPtW6iq+bGnjvpPmf9ZPi+hacch2eaLNYl6d36tIwdp8menwA+USr0atmj/Ig5RmyI5zCN3l0724A3RDDMWdw36tHFNoGo9TRajthSz5MPWbdgw7kJuV8ox1MMCbkvwOoDj492zldy6XzmqO798mt7gZedktO2I6A==
+install,install.int.gina.sara.nl,192.168.20.10 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAy4IYMgsEezVAs/jvc7vrUGBeW/ToPYRLQE36hKNzFW0FJRFzXkdheaRENLeP+zfnS050Ojo1SEkd4Q1bYtLP9wwyuiyqsxmvRGEYnMJo7JfnGTJhZAnPRJs7cfu2ZpNQymlR5C+nlm2+ErOy8KG+y9r9O2w1vJ1OxVjhH170SjnILlxMq9Mxpt4FMZGMUxO5KJcwUKXo69/dYBqjhOA46Oik80pVc2Oto41OXlBiwX5j1ksifKP/MVP40O1t7TDKsXdIZmci69mYoDyj5MZkLSpQfEkX38JsmFL48k5CyCWjmGVuZUlFnqt7aNF3/WKbCWilPk9+zkeHBzgbDAr0kQ==
+
+{% for hw in gina_hosts %}
+  {% if "administration" not in hw.roles %}
+    {% for i in hw.interfaces.all %}
+      {% if i.network.name == 'gina admin' or i.network.name == 'gina productie' %}
+
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-dss AAAAB3NzaC1kc3MAAACBAOHg2cXFhM86ZgNYlB9Mk72OUfW1MVN85//nFSmxx7ez10AIUn00Ca+8a/hFwnetM9B3EcMGvN1n3iO2XB0zoiUbuwt9kNOuOE9UJ5r49a7Aqn9di7i5MPO2JNjSmOIOTxl7p0v9HFhSyJky759U8u5aoerTpXPAoW/u6OmU31QdAAAAFQDfKei86IpY0nNjdAn/r6G7O4wSwQAAAIAFnUxosSpfesfge/asghMw+Kd5UVBx5TZlypep4cNkMKKa8SeMf4Wl/u2Mf5ngDlq4+YIY10cATau3ZDk/B/dspJ7JiEpc6vI7f8kLrSN3/lTnpdKDYM0fPZcfER1ulEu6D9gYjkwHe68ryATojCUtTpdQPbIeDyx2KXr9QhQpIgAAAIEAs60zLMGIwFCS+ciannSt+3rZROmZ0ExAh/LvVlmyeLuXUV+ZQW6CgpAw0tR77iTaYJoU/xQgq0C57gnHf981rdh0Xoyf6M2qBNWCSYLDyH3QbSFyu6WVQha1fCXiN/h4Pq6J8TFjTctUc+8wuiWbGLMqFUlZMTZ4idNJrUKRaHA=
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAyNICzOjOG+SdfnnmTZDvkguNFplv4fswU8cSCRYqYz02onrEhbAzRs3TgbRtQPsPVRYIRLkoyu2p9PLDYO+LUiN/gt0kDF93plTiZWLV9pqy3Xynx9lGblCg/Gl5jA0JIzC567bHuUvLHpN/0HRzOgro/27wExyddaW/d3fVND30o91XMtRIFTq8SEvtLx9LJRCAy0sFZH66DqlDCcPutBGlVeooe3HHH+6p42FgDT4NLxhkvFx4TpmeG0y13jxJ+w/rJ+s8eqUDDLbQHpd3w+uMBARyiVWopgU29c7hdH/FMtG01n/4lZ5hs4rG+3ujzZmkBAH9Ss61/q1jYtfQRQ==
+
+      {% endif %}
+    {% endfor %}
+  {% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/gridms/dhcpd.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gridms/dhcpd.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gridms/dhcpd.cmt	(revision 14193)
@@ -0,0 +1,254 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Fri, 13 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an ISC DHCP v3 configuration file.
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /etc/dhcpd.conf as output %}
+
+{% epilogue %}
+/etc/init.d/dhcpd restart
+{% endepilogue %}
+
+{% use network with 'name=CentraalArchief management' as net_ca_mngt %}
+{% use interface with 'network__name=CentraalArchief management' as ifaces_ca_mngt %}
+
+{% endnoblanklines %}
+
+## BEGIN general options
+# Disable ddns
+authoritative;
+ddns-update-style none;
+# Allow boot from network
+allow booting;
+allow bootp;
+
+always-broadcast on;
+always-reply-rfc1048 on;
+
+default-lease-time 604800;
+# define a new option
+option sali-imgsrv code 224 = ip-address;
+## END general options
+
+## BEGIN static config
+# SGI_L2 network
+subnet 10.0.2.0 netmask 255.255.255.0 {
+  host p1r1 {
+    hardware ethernet 08:00:69:11:B0:7D;
+    fixed-address 10.0.2.3;
+  }
+  host p1r2 {
+    hardware ethernet 08:00:69:11:AF:E2;
+    fixed-address 10.0.2.4;
+  }
+  host p2r1 {
+    hardware ethernet 08:00:69:11:AF:A2;
+    fixed-address 10.0.2.5;
+  }
+  host p2r2 {
+    hardware ethernet 08:00:69:11:A0:59;
+    fixed-address 10.0.2.6;
+  }
+  host p3r3 {
+    hardware ethernet 08:00:69:11:B0:15;
+    fixed-address 10.0.2.7;
+  }
+  host p3r4 {
+    hardware ethernet 08:00:69:11:B0:1D;
+    fixed-address 10.0.2.8;
+  }
+  host p4r3 {
+    hardware ethernet 08:00:69:11:AF:F5;
+    fixed-address 10.0.2.9;
+  }
+  host p4r4 {
+    hardware ethernet 08:00:69:11:B0:32;
+    fixed-address 10.0.2.10;
+  }
+  host p5r1 {
+    hardware ethernet 08:00:69:11:AF:FE;
+    fixed-address 10.0.2.11;
+  }
+  host p5r2 {
+    hardware ethernet 08:00:69:11:AF:8B;
+    fixed-address 10.0.2.12;
+  }
+  host p5r3 {
+    hardware ethernet 08:00:69:11:AF:9A;
+    fixed-address 10.0.2.13;
+  }
+  host p5r4 {
+    hardware ethernet 08:00:69:11:B0:7B;
+    fixed-address 10.0.2.14;
+  }
+  host p6r1 {
+    hardware ethernet 08:00:69:11:B0:A1;
+    fixed-address 10.0.2.15;
+  }
+  host p6r2 {
+    hardware ethernet 08:00:69:11:AF:C4;
+    fixed-address 10.0.2.16;
+  }
+  host p6r3 {
+    hardware ethernet 08:00:69:11:B0:9C;
+    fixed-address 10.0.2.17;
+  }
+  host p6r4 {
+    hardware ethernet 08:00:69:11:B5:BE;
+    fixed-address 10.0.2.18;
+  }
+  host p7r1 {
+    hardware ethernet 08:00:69:11:B0:78;
+    fixed-address 10.0.2.19;
+  }
+  host p7r2 {
+    hardware ethernet 08:00:69:11:B0:A4;
+    fixed-address 10.0.2.20;
+  }
+  host p7r3 {
+    hardware ethernet 08:00:69:11:B7:76;
+    fixed-address 10.0.2.21;
+  }
+  host p7r4 {
+    hardware ethernet 08:00:69:11:AF:AA;
+    fixed-address 10.0.2.22;
+  }
+  host p8r1 {
+    hardware ethernet 08:00:69:11:AF:AB;
+    fixed-address 10.0.2.23;
+  }
+  host p8r2 {
+    hardware ethernet 08:00:69:11:B0:8A;
+    fixed-address 10.0.2.24;
+  }
+  host p8r3 {
+    hardware ethernet 08:00:69:11:B0:3F;
+    fixed-address 10.0.2.25;
+  }
+  host p8r4 {
+    hardware ethernet 08:00:69:11:AF:91;
+    fixed-address 10.0.2.26;
+  }
+  host p9r1 {
+    hardware ethernet 08:00:69:11:B7:BF;
+    fixed-address 10.0.2.27;
+  }
+  host p9r2 {
+    hardware ethernet 08:00:69:11:B0:4C;
+    fixed-address 10.0.2.28;
+  }
+  host p9r3 {
+    hardware ethernet 08:00:69:11:A7:C3;
+    fixed-address 10.0.2.29;
+  }
+  host p9r4 {
+    hardware ethernet 08:00:69:11:A7:C4;
+    fixed-address 10.0.2.30;
+  }
+  host p9r11 {
+    hardware ethernet 08:00:69:11:B7:FC;
+    fixed-address 10.0.2.31;
+  }
+  host p9r12 {
+    hardware ethernet 08:00:69:11:AF:A5;
+    fixed-address 10.0.2.32;
+  }
+  host p9r13 {
+    hardware ethernet 08:00:69:11:B0:23;
+    fixed-address 10.0.2.33;
+  }
+  host p9r14 {
+    hardware ethernet 08:00:69:11:A7:CD;
+    fixed-address 10.0.2.34;
+  }
+  host rinus {
+    hardware ethernet 00:50:DA:E9:18:EA;
+    fixed-address 10.0.2.100;
+  }
+}
+#
+# m-network
+#
+subnet 192.168.68.0 netmask 255.255.252.0 {
+  option routers 192.168.68.1;
+  option domain-name-servers 145.100.5.30, 145.100.5.47;
+  option time-servers ntp1.sara.nl;
+  option domain-name "grid.sara.nl";
+  default-lease-time 14400;
+  max-lease-time 172800;
+          	#
+	# pxe stuff for x86_64 dm hosts.
+	#
+  next-server 192.168.68.251; # tftp server.
+  filename = "/pxelinux.0"; # pxelinux image.
+  host m-dm7 {
+    hardware ethernet 00:30:48:C9:C8:7D;
+    fixed-address 192.168.68.234;
+  }
+  host m-dm6 {
+    hardware ethernet 00:30:48:CA:CD:9F;
+    fixed-address 192.168.68.235;
+  }
+  host m-dm5 {
+    hardware ethernet 00:30:48:CA:CC:BD;
+    fixed-address 192.168.68.236;
+  }
+  host m-dm4 {
+    hardware ethernet 00:30:48:C9:C8:6B;
+    fixed-address 192.168.68.237;
+  }
+          	#
+	# pxe stuff for ia64 hosts.
+	#
+  host m-a2 {
+    next-server 192.168.68.251; # tftp server.
+    filename = "ia64/elilo.efi";
+    hardware ethernet 08:00:69:13:E6:99;
+    fixed-address 192.168.68.242;
+  }
+  host m-a3 {
+    next-server 192.168.68.251; # tftp server.
+    filename = "ia64/elilo.efi";
+    hardware ethernet 08:00:69:13:E6:2F;
+    fixed-address 192.168.68.243;
+  }
+}
+## END static config
+
+## BEGIN 
+# m-ca network
+subnet {{ net_ca_mngt.netaddress }} netmask {{ net_ca_mngt.netmask }} {
+  option domain-name "{{ net_ca_mngt.domain }}";
+  option domain-name-servers {{ net_ca_mngt.gateway }};
+  option routers {{ net_ca_mngt.gateway }};
+
+  default-lease-time 14400;
+  max-lease-time 172800;
+
+  next-server {{ net_ca_mngt.gateway }};
+  option sali-imgsrv {{ net_ca_mngt.gateway }};
+
+  filename "pxelinux.0";
+}
+# hosts
+group {
+    {% noblanklines %}{% for iface in ifaces_ca_mngt %}
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+    {% endfor %}{% endnoblanklines %}
+}
+## END
Index: /tags/1.0.0/sara_cmt/templates/gridms/interfaces.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/gridms/interfaces.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/gridms/interfaces.cmt	(revision 14193)
@@ -0,0 +1,39 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Fri, 13 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an ISC DHCP v3 configuration file.
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+# 
+{% load cmts_extras %}{% noblanklines %}
+{% store /data/sali/config/network/interfaces as output %}
+
+{% use interface with 'network__name=CentraalArchief management' as ifaces_ca_mngt %}
+#eth0
+{% for iface in ifaces_ca_mngt %}
+eth0 {{ iface.host.label }} {{ iface.ip }} {{ iface.netmask }}
+{% endfor %}
+
+{% use interface with 'network__name=CentraalArchief update' as ifaces_ca_update %}
+#eth0.870
+{% for iface in ifaces_ca_update %}
+eth0.870 {{ iface.host.label }} {{ iface.ip }} {{ iface.netmask }}
+{% endfor %}
+
+{% use interface with 'label=cxfs-reset.c-ca' as ifaces_ca_dmf %}
+#eth1 alleen dmf
+eth1 {{ ifaces_ca_dmf.host.label }} {{ ifaces_ca_dmf.ip }} {{ iface.netmask }}
+
+{% use interface with 'network__name=CentraalArchief cxfs' as ifaces_ca_cxfs %}
+#eth2
+{% for iface in ifaces_ca_cxfs %}
+eth2 {{ iface.host.label }} {{ iface.ip }} {{ iface.netmask }}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.gpu.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.gpu.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.gpu.cmt	(revision 14193)
@@ -0,0 +1,51 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine3/cf-runagent/hosts.gpu as output %}
+{% use HardwareUnit with 'cluster__name=GPU' as gpu_hosts %}
+
+#{% epilogue %}
+#/usr/bin/scp /usr/sara/etc/cfengine3/hosts.lisa cfengine3:/data/cfengine3/cf-runagent
+#{% endepilogue %}
+
+
+body runagent control
+{
+        any::
+                # Hack else we can not use it. Lisa cluster has the same keys for
+                # compute nodes.
+                #
+                trustkey         	=> "true";
+                max_children     	=> "9"; 
+                background_children 	=> "true";
+
+                output_to_file   	=> "true";
+                output_directory 	=> "/var/log/cf-runagent/gpu";
+
+                hosts => {
+{% for hw in gpu_hosts %}
+	{% if "GPU node" in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' %}
+                         "{{ i.fqdn }}",
+
+            {% endif %}
+        {% endfor %}
+    {% endif %}
+{% endfor %}
+                };
+}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.interne-server.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.interne-server.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.interne-server.cmt	(revision 14193)
@@ -0,0 +1,51 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine3/cf-runagent/hosts.interne-server as output %}
+{% use HardwareUnit with 'cluster__name=OSD-server' as hosts %}
+
+#{% epilogue %}
+#/usr/bin/scp /usr/sara/etc/cfengine3/hosts.lisa cfengine3:/data/cfengine3/cf-runagent
+#{% endepilogue %}
+
+body runagent control
+{
+        any::
+                # Hack else we can not use it. cluster has the same keys for
+                # all nodes.
+                #
+                trustkey         	=> "true";
+                max_children     	=> "40"; 
+                background_children 	=> "true";
+
+                output_to_file   	=> "true";
+                output_directory 	=> "/var/log/cf-runagent/interne-server";
+
+                hosts => {
+{% for hw in hosts %}
+  {% for i in hw.interfaces.all %}
+    {% if i.network.name == 'lisa admin' %}
+      {% if "cfengine3" in hw.roles %} 
+
+                         "{{ i.fqdn }}",
+
+      {% endif %}
+    {% endif %}
+  {% endfor %}
+{% endfor %}
+                };
+}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.lisa.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.lisa.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/cf-runagent.lisa.cmt	(revision 14193)
@@ -0,0 +1,51 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine3/cf-runagent/hosts.lisa as output %}
+{% use HardwareUnit with 'cluster__name=Lisa' as lisa_hosts %}
+
+#{% epilogue %}
+#/usr/bin/scp /usr/sara/etc/cfengine3/hosts.lisa cfengine3:/data/cfengine3/cf-runagent
+#{% endepilogue %}
+
+body runagent control
+{
+    any::
+        # Hack else we can not use it. Lisa cluster has the same keys for
+        # compute nodes.
+        #
+        trustkey         	=> "true";
+        max_children     	=> "40"; 
+        background_children 	=> "true";
+
+        output_to_file   	=> "true";
+        output_directory 	=> "/var/log/cf-runagent/lisa";
+
+        hosts => {
+{% for hw in lisa_hosts %}
+  {% for i in hw.interfaces.all %}
+    {% if i.network.name == 'lisa admin' %}
+      {% if "computenode" in hw.roles or "loginnode" in hw.roles or "software node" in hw.roles or "batchsystem" in hw.roles %} 
+
+            "{{ i.fqdn }}",
+
+      {% endif %}
+    {% endif %}
+  {% endfor %}
+{% endfor %}
+        };
+}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.cua.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.cua.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.cua.cmt	(revision 14193)
@@ -0,0 +1,31 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /usr/sara/etc/cfengine/rc.hosts.cua as output %}
+{# {% store /var/tmp/rc.hosts.cua as output %} #}
+{% use HardwareUnit with 'cluster__name=LDAP/CUA' as cua_hosts %}
+
+outputdir=/data/cfengine/output/cua
+maxchild=8
+
+{% for hw in cua_hosts %}
+	{% for i in hw.interfaces.all %}
+		{% if i.network.name == 'cua' %}
+{{ i.fqdn }}
+		{% endif %}
+	{% endfor %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.fileservers.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.fileservers.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.fileservers.cmt	(revision 14193)
@@ -0,0 +1,33 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /usr/sara/etc/cfengine/rc.hosts.fileservers as output %}
+{# {% store /var/tmp/rc.hosts.fileservers as output %} #}
+{% use HardwareUnit with 'cluster__name=Lisa' as lisa_hosts %}
+
+outputdir=/data/cfengine/output/fileservers
+maxchild=8
+
+{% for hw in lisa_hosts %}
+	{% if "fileserver" in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' %}
+{{ i.fqdn }}
+			{% endif %}
+		{% endfor %}
+	{% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.hpcserver.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.hpcserver.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/cfrun_hosts.hpcserver.cmt	(revision 14193)
@@ -0,0 +1,43 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /usr/sara/etc/cfengine/rc.hosts.hpcserver as output %}
+{# {% store /var/tmp/rc.hosts.hpcserver as output %} #}
+{% use HardwareUnit with 'cluster__name=HPCV intern' as hpcvi_hosts %}
+{% use HardwareUnit with 'cluster__name=HPCV projects' as hpcvp_hosts %}
+
+outputdir=/data/cfengine/output/hpcserver
+maxchild=8
+
+{% for hw in hpcvi_hosts %}
+	{% if "switch" not in hw.roles and "inactive" not in hw.roles and "cfengine3" not in hw.roles and "nocfengine" not in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' %}
+{{ i.fqdn }}
+			{% endif %}
+		{% endfor %}
+	{% endif %}
+{% endfor %}
+{% for hw in hpcvp_hosts %}
+	{% if "switch" not in hw.roles and "inactive" not in hw.roles and "cfengine3" not in hw.roles and "nocfengine" not in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' %}
+{{ i.fqdn }}
+			{% endif %}
+		{% endfor %}
+	{% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/dhcpd.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/dhcpd.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/dhcpd.cmt	(revision 14193)
@@ -0,0 +1,305 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Fri, 13 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : This is an ISC DHCP v3 configuration file.
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /etc/dhcp/dhcpd.conf as output %}
+
+{% epilogue %}
+/etc/init.d/isc-dhcp-server restart
+{% endepilogue %}
+
+{% use network with 'name=lisa consoles' as net_lisa_consoles %}
+{% use network with 'name=icua' as net_icua %}
+{% use network with 'name=lisa admin' as net_lisa_admin %}
+{% use network with 'name=lisa switches' as net_lisa_switches %}
+{% use network with 'name=cua' as net_cua %}
+{% use interface with 'network__name=cua' as ifaces_cua %}
+{% use interface with 'network__name=lisa switches' as ifaces_lisa_switches %}
+{% use interface with 'network__name=lisa admin' as ifaces_lisa_admin %}
+{% use interface with 'network__name=lisa extern' as ifaces_lisa_extern %}
+{% use interface with 'network__name=lisa consoles' as ifaces_lisa_consoles %}
+{% use interface with 'network__name=icua' as ifaces_icua %}
+
+{% endnoblanklines %}
+
+# general options
+authoritative;
+ddns-update-style none;
+
+# RB 3/3/09: Added for kvm switch BOOTP
+#
+always-broadcast on;
+always-reply-rfc1048 on;
+
+# The "host-checking" option is only used by Curtis Zinzilieta's DHCP patch.
+# The patch adds functionality to the server for removing specified host
+# addresses from ranges of available ip addresses at startup.  This addresses
+# the issue where a fixed-address reserved for a specific machine gets
+# assigned to a different machine.
+#
+# If you are running a version of dhcpd with this patch, then you will want
+# the "host-checking" option below to be uncommented.  If you are not running
+# the patched dhcpd, you should leave it commented out.  You can find the patch
+# and the matched DHCP v3.0 source code here:  http://systemimager.org/download/
+#host-checking true;
+# Imageserver
+option option-140 code 140 = text;
+option sali-imgsrv code 224 = ip-address;
+
+# log_server_port
+option option-141 code 141 = unsigned integer 32;
+
+# ssh_download_url
+option option-142 code 142 = string;
+
+# flamethrower_directory_portbase
+option option-143 code 143 = string;
+
+# tmpfs_staging
+option option-144 code 144 = string;
+
+# Sara: option-155 for master script name
+#       option-156 for starting telnetd
+option option-155 code 155 = string;
+option option-156 code 156 = string;
+
+# next-server is your network boot server
+#next-server 10.0.43.45;
+
+# log-servers
+#option log-servers 10.0.43.45;
+
+# option-141 is the port number your log server uses
+#option option-141 514;
+
+# set lease time to infinite (-1)
+default-lease-time -1;
+max-lease-time -1;
+
+# Console/Drac network
+#
+subnet {{net_lisa_consoles.netaddress}} netmask {{net_lisa_consoles.netmask}} {
+  option domain-name-servers 192.168.136.2;
+  option routers 192.168.136.1;
+}
+
+# Console/icua network for LDAP servers
+#
+subnet {{net_icua.netaddress}} netmask {{net_icua.netmask}} {
+  option domain-name-servers 192.168.221.10;
+  option routers 192.168.221.1;
+}
+
+# Admin network
+#
+subnet {{net_lisa_admin.netaddress}} netmask {{net_lisa_admin.netmask}} {
+  #option domain-name-servers 192.168.16.3;
+  option domain-name-servers 192.168.145.37, 192.168.144.50;
+  option domain-name "irc.sara.nl";
+
+  # option-140 is the IP address of your SystemImager image server
+  option sali-imgsrv 192.168.144.50;
+  next-server 192.168.144.50;
+
+  # option-143 specifies the Flamethrower directory port.
+  # The default is "9000".
+  #option option-143 "9000";
+
+  # Uncomment one of the two following lines.  The first, if you need to
+  # boot i386 clients, or the second for booting ia64 clients.
+  filename "pxelinux.0";   # i386
+
+  #
+  # option-144 tells your autoinstallclient to spool the image into a tmpfs
+  # prior to laying it down on disk.  It is not certain that this is always
+  # a good thing to do.  And if you're feeling gutsy and want to try it, be
+  # sure that your (memory + swap) is at least twice the size of your image
+  # or your image transfer will fail when the tmpfs filesystem gets full!!!
+  # If unsure, say "no".
+  #
+  option option-144 "n";
+
+  # RB: 24 Juni 2004
+  #
+  # option-156, set this to:
+  # - telnetd   to start a small telnetd before executing master script
+
+  option option-156 "telnetd";
+}
+
+# Switches network, Bas van der Vlies, 21-Feb-2012 (not needed anymore)
+# administration is done by Network engineers
+#
+subnet {{net_lisa_switches.netaddress}} netmask {{net_lisa_switches.netmask}} {
+  option domain-name-servers 192.168.168.2 ;
+  option routers 192.168.168.1;
+
+  # option-140 is the IP address of your SystemImager image server
+  # option option-140 "192.168.136.2";
+
+  # option-143 specifies the Flamethrower directory port.
+  # The default is "9000".
+  # option option-143 "9000";
+
+  #
+  # option-144 tells your autoinstallclient to spool the image into a tmpfs
+  # prior to laying it down on disk.  It is not certain that this is always
+  # a good thing to do.  And if you're feeling gutsy and want to try it, be
+  # sure that your (memory + swap) is at least twice the size of your image
+  # or your image transfer will fail when the tmpfs filesystem gets full!!!
+  # If unsure, say "no".
+  #
+  # option option-144 "n";
+
+  # RB: 24 Juni 2004
+  #
+  # option-156, set this to:
+  # - telnetd   to start a small telnetd before executing master script
+  # option option-156 "telnetd";
+}
+
+# Cua network
+#
+subnet {{net_cua.netaddress}} netmask {{net_cua.netmask}} {
+  #option domain-name-servers 192.168.16.3;
+  option domain-name-servers 145.100.5.30, 145.100.5.45;
+  option routers 145.100.5.65;
+
+  # The IP address of your SystemImager image server
+  option sali-imgsrv 145.100.5.67;
+  next-server 145.100.5.67;
+
+  # Uncomment one of the two following lines.  The first, if you need to
+  # boot i386 clients, or the second for booting ia64 clients.
+  filename "pxelinux.0";   # i386
+
+  #
+  # option-144 tells your autoinstallclient to spool the image into a tmpfs
+  # prior to laying it down on disk.  It is not certain that this is always
+  # a good thing to do.  And if you're feeling gutsy and want to try it, be
+  # sure that your (memory + swap) is at least twice the size of your image
+  # or your image transfer will fail when the tmpfs filesystem gets full!!!
+  # If unsure, say "no".
+  #
+  option option-144 "n";
+
+}
+
+group { # Start Cua network 
+	option domain-name "{{net_cua.domain}}";
+
+    {% noblanklines %}
+    {% for iface in ifaces_cua %}
+    {% if iface.hwaddress != None %}
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+
+} # End cua network 
+
+group { # Start switches
+	option domain-name "{{net_lisa_switches.domain}}";
+	option option-155 "rc_dell";
+
+    {% noblanklines %}
+    {% for iface in ifaces_lisa_switches %}
+    {% if iface.hwaddress != None %}
+    host {{iface.fqdn}} {
+        filename "";
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+} # End switches
+
+group { # Start Admin network (boot) & not extern
+	option domain-name "{{net_lisa_admin.domain}}";
+	option option-155 "rc_dell_ng";
+	option routers 192.168.144.1;
+
+    {% noblanklines %}
+    {% for iface in ifaces_lisa_admin %}
+    {% if iface.hwaddress != None %}
+        {% if 'externe service' not in iface.host.roles %}
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+        {% endif %}
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+} # End admin network (boot)
+
+group { # Start Admin network (boot) & extern
+	option domain-name "{{net_lisa_admin.domain}}";
+	option option-155 "rc_dell_ng";
+
+    {% noblanklines %}
+    {% for iface in ifaces_lisa_admin %}
+    {% if iface.hwaddress != None %}
+        {% if 'externe service' in iface.host.roles %}
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+        {% endif %}
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+} # End admin network (boot)
+
+group { # Start Console/Drac network
+	option domain-name "{{net_lisa_consoles.domain}}";
+
+    {% noblanklines %}
+    {% for iface in ifaces_lisa_consoles %}
+    {% if iface.hwaddress != None %}
+    host {{iface.fqdn}} {
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+} # End Console/Drac network
+
+group { # Start Console/icua network
+	option domain-name "{{icua.domain}}";
+
+    {% noblanklines %}
+    {% for iface in ifaces_icua %}
+    {% if iface.hwaddress != None %}
+    host {{iface.fqdn}} {
+        filename "";
+        hardware ethernet {{iface.hwaddress}};
+        fixed-address {{iface.ip}};
+        option host-name "{{iface.fqdn}}";
+    }
+    {% endif %}
+    {% endfor %}
+    {% endnoblanklines %}
+} # End Console/icua network
Index: /tags/1.0.0/sara_cmt/templates/lisa/dns-icua.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/dns-icua.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/dns-icua.cmt	(revision 14193)
@@ -0,0 +1,47 @@
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : August 17 2010
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+;
+{% load cmts_extras %}
+{# {% store /usr/sara/etc/dns.nodes as output %} #}
+{% store /etc/bind/prim/db.icua.sara.nl as output %}
+{% noblanklines %}
+
+{% epilogue %}
+/usr/sara/sbin/bind.sh {{output}}
+{% endepilogue %}
+{% epilogue %}
+/etc/init.d/bind9 restart
+{% endepilogue %}
+
+{% use interface with 'network__name=icua' as ifaces_icua %}
+
+@       IN      SOA     ns.irc.sara.nl. root.ns.irc.sara.nl. (
+                                           {% now "ymdHi" %} ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      ns.irc.sara.nl.
+        IN      NS      ns2.irc.sara.nl.
+{% endnoblanklines %}
+
+$INCLUDE {{output}}.manual
+
+{% noblanklines %}
+{% for iface in ifaces_icua %}
+{{ iface.label }} IN  A       {{ iface.ip }}
+{% if iface.cnames != None %}
+{% for cname in iface.cnames %}
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+{% endfor %}
+{% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/dns-irc.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/dns-irc.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/dns-irc.cmt	(revision 14193)
@@ -0,0 +1,77 @@
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : August 17 2010
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+;
+{% load cmts_extras %}
+{# {% store /var/tmp/dns.nodes as output %} #}
+{% store /etc/bind/prim/db.irc.sara.nl as output %}
+{% noblanklines %}
+
+{% epilogue %}
+/usr/sara/sbin/bind.sh {{output}}
+{% endepilogue %}
+{% epilogue %} #}
+/etc/init.d/bind9 restart
+{% endepilogue %}
+
+{% use interface with 'network__name=lisa consoles' as ifaces_lisa_consoles %}
+{% use interface with 'network__name=lisa admin' as ifaces_lisa_admin %}
+{% use interface with 'network__name=lisa infiniband' as ifaces_lisa_infiniband %}
+{% use interface with 'network__name=lisa switches' as ifaces_lisa_switches %}
+
+@       IN      SOA     ns.irc.sara.nl. root.ns.irc.sara.nl. (
+                                         {% now "ymdHi" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      ns.irc.sara.nl.
+        IN      NS      ns2.irc.sara.nl.
+{% endnoblanklines %}
+
+$INCLUDE {{output}}.manual
+
+{% noblanklines %}
+{% for iface in ifaces_lisa_admin %}
+{{ iface.label }}	IN	A	{{ iface.ip }}
+{% if iface.cnames != None %}
+{% for cname in iface.cnames %}
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+{% endfor %}
+{% endif %}
+{% endfor %}
+
+{% for iface in ifaces_lisa_consoles %}
+{{ iface.label }}	IN	A	{{ iface.ip }}
+{% if iface.cnames != None %}
+{% for cname in iface.cnames %}
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+{% endfor %}
+{% endif %}
+{% endfor %}
+
+{% for iface in ifaces_lisa_infiniband %}
+{{ iface.label }}	IN	A	{{ iface.ip }}
+{% if iface.cnames != None %}
+{% for cname in iface.cnames %}
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+{% endfor %}
+{% endif %}
+{% endfor %}
+
+{% for iface in ifaces_lisa_switches %}
+{{ iface.label }}	IN	A	{{ iface.ip }}
+{% if iface.cnames != None %}
+{% for cname in iface.cnames %}
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+{% endfor %}
+{% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/dontrun_dns-osd.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/dontrun_dns-osd.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/dontrun_dns-osd.cmt	(revision 14193)
@@ -0,0 +1,119 @@
+{% load ramonb_extras %}
+{% noblanklines %}
+
+{% epilogue %}
+/bin/echo /usr/bin/test -f /etc/bind/prim/db.osd.sara.nl.manual || /bin/touch /etc/bind/prim/db.osd.sara.nl.manual
+/usr/bin/test -f /etc/bind/prim/db.osd.sara.nl.manual || /bin/touch /etc/bind/prim/db.osd.sara.nl.manual
+/bin/echo /usr/bin/test -f /etc/bind/prim/db.int.osd.sara.nl.manual || /bin/touch /etc/bind/prim/db.int.osd.sara.nl.manual
+/usr/bin/test -f /etc/bind/prim/db.int.osd.sara.nl.manual || /bin/touch /etc/bind/prim/db.int.osd.sara.nl.manual
+/bin/echo /usr/bin/test -f /etc/bind/prim/db.con.osd.sara.nl.manual || /bin/touch /etc/bind/prim/db.con.osd.sara.nl.manual
+/usr/bin/test -f /etc/bind/prim/db.con.osd.sara.nl.manual || /bin/touch /etc/bind/prim/db.con.osd.sara.nl.manual
+/bin/echo /etc/init.d/bind9 reload
+/etc/init.d/bind9 reload
+{% endepilogue %}
+
+{% endnoblanklines %}
+{% store '/etc/bind/prim/db.osd.sara.nl' %}
+{% noblanklines %}
+
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : Jan 24 2011
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+;
+
+@       IN      SOA     install2.lisa.sara.nl. root.install2.lisa.sara.nl. (
+                                         {% now "ymdHi" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      nsauth1.sara.nl.
+        IN      NS      nsauth2.sara.nl.
+{% endnoblanklines %}
+
+$INCLUDE /etc/bind/prim/db.osd.sara.nl.manual
+
+{% use Network with 'name__contains=osd' as osd_networks %}
+{% for n in osd_networks %}
+  {% assign network_query = 'network__name=' n.name %}
+  {% use interface with network_query as network_interfaces %}
+
+$ORIGIN {{ n.domain }}.
+
+  {% noblanklines %}
+  {% for iface in network_interfaces %}
+
+{{ iface.label }}	IN	A	{{ iface.ip }}
+
+    {% if iface.cnames != None %}
+      {% for cname in iface.cnames %}
+
+{{cname}} 	IN 	CNAME 	{{ iface.label }}
+
+      {% endfor %}
+    {% endif %}
+  {% endfor %}
+  {% endnoblanklines %}
+{% endfor %}
+
+{% endstore %}
+
+{% for n in osd_networks %}
+  {% getbasenets n.name as network_basenets %}
+  {% for bnet in network_basenets %}
+
+    {% assign filename = '/etc/bind/prim/db.' bnet %}
+    {% epilogue %}
+
+/bin/echo /usr/bin/test -f {{ filename }}.manual || /bin/touch {{ filename }}.manual
+/usr/bin/test -f {{ filename }}.manual || /bin/touch {{ filename }}.manual
+
+    {% endepilogue %}
+    {% store filename %}
+    {% noblanklines %}
+$TTL 3600
+;
+; SVN: {{ svn_id }}
+;      {{ svn_url }}
+;
+; This file is automagically generated by CMTSARA
+;
+;             SARA - Computing and Networking Services
+; Date        : Jan 24 2011
+; Version     : {{ version }}
+; Generated   : {% now "r" %}
+@       IN      SOA     install2.lisa.sara.nl. root.install2.lisa.sara.nl. (
+                                         {% now "ymdHi" %}   ; Serial
+                                        7200            ; Refresh
+                                        600             ; Retry
+                                        604800          ; Expire
+                                        86400 )         ; Minimum
+        IN      NS      install2.lisa.sara.nl.
+{% endnoblanklines %}
+
+$INCLUDE /etc/bind/prim/db.{{ bnet }}.manual
+
+$ORIGIN {{ bnet|arpanize }}.
+
+    {% noblanklines %}
+    {% assign network_query = 'network__name=' n.name %}
+    {% use interface with network_query as network_interfaces %}
+    {% for iface in network_interfaces %}
+      {% if iface.ip|base_net == bnet %}
+
+{{ iface.ip|ip_last_digit }}	IN	PTR	{{ iface.label }}.{{ n.domain }}.
+
+      {% endif %}
+    {% endfor %}
+
+    {% endnoblanklines %}
+    {% endstore %}
+  {% endfor %}
+{% endfor %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/netbeat.conf.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/netbeat.conf.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/netbeat.conf.cmt	(revision 14193)
@@ -0,0 +1,24 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% epilogue %} #}
+/etc/init.d/netbeat-server restart
+{% endepilogue %}
+{% noblanklines %}
+{% use interface with 'network__name=lisa admin' as ifaces_lisa_admin %}
+{% store /etc/netbeat-server.conf as output %}
+{% for i in ifaces_lisa_admin %}
+{{ i.fqdn }}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/pssh_gpu_hosts.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/pssh_gpu_hosts.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/pssh_gpu_hosts.cmt	(revision 14193)
@@ -0,0 +1,26 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Thu, 24 Mar 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : Parallell SSH file for the nodes in Lisa
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /usr/sara/etc/pssh/gpu as output %}
+{% use Interface with 'network__name=lisa admin' as admin_interfaces %}
+
+{% for i in admin_interfaces %}
+  {% if i.host.cluster.name = 'GPU' and 'inactive' not in i.host.roles %}
+gb-{{ i.host.label }}.irc.sara.nl
+  {% endif %}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/pssh_ib_hosts.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/pssh_ib_hosts.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/pssh_ib_hosts.cmt	(revision 14193)
@@ -0,0 +1,26 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Thu, 24 Mar 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : Parallell SSH file for the infiniband nodes in Lisa
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /usr/sara/etc/pssh/infiniband as output %}
+{% use Interface with 'network__name=lisa infiniband' as ib_interfaces %}
+
+{% for i in ib_interfaces %}
+  {% if i.host.cluster.name = 'Lisa' and 'computenode' in i.host.roles and 'inactive' not in i.host.roles %}
+gb-{{ i.host.label }}.irc.sara.nl
+  {% endif %}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/pssh_lisa_hosts.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/pssh_lisa_hosts.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/pssh_lisa_hosts.cmt	(revision 14193)
@@ -0,0 +1,26 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Thu, 24 Mar 2011
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description : Parallell SSH file for the nodes in Lisa
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /usr/sara/etc/pssh/lisa as output %}
+{% use Interface with 'network__name=lisa admin' as admin_interfaces %}
+
+{% for i in admin_interfaces %}
+  {% if i.host.cluster.name = 'Lisa' and 'computenode' in i.host.roles and 'inactive' not in i.host.roles %}
+gb-{{ i.host.label }}.irc.sara.nl
+  {% endif %}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.clearspeed.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.clearspeed.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.clearspeed.cmt	(revision 14193)
@@ -0,0 +1,32 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine/data/method/config_ssh/keys/clearspeed/shosts.equiv as output %}
+{# {% store /var/tmp/shosts.equiv.clearspeed as output %} #}
+{% use HardwareUnit with 'cluster__name=Clearspeed' as clearspeed_hosts %}
+
+{% for hw in clearspeed_hosts %}
+	{% if "computenode" in hw.roles or "loginnode" in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' or i.network.name == 'lisa infiniband' %}
+{{ i.fqdn }}
+{{ i.ip }}
+			{% endif %}
+		{% endfor %}
+	{% endif %}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.gpu.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.gpu.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.gpu.cmt	(revision 14193)
@@ -0,0 +1,31 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine/data/method/config_ssh/keys/gpu/shosts.equiv as output %}
+{# {% store /var/tmp/shosts.equiv.gpu as output %} #}
+{% use HardwareUnit with 'cluster__name=GPU' as gpu_hosts %}
+
+{% for hw in gpu_hosts %}
+	{% if "GPU node" in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' or i.network.name == 'lisa infiniband' %} 
+{{ i.fqdn }}
+{{ i.ip }}
+			{% endif %}
+		{% endfor %}
+	{% endif %}
+{% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.lisa.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.lisa.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/shosts.equiv.lisa.cmt	(revision 14193)
@@ -0,0 +1,40 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+{% store /data/cfengine/data/method/config_ssh/keys/lisa/shosts.equiv as output %}
+{% epilogue %}
+/usr/bin/scp /data/cfengine/data/method/config_ssh/keys/lisa/shosts.equiv cfengine3:/data/cfengine3/data/bundles/ssh/lisa/etc/ssh/
+{% endepilogue %}
+
+{% use HardwareUnit with 'cluster__name=Lisa' as lisa_hosts %}
+{# {% store /var/tmp/shosts.equiv.lisa as output %} #}
+    {% for hw in lisa_hosts %}
+            {% for i in hw.interfaces.all %}
+                {% if i.network.name == 'lisa admin' and "PowerEdge" in hw.specifications.name and "computenode" in hw.roles or i.network.name == 'lisa admin' and "PowerEdge 1950" in hw.specifications.name and "loginnode" in hw.roles %} 
+{{ i.fqdn }}
+{{ i.ip }}
+                {% endif %}
+            {% endfor %}
+    {% endfor %}
+    {% for hw in lisa_hosts %}
+            {% for i in hw.interfaces.all %}
+                {% if i.network.name == 'lisa infiniband' and "PowerEdge" in hw.specifications.name and "computenode" in hw.roles or i.network.name == 'lisa admin' and "PowerEdge 1950" in hw.specifications.name and "loginnode" in hw.roles %}
+{{ i.fqdn }}
+{{ i.ip }}
+                {% endif %}
+            {% endfor %}
+    {% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/ssh_known_hosts2.gpu.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/ssh_known_hosts2.gpu.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/ssh_known_hosts2.gpu.cmt	(revision 14193)
@@ -0,0 +1,38 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+{# {% store /var/tmp/ssh_known_hosts2.gpu as output %} #}
+{% store /data/cfengine/data/method/config_ssh/keys/gpu/ssh_known_hosts2 as output %}
+{% use HardwareUnit with 'cluster__name=GPU' as gpu_hosts %}
+
+# New boot keys
+boot,boot.irc.sara.nl,192.168.146.10 ssh-dss AAAAB3NzaC1kc3MAAACBAKfK3Q08f+2xIF6bTdbLWCvtC8V+gV00wERk5FjzkkUOVBHFxN32tc3Wyro389RZ3Iq6E7A3pj8M+ze2uYL8xenelLk4JX2uapaRXRGqBRX98RdeMuKcXxz4GkiKFAGBulOI8kA0g6Sf2jhlpl416RGVZ1Iv3DpmXe8nXAdsWL/lAAAAFQCypUSocTN/fkOyVEnOKw+meo/NlQAAAIB9P5jECPKwreVqHmup4BcFae/vQ14XWCR3+ATodSgKDSLg+LexZPuPGL1PXq0rOx7ZKIXIFu8/F67RiT1W4WTLt9QqZNPHZdra6YGhv5Tryv0p0H4ENgNj9TSCiS8hUMFurbaeFHLtv9xpe9XDeaEby+Ms6AqIABhmfYsvMDYzdQAAAIBWzWV2axklCSbM8vrknNFH7pPBRnzrPWwNsdPqFzIgrjEzqiScIfQEbyfCLYKfEWA6A91y7DQBygWyuAiL9OA/2M3Qu8wUU9C94lHi/pYQIe9fNS2qLCOfXNWEThFEqvEW7Zb2JdbwRVZqVVvQdoEIXPnE0eyaYUXTFFk0MtKb7w== root@boot.irc.sara.nl
+boot,boot.irc.sara.nl,192.168.146.10 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3vz/wXUFi6KnT44+0Ug8i1IoWTzL30Rf6dKaj0vA5Sr1KIS0EBDTyKj8PE86gLaXRNd7wyzCxwZWOXx3Cp02u1Q6/myDP4Su3ER8JpHVJWEdB/lxf4/iPEiWTqMP1F7j6GpNwVs7+PLWm+W/UyIKDWJFRITvOvJ+IGdYZQJ8yXGVCTjQxWs+t1T4t2fP41KEU0HwXf5ckkTVjAkbbY/X7d2ewCLbXOYGziGx5qYkloCqdR0WIlv06k/UFeAhiKrZ+TVbjfQTeh9sTeIaaoyetuntvKvoK9CDNH3pXETz5A1eKau0EQjKn9Y28i6e5JFZkbL4861N2WA7jaUsoHjglQ== root@boot.irc.sara.nl
+# INSTALL-NG 
+install-ng,install-ng.irc.sara.nl,192.168.144.2 ssh-dss AAAAB3NzaC1kc3MAAACBAKym0LiAalX0Y2t6wPgCNTVVLu1I0EvGkSqiEt0a9BCZ6Ehp8LF4TpFB4T6VHwJLvd7DCrusPVlNV67e9N0XW3darS9/62fRXnWDSUDxcN0YQcWLxrjy5S2Q/f9wN+buVrAwbKxX1I28lFz9eg2uepp+MGs9NtjpQc8fkBdb9HoPAAAAFQDVrmNqsvZT2HzptqatUzTo109T6wAAAIA3Y60IjBOsPO1DQm/4qBhxCv61ryRm2TGb5FasveThldG9G/0WrWizeoLHqEXZci2QVTB6tRVF8i5k8J8nZI1iY33sJtGv3ZqXLTijcNkDFwQN6k7KKvCRjC0IO27RIRsvSpkPO1gUXh0slm/2d5VzztBuK9DnWl8LIfFYZ2NdWAAAAIBvtfCv30k9oLVJlTxZ6TCkApdDEZVH7VAM8KF8w7KZLUn/QUJAE0ndRZRrKkFXIZ5danOxYBfCmQ0LbpOE8n3bBBtoXgnhemHNBocqwqWfO1b+RDsKv/XECSD7MKz0Mbm2URBLtN8ZiiDvo5Pxm+e5PxCtRJr2KK8c60l5vequwQ==
+install-ng,install-ng.irc.sara.nl,192.168.144.2 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvGo9XAVzR9gE74E8yzkCKrN4HLjgx3VsiajbDL2ILOQcQNFPLGhgmif2pwBTH+9ayXd3ph6i3rtTQV7Mpe8NgnI1v1I2JiqOjFxNjPh4BMdB11ZxC4EzgDW/vpYXi68WUfpD8cPptMax/g4q/XVhgkg5minzy80buqCr8hN6dsE=
+
+{% for hw in gpu_hosts %}
+	{% if "GPU node" in hw.roles %}
+		{% for i in hw.interfaces.all %}
+			{% if i.network.name == 'lisa admin' or i.network.name == 'lisa infiniband' %}
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-dss AAAAB3NzaC1kc3MAAACBANEU3JNaeJH2Y+691f1AtrMZb0NuRvmG5LGsXsJcKyyI4YWY8eVq9nHxk0LLmaPajDhTW3o7nFrlx+ayark5oscG4YOD+D6FBLJWUuq2Q+Uv+u1szVrlsQ6BE30fLiNeTWSGDGeXkt/I+yLqLLADrYsn4jC2CCgBQGju0NBWZSIDAAAAFQCGbiKfLppspsCyvWaLTaq/dPbybwAAAIAkrtYjy0aIwOhC3L0N5JaZqKlgiMGgrpd2OLXEvb18xmJUN8NY3MEYR51tc1UOwUIkxC55EhqciKcP7kh93C2+y6wFDJUiw22Muj0aBuAEjO9PKi2NvcXLqDP4BeuIXLhU8ayPDhT5K+S9Y+7y50rVGz8UFcpx+TwPWn0AlYmjoAAAAIAWdYq1Fn9Xz5wXd5SGNy4uZiG4fEv0GTUWuERPQ9JlPkHbG5Y9LZiYPzwjSeonrw7wGTO2Hg1SyjnoqLBHQNCt7/2UVtWyscqiVJqMJE+zEo9EQoJsDkdcFUx0AMnGsh40yTqnm68LDyjdZAVFHUVSzVkMbT4ubHyES+ca5gLE/g== root@boot.irc.sara.nl
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEApoWGt64vv3hb5pcVG9Rjs7lQzVtYrLnmOrDnqZx/kGWhGhqYg2c3fMJNrRM2aTmv5Wfcmqd2vj32OOxGWqvpaM3N2yVddSSfEG/cW25SJVOZGu4dVz5Bj+tZzh4OMY2GwQTxTphEQ9W47JE0lUkVKKpzrZ+7B3qT0CwSx6cloKk= root@boot.irc.sara.nl
+			{% endif %}
+		{% endfor %}
+	{% endif %}
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/ssh_known_hosts2.lisa.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/ssh_known_hosts2.lisa.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/ssh_known_hosts2.lisa.cmt	(revision 14193)
@@ -0,0 +1,53 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Wed, 18 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       {{ svn_id }}
+#       {{ svn_url }}
+#
+{% load cmts_extras %}
+{% noblanklines %}
+{# {% store /var/tmp/ssh_known_hosts2.lisa as output %} #}
+{% store /data/cfengine/data/method/config_ssh/keys/lisa/ssh_known_hosts2 as output %}
+{% use HardwareUnit with 'cluster__name=Lisa' as lisa_hosts %}
+{% epilogue %}
+/usr/bin/scp /data/cfengine/data/method/config_ssh/keys/lisa/ssh_known_hosts2 cfengine3:/data/cfengine3/data/bundles/ssh/lisa/etc/ssh/
+{% endepilogue %}
+
+# New boot keys
+boot,boot.irc.sara.nl,192.168.146.10 ssh-dss AAAAB3NzaC1kc3MAAACBAKfK3Q08f+2xIF6bTdbLWCvtC8V+gV00wERk5FjzkkUOVBHFxN32tc3Wyro389RZ3Iq6E7A3pj8M+ze2uYL8xenelLk4JX2uapaRXRGqBRX98RdeMuKcXxz4GkiKFAGBulOI8kA0g6Sf2jhlpl416RGVZ1Iv3DpmXe8nXAdsWL/lAAAAFQCypUSocTN/fkOyVEnOKw+meo/NlQAAAIB9P5jECPKwreVqHmup4BcFae/vQ14XWCR3+ATodSgKDSLg+LexZPuPGL1PXq0rOx7ZKIXIFu8/F67RiT1W4WTLt9QqZNPHZdra6YGhv5Tryv0p0H4ENgNj9TSCiS8hUMFurbaeFHLtv9xpe9XDeaEby+Ms6AqIABhmfYsvMDYzdQAAAIBWzWV2axklCSbM8vrknNFH7pPBRnzrPWwNsdPqFzIgrjEzqiScIfQEbyfCLYKfEWA6A91y7DQBygWyuAiL9OA/2M3Qu8wUU9C94lHi/pYQIe9fNS2qLCOfXNWEThFEqvEW7Zb2JdbwRVZqVVvQdoEIXPnE0eyaYUXTFFk0MtKb7w== root@boot.irc.sara.nl
+boot,boot.irc.sara.nl,192.168.146.10 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA3vz/wXUFi6KnT44+0Ug8i1IoWTzL30Rf6dKaj0vA5Sr1KIS0EBDTyKj8PE86gLaXRNd7wyzCxwZWOXx3Cp02u1Q6/myDP4Su3ER8JpHVJWEdB/lxf4/iPEiWTqMP1F7j6GpNwVs7+PLWm+W/UyIKDWJFRITvOvJ+IGdYZQJ8yXGVCTjQxWs+t1T4t2fP41KEU0HwXf5ckkTVjAkbbY/X7d2ewCLbXOYGziGx5qYkloCqdR0WIlv06k/UFeAhiKrZ+TVbjfQTeh9sTeIaaoyetuntvKvoK9CDNH3pXETz5A1eKau0EQjKn9Y28i6e5JFZkbL4861N2WA7jaUsoHjglQ== root@boot.irc.sara.nl
+# INSTALL-NG
+install-ng,install-ng.irc.sara.nl,192.168.144.2 ssh-dss AAAAB3NzaC1kc3MAAACBAKym0LiAalX0Y2t6wPgCNTVVLu1I0EvGkSqiEt0a9BCZ6Ehp8LF4TpFB4T6VHwJLvd7DCrusPVlNV67e9N0XW3darS9/62fRXnWDSUDxcN0YQcWLxrjy5S2Q/f9wN+buVrAwbKxX1I28lFz9eg2uepp+MGs9NtjpQc8fkBdb9HoPAAAAFQDVrmNqsvZT2HzptqatUzTo109T6wAAAIA3Y60IjBOsPO1DQm/4qBhxCv61ryRm2TGb5FasveThldG9G/0WrWizeoLHqEXZci2QVTB6tRVF8i5k8J8nZI1iY33sJtGv3ZqXLTijcNkDFwQN6k7KKvCRjC0IO27RIRsvSpkPO1gUXh0slm/2d5VzztBuK9DnWl8LIfFYZ2NdWAAAAIBvtfCv30k9oLVJlTxZ6TCkApdDEZVH7VAM8KF8w7KZLUn/QUJAE0ndRZRrKkFXIZ5danOxYBfCmQ0LbpOE8n3bBBtoXgnhemHNBocqwqWfO1b+RDsKv/XECSD7MKz0Mbm2URBLtN8ZiiDvo5Pxm+e5PxCtRJr2KK8c60l5vequwQ==
+install-ng,install-ng.irc.sara.nl,192.168.144.2 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAvGo9XAVzR9gE74E8yzkCKrN4HLjgx3VsiajbDL2ILOQcQNFPLGhgmif2pwBTH+9ayXd3ph6i3rtTQV7Mpe8NgnI1v1I2JiqOjFxNjPh4BMdB11ZxC4EzgDW/vpYXi68WUfpD8cPptMax/g4q/XVhgkg5minzy80buqCr8hN6dsE=
+
+
+    {% for hw in lisa_hosts %}
+            {% for i in hw.interfaces.all %}
+                {% if i.network.name == 'lisa admin' and "PowerEdge" in hw.specifications.name and "computenode" in hw.roles or i.network.name == 'lisa admin' and "PowerEdge 1950" in hw.specifications.name and "loginnode" in hw.roles %} 
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-dss AAAAB3NzaC1kc3MAAACBANEU3JNaeJH2Y+691f1AtrMZb0NuRvmG5LGsXsJcKyyI4YWY8eVq9nHxk0LLmaPajDhTW3o7nFrlx+ayark5oscG4YOD+D6FBLJWUuq2Q+Uv+u1szVrlsQ6BE30fLiNeTWSGDGeXkt/I+yLqLLADrYsn4jC2CCgBQGju0NBWZSIDAAAAFQCGbiKfLppspsCyvWaLTaq/dPbybwAAAIAkrtYjy0aIwOhC3L0N5JaZqKlgiMGgrpd2OLXEvb18xmJUN8NY3MEYR51tc1UOwUIkxC55EhqciKcP7kh93C2+y6wFDJUiw22Muj0aBuAEjO9PKi2NvcXLqDP4BeuIXLhU8ayPDhT5K+S9Y+7y50rVGz8UFcpx+TwPWn0AlYmjoAAAAIAWdYq1Fn9Xz5wXd5SGNy4uZiG4fEv0GTUWuERPQ9JlPkHbG5Y9LZiYPzwjSeonrw7wGTO2Hg1SyjnoqLBHQNCt7/2UVtWyscqiVJqMJE+zEo9EQoJsDkdcFUx0AMnGsh40yTqnm68LDyjdZAVFHUVSzVkMbT4ubHyES+ca5gLE/g== root@boot.irc.sara.nl
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEApoWGt64vv3hb5pcVG9Rjs7lQzVtYrLnmOrDnqZx/kGWhGhqYg2c3fMJNrRM2aTmv5Wfcmqd2vj32OOxGWqvpaM3N2yVddSSfEG/cW25SJVOZGu4dVz5Bj+tZzh4OMY2GwQTxTphEQ9W47JE0lUkVKKpzrZ+7B3qT0CwSx6cloKk= root@boot.irc.sara.nl
+		    {% if i.cnames != None %}
+		        {% for cname in i.cnames %}
+{{cname}},{{cname}}.{{ i.network.domain }},{{i.ip}} ssh-dss AAAAB3NzaC1kc3MAAACBANEU3JNaeJH2Y+691f1AtrMZb0NuRvmG5LGsXsJcKyyI4YWY8eVq9nHxk0LLmaPajDhTW3o7nFrlx+ayark5oscG4YOD+D6FBLJWUuq2Q+Uv+u1szVrlsQ6BE30fLiNeTWSGDGeXkt/I+yLqLLADrYsn4jC2CCgBQGju0NBWZSIDAAAAFQCGbiKfLppspsCyvWaLTaq/dPbybwAAAIAkrtYjy0aIwOhC3L0N5JaZqKlgiMGgrpd2OLXEvb18xmJUN8NY3MEYR51tc1UOwUIkxC55EhqciKcP7kh93C2+y6wFDJUiw22Muj0aBuAEjO9PKi2NvcXLqDP4BeuIXLhU8ayPDhT5K+S9Y+7y50rVGz8UFcpx+TwPWn0AlYmjoAAAAIAWdYq1Fn9Xz5wXd5SGNy4uZiG4fEv0GTUWuERPQ9JlPkHbG5Y9LZiYPzwjSeonrw7wGTO2Hg1SyjnoqLBHQNCt7/2UVtWyscqiVJqMJE+zEo9EQoJsDkdcFUx0AMnGsh40yTqnm68LDyjdZAVFHUVSzVkMbT4ubHyES+ca5gLE/g== root@boot.irc.sara.nl
+{{cname}},{{cname}}.{{ i.network.domain }},{{i.ip}} ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEApoWGt64vv3hb5pcVG9Rjs7lQzVtYrLnmOrDnqZx/kGWhGhqYg2c3fMJNrRM2aTmv5Wfcmqd2vj32OOxGWqvpaM3N2yVddSSfEG/cW25SJVOZGu4dVz5Bj+tZzh4OMY2GwQTxTphEQ9W47JE0lUkVKKpzrZ+7B3qT0CwSx6cloKk= root@boot.irc.sara.nl
+			{% endfor %}
+                    {% endif %}
+                {% endif %}
+            {% endfor %}
+    {% endfor %}
+    {% for hw in lisa_hosts %}
+            {% for i in hw.interfaces.all %}
+                {% if i.network.name == 'lisa infiniband' and "PowerEdge" in hw.specifications.name and "computenode" in hw.roles %} 
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-dss AAAAB3NzaC1kc3MAAACBANEU3JNaeJH2Y+691f1AtrMZb0NuRvmG5LGsXsJcKyyI4YWY8eVq9nHxk0LLmaPajDhTW3o7nFrlx+ayark5oscG4YOD+D6FBLJWUuq2Q+Uv+u1szVrlsQ6BE30fLiNeTWSGDGeXkt/I+yLqLLADrYsn4jC2CCgBQGju0NBWZSIDAAAAFQCGbiKfLppspsCyvWaLTaq/dPbybwAAAIAkrtYjy0aIwOhC3L0N5JaZqKlgiMGgrpd2OLXEvb18xmJUN8NY3MEYR51tc1UOwUIkxC55EhqciKcP7kh93C2+y6wFDJUiw22Muj0aBuAEjO9PKi2NvcXLqDP4BeuIXLhU8ayPDhT5K+S9Y+7y50rVGz8UFcpx+TwPWn0AlYmjoAAAAIAWdYq1Fn9Xz5wXd5SGNy4uZiG4fEv0GTUWuERPQ9JlPkHbG5Y9LZiYPzwjSeonrw7wGTO2Hg1SyjnoqLBHQNCt7/2UVtWyscqiVJqMJE+zEo9EQoJsDkdcFUx0AMnGsh40yTqnm68LDyjdZAVFHUVSzVkMbT4ubHyES+ca5gLE/g== root@boot.irc.sara.nl
+{{i.label}},{{ i.fqdn }},{{i.ip}} ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEApoWGt64vv3hb5pcVG9Rjs7lQzVtYrLnmOrDnqZx/kGWhGhqYg2c3fMJNrRM2aTmv5Wfcmqd2vj32OOxGWqvpaM3N2yVddSSfEG/cW25SJVOZGu4dVz5Bj+tZzh4OMY2GwQTxTphEQ9W47JE0lUkVKKpzrZ+7B3qT0CwSx6cloKk= root@boot.irc.sara.nl
+                {% endif %}
+            {% endfor %}
+    {% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/support.nodes.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/support.nodes.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/support.nodes.cmt	(revision 14193)
@@ -0,0 +1,14 @@
+{% load cmts_extras %}
+{% store /usr/sara/etc/support.nodes as output %}
+{% noblanklines %}
+{% use HardwareUnit with 'cluster__name=Lisa' as lisa_hosts %}
+    {% for hw in lisa_hosts %}
+	{% if 'inactive' not in hw.roles %}
+            {% for i in hw.interfaces.all %}
+                {% if i.network.name == 'lisa consoles' and "PowerEdge" in hw.specifications.name %} 
+{{ i.fqdn }}
+                {% endif %}
+            {% endfor %}
+	{% endif %}
+    {% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/torque_nodes.gpu.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/torque_nodes.gpu.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/torque_nodes.gpu.cmt	(revision 14193)
@@ -0,0 +1,40 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Tue, 17 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+    {% store /data/cfengine/data/method/config_torque/gpu/server/server_priv/nodes as output %}
+
+    {% store 'np=8 cores8 cuda mem32gb q_gpu f_tesla' as node_properties %}
+
+    {% use HardwareUnit with 'cluster__name=GPU' as hosts %}
+
+
+{# This are all GPU Host #}
+
+    {% for h in hosts %}
+
+    	{% for i in h.interfaces.all %} 
+
+		{% if 'admin' in i.network.name %}
+
+{# safe: else we get all kine off escaping, get rid of ' begin en ' end chars #}
+{{ i.label }} {{ node_properties|safe|slice:"1:-1" }}
+
+		{% endif %}
+
+	{% endfor %}
+
+    {% endfor %}
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/lisa/torque_nodes.lisa.cmt
===================================================================
--- /tags/1.0.0/sara_cmt/templates/lisa/torque_nodes.lisa.cmt	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/lisa/torque_nodes.lisa.cmt	(revision 14193)
@@ -0,0 +1,150 @@
+# This file is automagicly generated by SARA CMT
+#
+#               SARA - Computing and Networking Services
+# Date        : Tue, 17 Aug 2010
+# Version     : {{ version }}
+# Generated   : {% now "r" %}
+#
+# Description :
+#
+#
+# SVN:
+#       $Id$
+#       $URL$
+#
+{% load cmts_extras %}
+{% noblanklines %}
+
+    {% store /data/cfengine/data/method/config_torque/lisa/server/server_priv/nodes as output %}
+    {% store "r7n2 r7n3 r7n4 r7n5" as express_nodes %}
+
+    {% use HardwareUnit with 'cluster__name=Lisa' as lisa_hosts %}
+
+login3
+login4
+
+{# These are all M610 Host with infiniband 12 cores, rack 2 and 13 #}
+
+{% for host in lisa_hosts %} 
+	{% if host.rack.label|get_digit:"0" = 2 or host.rack.label|get_digit:"0" = 13 and "computenode" in host.roles %} 
+	
+		{% if host.first_slot < 17 %}
+			{% store a as chassis %}
+		{% else %}
+			{% store b as chassis %}
+		{% endif %}
+
+    	{% for i in host.interfaces.all %}
+
+    		{% if 'infiniband' in i.network.name %}
+gb-{{ host.label }} np=12 cores12 f_qlogic infiniband mem24gb q_parallel q_express q_serial f_r{{host.rack.label }}{{ chassis }}
+			{% endif %}
+
+	   	{% endfor %}
+
+	{% endif %}
+{% endfor %}
+
+{# These are all M610 Host with infiniband and 8 cores rack 3 - 12, not rack 7 #}
+
+{% for host in lisa_hosts %}
+
+	{% if host.specifications.name == 'PowerEdge M610' and "computenode" in host.roles %} 
+
+		{% if host.rack.label|get_digit:"0" >= 3 and host.rack.label|get_digit:"0" <= 12 and "computenode" in host.roles %}
+
+           	 	{% if host.first_slot < 17 %}
+               			{% store a as chassis %}
+           		{% else %}
+               			{% store b as chassis %}
+           		{% endif %}
+
+
+	    		{% for i in host.interfaces.all %}
+
+	    			{% if 'infiniband' in i.network.name %}
+gb-{{ host.label }} np=8  cores8 f_qlogic infiniband mem24gb q_parallel q_express q_serial f_r{{host.rack.label }}{{ chassis }}
+				{% endif %}
+
+	    		{% endfor %}
+
+   		{% endif %}
+
+	{% endif %}
+
+{% endfor %}
+
+{# This are all M600 Host with infiniband, r7n2 t/m r7n5 are express nodes #}
+
+{% for host in lisa_hosts %}
+
+	{% if host.specifications.name == 'PowerEdge M600' and "computenode" in host.roles %}
+
+		{% if host.first_slot < 17 %}
+			{% store a as chassis %}
+		{% else %}
+			{% store b as chassis %}
+		{% endif %} 
+		
+		{% for i in host.interfaces.all %} 
+		
+			{% if 'infiniband' in i.network.name %} 
+
+				{% if host.label in express_nodes %}
+gb-{{ host.label }} np=8  cores8 f_express infiniband mem16gb q_express
+				{% else %}
+gb-{{ host.label }} np=8  cores8 f_qlogic infiniband mem16gb q_parallel q_express q_serial f_r{{host.rack.label }}{{ chassis }}
+				{% endif %}
+
+			{% endif %}
+
+		{% endfor %} 
+
+   	{% endif %}
+
+{% endfor %}
+
+{# These are all M610 Host without infiniband and cores 12, rack = 36 #}
+
+{% for host in lisa_hosts %} 
+
+	{% if host.rack.label|get_digit:"0" = 36 and "computenode" in host.roles %} 
+	
+		{% if host.first_slot < 17 %}
+			{% store a as chassis %}
+		{% else %}
+			{% store b as chassis %}
+		{% endif %}
+
+
+	   	{% for i in host.interfaces.all %} 
+		
+			{% if "admin" in i.network.name %}
+{{ i.label }} np=12 cores12 f_gigabit mem24gb q_serial f_r{{host.rack.label }}{{ chassis }}
+			{% endif %}
+
+		{% endfor %} 
+
+	{% endif %}
+
+{% endfor %} 
+
+{# These are all M610 Host without infiniband and cores 8, rack >= 32  and <= 35 #}
+
+{% for host in lisa_hosts %} 
+
+	{% if host.rack.label|get_digit:"0" > 30 and host.rack.label|get_digit:"0" <= 35 and "computenode" in host.roles %}
+		
+		{% for i in host.interfaces.all %} 
+
+			{% if "admin" in i.network.name %}
+{{ i.label }} np=8  cores8 f_gigabit mem24gb q_serial f_r{{host.rack.label }}{{ chassis }}
+			{% endif %}
+
+		{% endfor %} 
+
+	{% endif %}
+
+{% endfor %}
+
+{% endnoblanklines %}
Index: /tags/1.0.0/sara_cmt/templates/media/cmts.css
===================================================================
--- /tags/1.0.0/sara_cmt/templates/media/cmts.css	(revision 14193)
+++ /tags/1.0.0/sara_cmt/templates/media/cmts.css	(revision 14193)
@@ -0,0 +1,22 @@
+/* Value  Color
+ *
+ * 000033 purple (darkest)
+ * 000066 purple (dark)     
+ * 666699 purple (neutral)
+ * CC6600 orange (dark)
+ * FF9933 orange (light)
+ *
+ */
+
+body {
+  background:  #FFFFFF none repeat scroll 0 0;
+  color:       #000033;
+  font-family: "Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif;
+  font-size:   12px;
+  margin:      0;
+  padding:     0;
+}
+
+h1 {
+  background:  #FF9933 none repeat scroll 0 0;
+}
