Merge lp:~ronnie.vd.c/loco-team-portal/import-live-data-improved into lp:loco-team-portal

Proposed by Ronnie
Status: Merged
Merged at revision: 573
Proposed branch: lp:~ronnie.vd.c/loco-team-portal/import-live-data-improved
Merge into: lp:loco-team-portal
Diff against target: 155 lines (+61/-58)
1 file modified
loco_directory/teams/management/commands/import-live-data.py (+61/-58)
To merge this branch: bzr merge lp:~ronnie.vd.c/loco-team-portal/import-live-data-improved
Reviewer Review Type Date Requested Status
Adnane Belmadiaf Approve
Ronnie (community) Needs Fixing
Review via email: mp+107635@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Ronnie (ronnie.vd.c) wrote :

Meetings are not imported correct

review: Needs Fixing
530. By Ronnie

Fixed importing meetings

Revision history for this message
Chris Johnston (cjohnston) wrote :

May also want to look at a couple of the changes that we made to Summit:

http://bazaar.launchpad.net/~summit-hackers/summit/trunk/view/head:/summit/schedule/management/commands/import_live_data.py

If I remember correctly, the users are imported and then you just appends new users to the end of the list.

Revision history for this message
Adnane Belmadiaf (daker) wrote :

I have created a new MP with a new code and some improvements https://code.launchpad.net/~daker/loco-team-portal/fix.import-live-data/+merge/138338

Revision history for this message
Adnane Belmadiaf (daker) wrote :

Merged in trunk with some modifications

Revision history for this message
Adnane Belmadiaf (daker) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'loco_directory/teams/management/commands/import-live-data.py'
2--- loco_directory/teams/management/commands/import-live-data.py 2011-02-18 04:34:02 +0000
3+++ loco_directory/teams/management/commands/import-live-data.py 2012-05-28 21:59:17 +0000
4@@ -1,9 +1,12 @@
5 #!/usr/bin/python
6+import os
7+import subprocess
8
9 from django.core.management.base import NoArgsCommand
10 from django.contrib.auth.models import User, Group
11-from meetings.models import TeamMeeting, AgendaItem
12-from events.models import GlobalEvent, TeamEvent, TeamEventComment, Attendee
13+from django.db.models.fields import DateTimeField, DateField
14+from meetings.models import BaseMeeting, TeamMeeting, AgendaItem
15+from events.models import BaseEvent, GlobalEvent, TeamEvent, TeamEventComment, Attendee
16 from teams.models import Language, Continent, Country, Team
17 from venues.models import Venue
18 from userprofiles.models import UserProfile
19@@ -30,6 +33,28 @@
20 ('agenda', AgendaItem),
21 ]
22
23+date_pattern1 = re.compile('^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$')
24+date_pattern2 = re.compile('^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d+$')
25+
26+def get_field_data(model, model_data):
27+ fields = {}
28+ for field in model._meta.fields:
29+ field_value = model_data.get(field.name, None)
30+ if field_value:
31+ if isinstance(field, DateTimeField):
32+ if date_pattern1.match(field_value):
33+ fields[field.name] = field_value
34+ elif date_pattern2.match(field_value):
35+ fields[field.name] = field_value.split('.')[0]
36+ elif isinstance(field, DateField):
37+ if date_pattern1.match(field_value) or date_pattern2.match(field_value):
38+ fields[field.name] = field_value.split(' ')[0]
39+ else:
40+ fields[field.name] = field_value
41+ for field in model._meta.many_to_many:
42+ fields[field.name] = model_data.get(field.name, [])
43+ return fields
44+
45
46 class Command(NoArgsCommand):
47 help = "Copy the live data to the local instance"
48@@ -44,68 +69,47 @@
49
50 # Delete all old data, so the id's do not conflict when linking
51 print 'Removing local data from database...'
52- for service, Model in ORDER:
53- Model.objects.all().delete()
54+ for service, model in ORDER:
55+ model.objects.all().delete()
56
57+ loaddata_json = []
58 services_url = 'http://loco.ubuntu.com/services/'
59- date_pattern1 = re.compile('^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$')
60- date_pattern2 = re.compile('^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}.\d+$')
61-
62- for service, Model in ORDER:
63+
64+ for service, model in ORDER:
65 # Get the json data from the server
66 print 'Getting', service, '...'
67 json_data = urllib2.urlopen(services_url+service).read()
68
69- # Find out what fields are normal, and which many_to_many
70- local_fields = Model._meta.fields
71- many_to_many = Model._meta.many_to_many
72-
73- for entry in json.loads(json_data):
74- # Create the model without the many_to_many fields
75- params = {}
76- for field in local_fields:
77- if entry.has_key(field.name):
78- field_value = entry[field.name]
79- if field_value == None:
80- if field.null == True:
81- # If field on the server is None, but None is not allowed, get the default value
82- field_value = field.get_default()
83- else:
84- # If the field is a related, grab the object with that id
85- if field.rel:
86- rel_model = field.rel.to
87- try:
88- params[field.name] = rel_model.objects.get(pk=field_value)
89- except rel_model.DoesNotExist:
90- print '%(model)s with pk=%(pk)s does not exists' % ({'model':rel_model._meta.object_name, 'pk':field_value})
91- # Else if it is a date, create a date object
92- elif isinstance(field_value, unicode) and date_pattern1.match(field_value):
93- params[field.name] = datetime.datetime.strptime(field_value, '%Y-%m-%d %H:%M:%S')
94- elif isinstance(field_value, unicode) and date_pattern2.match(field_value):
95- params[field.name] = datetime.datetime.strptime(field_value, '%Y-%m-%d %H:%M:%S.%f')
96- # Else: copy the info
97- else:
98- params[field.name] = field_value
99-
100- model_instance = Model(**params)
101- model_instance.save()
102+ for model_data in json.loads(json_data):
103+ loaddata_json.append({'pk': model_data['id'],
104+ 'model': str(model._meta),
105+ 'fields': get_field_data(model, model_data)})
106+
107+ # GlobalEvent, TeamEvent are a subclass of BaseEvent, so we need to create the BaseEvent also
108+ if model in [GlobalEvent, TeamEvent]:
109+ loaddata_json.append({'pk': model_data['id'],
110+ 'model': str(BaseEvent._meta),
111+ 'fields': get_field_data(BaseEvent, model_data)})
112+
113+ # TeamMeeting is a subclass of BaseMeeting, so we need to create the BaseMeeting also
114+ if model is TeamMeeting:
115+ loaddata_json.append({'pk': model_data['id'],
116+ 'model': str(BaseMeeting._meta),
117+ 'fields': get_field_data(BaseMeeting, model_data)})
118
119- # Add the related object to the model
120- for field in many_to_many:
121- if entry.has_key(field.name):
122- for object_id in entry[field.name]:
123- many_related_manager = getattr(model_instance, field.name)
124- rel_model = many_related_manager.model
125- try:
126- related_object = rel_model.objects.get(pk=object_id)
127- except rel_model.DoesNotExist:
128- print '%(model)s with pk=%(pk)s does not exists' % ({'model':rel_model, 'pk':object_id})
129- else:
130- many_related_manager.add(related_object)
131-
132- # Save the model to the database, if changed by many to many fields
133- if many_to_many:
134- model_instance.save()
135+
136+ print 'loading live data into database...'
137+ f = open('livedata.json', 'w')
138+ f.write(json.dumps(loaddata_json))
139+ f.close()
140+
141+ p = subprocess.Popen(['python', 'manage.py', 'loaddata', 'livedata.json'], stdout=subprocess.PIPE,
142+ stderr=subprocess.STDOUT, close_fds=True)
143+ log = p.stdout.read()
144+ p.communicate()
145+ print log
146+
147+ os.remove('livedata.json')
148
149 # Restore the super user
150 if super_user:
151@@ -117,4 +121,3 @@
152 new_su.__dict__.update(old_su)
153 new_su.save()
154
155-

Subscribers

People subscribed via source and target branches