CORD-1467: Surgical cleanup for 3.0.1 to enable service development without attics

Change-Id: I1121c499f8120c416fa20ec41fa735276815776b
diff --git a/xos/genx/targets/service.xtarget b/xos/genx/targets/service.xtarget
index c2256d2..6983333 100644
--- a/xos/genx/targets/service.xtarget
+++ b/xos/genx/targets/service.xtarget
@@ -1,4 +1,12 @@
+{% if options.legacy =='"True"' -%}
+{% set legacy_tag = '_decl' %}
+{% set legacy = True %}
+from core.models.xosbase import *
+{% else %}
+{% set legacy = False %}
+{% set legacy_tag = '' %}
 from header import *
+{% endif %}
 
 {% for m in proto.messages %}
 {% if file_exists(m.name|lower+'_header.py') -%}from {{m.name|lower }}_header import *{% endif %}
@@ -20,7 +28,7 @@
 
 {% for m in proto.messages %}
 
-class {{ m.name }}{{ xproto_base_def(m.bases) }}:
+class {{ m.name }}{{ legacy_tag }}{{ xproto_base_def(m.bases) }}:
 
   KIND = {{ xproto_first_non_empty([m.options.kind, options.kind, options.name, "Set a kind in your xproto!"]) }}
 
@@ -38,12 +46,13 @@
 
   # Relations
   {% for l in m.links %}
-  {{ l.src_port }} = {{ xproto_django_link_type(l) }}( {%- if l.peer==m.name -%}'self'{%- else -%}{{ l.peer }} {%- endif -%}, {{ xproto_django_options_str(l, l.dst_port ) }} )
+  {% if legacy and l.peer in proto.message_names %}{% set peer_tag = legacy_tag %}{% else %}{% set peer_tag = '' %}{% endif -%}
+  {{ l.src_port }} = {{ xproto_django_link_type(l) }}( {%- if l.peer==m.name -%}'self'{%- else -%}{{ l.peer }}{{ peer_tag }} {%- endif -%}, {{ xproto_django_options_str(l, l.dst_port ) }} )
   {%- endfor %}
 
   {% if file_exists(m.name|lower + '_model.py') -%}{{ include_file(m.name|lower + '_model.py') | indent(width=2)}}{%- endif %}
   pass
 
-{% if file_exists(m.name|lower+'_bottom.py') -%}{{ include_file(m.name|lower+'_bottom.py') }}{% endif %}
+{% if file_exists(m.name|lower+'_bottom.py') -%}{{ include_file(m.name|lower+'_bottom.py') }}{% endif %} 
 {% endfor %}
-+++ models.py
++++ models{{ legacy_tag }}.py
diff --git a/xos/genx/tool/Makefile.service b/xos/genx/tool/Makefile.service
index a465797..f5ea769 100644
--- a/xos/genx/tool/Makefile.service
+++ b/xos/genx/tool/Makefile.service
@@ -7,9 +7,7 @@
 
 xprotos = $(wildcard *.xproto)
 
-all: models.py
-
-models.py: $(xprotos)
+all: $(xprotos)
 	$(XOSGEN) --attic attic --input $< --target $(DJANGO_TARGET) --output $@
 
 .PHONY: all
diff --git a/xos/tools/apigen/modelgen b/xos/tools/apigen/modelgen
index 7ef76a4..6076550 100755
--- a/xos/tools/apigen/modelgen
+++ b/xos/tools/apigen/modelgen
@@ -233,8 +233,13 @@
                                         pass
 				else:
                                         f.type = f.__class__.__name__
+
                                         if (type(f)==ForeignKey):
-                                            f.related.model.class_name = f.related.model.__name__
+                                            if isinstance(f.related.model, str):
+                                                f.related.model = {'class_name':f.related.model}
+                                            else:
+                                                f.related.model.class_name = f.related.model.__name__
+
                                         if (f.name not in base_props):
                                             obj.fields.append(f)
                                         obj.all_fields.append(f)
diff --git a/xos/tools/corebuilder/corebuilder.py b/xos/tools/corebuilder/corebuilder.py
index 01ea525..1b91b83 100644
--- a/xos/tools/corebuilder/corebuilder.py
+++ b/xos/tools/corebuilder/corebuilder.py
@@ -276,7 +276,7 @@
                 if (not os.path.isdir(build_dest_fn)):
                     shutil.copytree(src_fn, build_dest_fn, symlinks=True)
                 else:
-                    os.system('cp -R %s/*.xproto %s/attic %s/*header.py %s'%(src_fn, src_fn, src_fn, build_dest_fn))
+                    os.system('cp -R %(src_fn)s/*.xproto %(src_fn)s/attic %(src_fn)s/models.py %(src_fn)s/*header.py %(build_dst_fn)s 2> /dev/null || :'%{'src_fn':src_fn, 'build_dst_fn':build_dest_fn})
             else:
                 shutil.copyfile(src_fn, build_dest_fn)