def addon_upload_preview(request, sid, template_name="base/addon_upload_preview.html"): if sid not in request.session: raise Http404 path = request.session[sid] addon_zip = zipfile.ZipFile(default_storage.open(path)) addon_name = addon_zip.namelist()[0] addon_name = addon_name.strip('/') if not os.path.isdir(os.path.join(settings.SITE_ADDONS_PATH, addon_name)): subprocess.Popen([ python_executable(), "manage.py", "upload_addon", '--zip_path=%s' % path ]) return redirect('addon.upload.process', sid) if request.method == "POST": shutil.rmtree(os.path.join(settings.SITE_ADDONS_PATH, addon_name)) subprocess.Popen([ python_executable(), "manage.py", "upload_addon", '--zip_path=%s' % path ]) return redirect('addon.upload.process', sid) return render_to_resp(request=request, template_name=template_name, context={ 'addon_name': addon_name, 'sid': sid })
def _export_page(request): ctx = {} ctx.update(get_app_permissions(request)) form = None if request.method == 'POST': form = DatabaseDumpForm(request.POST) if form.is_valid(): print("Form submitted is valid!") if can_create_dump(): new_obj = DatabaseDumpFile() new_obj.author = request.user new_obj.export_format = form.cleaned_data['format'] new_obj.save() subprocess.Popen([python_executable(), "manage.py", "create_database_dump", str(request.user.pk), form.cleaned_data['format'], str(new_obj.pk) ]) messages.add_message(request, messages.INFO, "Success! The system is now generating your export file. Please reload in a few seconds to update the list.") else: messages.add_message(request, messages.ERROR, "Cannot create file. You have already reached the limit of existing dump files. Please delete old unused exports and try again.") else: form = DatabaseDumpForm() # get all active DB Dump Files # if current existing DB Dump Files are less than the limit, enable form submission db_objs = DatabaseDumpFile.objects.filter(~Q(status='expired')) ctx['objects'] = db_objs if can_create_dump(): ctx['enable_form'] = True ctx['form'] = form return render_to_resp(request=request, template_name="explorer/export_page.html", context=ctx)
def directory_export(request, template_name="directories/export.html"): """Export Directories""" if not request.user.profile.is_superuser: raise Http403 form = DirectoryExportForm(request.POST or None) if request.method == "POST" and form.is_valid(): export_fields = form.cleaned_data['export_fields'] export_status_detail = form.cleaned_data['export_status_detail'] identifier = int(time.time()) temp_file_path = 'export/directories/%s_temp.csv' % identifier default_storage.save(temp_file_path, ContentFile('')) # start the process subprocess.Popen([ python_executable(), "manage.py", "directory_export_process", '--export_fields=%s' % export_fields, '--export_status_detail=%s' % export_status_detail, '--identifier=%s' % identifier, '--user=%s' % request.user.id ]) # log an event EventLog.objects.log() return HttpResponseRedirect( reverse('directory.export_status', args=[identifier])) context = {'form': form} return render_to_resp(request=request, template_name=template_name, context=context)
def group_members_export(request, group_slug, export_target='all'): """ Export members for a specific group """ group = get_object_or_404(Group, slug=group_slug) # if they can edit it, they can export it if not has_perm(request.user,'user_groups.change_group', group): raise Http403 identifier = '%s_%s' % (int(ttime.time()), request.user.id) file_dir = 'export/groups/' temp_export_path = '%sgroup_%d_%s_%s_temp.csv' % (file_dir, group.id, export_target, identifier) default_storage.save(temp_export_path, ContentFile('')) # start the process subprocess.Popen([python_executable(), "manage.py", "group_members_export", '--group_id=%d' % group.id, '--export_target=%s' % export_target, '--identifier=%s' % identifier, '--user_id=%s' % request.user.id]) # log an event EventLog.objects.log() return redirect(reverse('group.members_export_status', args=[group.slug, export_target, identifier]))
def directory_export(request, template_name="directories/export.html"): """Export Directories""" if not request.user.profile.is_superuser: raise Http403 form = DirectoryExportForm(request.POST or None) if request.method == "POST" and form.is_valid(): export_fields = form.cleaned_data['export_fields'] export_status_detail = form.cleaned_data['export_status_detail'] identifier = int(time.time()) temp_file_path = 'export/directories/%s_temp.csv' % identifier default_storage.save(temp_file_path, ContentFile('')) # start the process subprocess.Popen([python_executable(), "manage.py", "directory_export_process", '--export_fields=%s' % export_fields, '--export_status_detail=%s' % export_status_detail, '--identifier=%s' % identifier, '--user=%s' % request.user.id]) # log an event EventLog.objects.log() return HttpResponseRedirect(reverse('directory.export_status', args=[identifier])) context = {'form': form} return render_to_resp(request=request, template_name=template_name, context=context)
def group_members_export(request, group_slug, export_target='all'): """ Export members for a specific group """ group = get_object_or_404(Group, slug=group_slug) # if they can edit it, they can export it if not has_perm(request.user, 'user_groups.change_group', group): raise Http403 identifier = '%s_%s' % (int(ttime.time()), request.user.id) file_dir = 'export/groups/' temp_export_path = '%sgroup_%d_%s_%s_temp.csv' % ( file_dir, group.id, export_target, identifier) default_storage.save(temp_export_path, ContentFile('')) # start the process subprocess.Popen([ python_executable(), "manage.py", "group_members_export", '--group_id=%d' % group.id, '--export_target=%s' % export_target, '--identifier=%s' % identifier, '--user_id=%s' % request.user.id ]) # log an event EventLog.objects.log() return redirect( reverse('group.members_export_status', args=[group.slug, export_target, identifier]))
def export_page(request): ctx = {} ctx.update(get_app_permissions(request)) form = None if request.method == 'POST': form = DatabaseDumpForm(request.POST) if form.is_valid(): print("Form submitted is valid!") if can_create_dump(): new_obj = DatabaseDumpFile() new_obj.author = request.user new_obj.export_format = form.cleaned_data['format'] new_obj.save() subprocess.Popen([python_executable(), "manage.py", "create_database_dump", str(request.user.pk), form.cleaned_data['format'], str(new_obj.pk) ]) messages.add_message(request, messages.INFO, "Success! The system is now generating your export file. Please reload in a few seconds to update the list.") else: messages.add_message(request, messages.ERROR, "Cannot create file. You have already reached the limit of existing dump files. Please delete old unused exports and try again.") else: form = DatabaseDumpForm() # get all active DB Dump Files # if current existing DB Dump Files are less than the limit, enable form submission db_objs = DatabaseDumpFile.objects.filter(~Q(status='expired')) ctx['objects'] = db_objs if can_create_dump(): ctx['enable_form'] = True ctx['form'] = form return render_to_response("explorer/export_page.html", ctx, context_instance=RequestContext(request))
def run_precreate_ics(app_label, model_name, user): ics = ICS.objects.create( app_label=app_label, model_name=model_name, user=user ) subprocess.Popen([python_executable(), 'manage.py', 'run_precreate_ics', str(ics.pk)]) return ics.pk
def run_precreate_ics(app_label, model_name, user): ics = ICS.objects.create( app_label=app_label, model_name=model_name, user=user ) subprocess.Popen([python_executable(), 'manage.py', 'run_precreate_ics', str(ics.pk)]) return ics.pk
def handle(self, *args, **options): path = options['zip_path'] addon_zip = zipfile.ZipFile(default_storage.open(path)) addon_name = addon_zip.namelist()[0] addon_name = addon_name.strip('/') addon_zip.extractall(settings.SITE_ADDONS_PATH) print('Updating tendenci site') os.system('"%s" manage.py migrate %s --noinput' % (python_executable(), addon_name)) os.system('"%s" manage.py update_settings %s' % (python_executable(), addon_name)) os.system('"%s" manage.py collectstatic --link --noinput' % (python_executable())) print('Restarting Server') os.system('sudo reload "%s"' % os.path.basename(settings.PROJECT_ROOT)) print('Deleting zip file') default_storage.delete(path)
def get_object(self, **kwargs): #invalidate('reports_run') obj = get_object_or_404(Run, pk=self.kwargs['pk'], report_id=self.kwargs['report_id']) if obj.status == "unstarted": subprocess.Popen([ python_executable(), "manage.py", "process_report_run", str(obj.pk) ]) return obj
def handle(self, *args, **options): path = options['zip_path'] addon_zip = zipfile.ZipFile(default_storage.open(path)) addon_name = addon_zip.namelist()[0] addon_name = addon_name.strip('/') addon_zip.extractall(settings.SITE_ADDONS_PATH) print('Updating tendenci site') os.system('"%s" manage.py migrate %s --noinput' % (python_executable(), addon_name)) os.system('"%s" manage.py update_settings %s' % (python_executable(), addon_name)) os.system('"%s" manage.py collectstatic --link --noinput' % (python_executable())) print('Restarting Server') os.system('sudo reload "%s"' % os.path.basename(settings.PROJECT_ROOT)) print('Deleting zip file') default_storage.delete(path)
def get_themes(request, template_name="theme_editor/get_themes.html"): if not request.user.profile.is_superuser: raise Http403 if request.is_ajax(): tracker = UpdateTracker.get_or_create_instance() return HttpResponse(tracker.is_updating) if request.method == 'POST': process = SubProcessManager.set_process([python_executable(), "manage.py", "install_theme", "--all"]) return render_to_response(template_name, context_instance=RequestContext(request)) raise Http404
def get_themes(request, template_name="theme_editor/get_themes.html"): if not request.user.profile.is_superuser: raise Http403 if request.is_ajax(): tracker = UpdateTracker.get_or_create_instance() return HttpResponse(tracker.is_updating) if request.method == 'POST': subprocess.Popen([python_executable(), "manage.py", "install_theme", "--all"]) return render_to_resp(request=request, template_name=template_name) raise Http404
def sitemap(request, sitemaps, section=None, template_name='sitemap.xml', mimetype='application/xml'): #req_protocol = 'https' if request.is_secure() else 'http' req_protocol = get_setting('site', 'global', 'siteurl').split(':')[0] req_site = get_current_site(request) if section is not None: if section not in sitemaps: raise Http404(_("No sitemap available for section: %r" % section)) maps = [sitemaps[section]] else: maps = list(sitemaps.values()) page = request.GET.get("p", 1) urls = [] cached = False for site in maps: try: if callable(site): site = site() site_key = site.__class__.__name__ else: site_key = site.__name__ # Cache the sitemap urls sitemap_cache_key = '.'.join([ settings.SITE_CACHE_KEY, 'sitemap_cache', site_key, req_protocol ]) site_urls = cache.get(sitemap_cache_key) if not isinstance(site_urls, list): if not cached: subprocess.Popen( [python_executable(), 'manage.py', 'sitemap_cache']) cached = True site_urls = site.get_urls(page=page, site=req_site, protocol=req_protocol) cache.set(sitemap_cache_key, list(site_urls), 86400) urls.extend(site_urls) except EmptyPage: raise Http404("Page %s empty" % page) except PageNotAnInteger: raise Http404("No page '%s'" % page) return TemplateResponse(request=request, template=template_name, context={'urlset': urls}, content_type=mimetype)
def run_export_task(app_label, model_name, fields): export = Export.objects.create(app_label=app_label, model_name=model_name) if settings.USE_SUBPROCESS: subprocess.Popen([ python_executable(), 'manage.py', 'run_export_task', str(export.pk) ] + fields) else: from django.core.management import call_command args = [str(export.pk)] + fields call_command('run_export_task', *args) return export.pk
def export(request, template_name="invoices/export.html"): """Export Invoices""" if not request.user.profile.is_superuser: raise Http403 if request.method == 'POST': end_dt = request.POST.get('end_dt', None) start_dt = request.POST.get('start_dt', None) # First, convert our strings into datetime objects # in case we need to do a timedelta try: end_dt = datetime.strptime(end_dt, '%Y-%m-%d') except: end_dt = datetime.now() try: start_dt = datetime.strptime(start_dt, '%Y-%m-%d') except: start_dt = end_dt - timedelta(days=30) # convert our datetime objects back to strings # so we can pass them on to the task end_dt = end_dt.strftime("%Y-%m-%d") start_dt = start_dt.strftime("%Y-%m-%d") identifier = int(ttime.time()) temp_file_path = 'export/invoices/%s_temp.csv' % identifier default_storage.save(temp_file_path, ContentFile('')) # start the process subprocess.Popen([ python_executable(), "manage.py", "invoice_export_process", '--start_dt=%s' % start_dt, '--end_dt=%s' % end_dt, '--identifier=%s' % identifier, '--user=%s' % request.user.id ]) # log an event EventLog.objects.log() return redirect('invoice.export_status', identifier) else: end_dt = datetime.now() start_dt = end_dt - timedelta(days=30) context = {'start_dt': start_dt, 'end_dt': end_dt} return render_to_resp(request=request, template_name=template_name, context=context)
def addon_upload_preview(request, sid, template_name="base/addon_upload_preview.html"): if sid not in request.session: raise Http404 path = request.session[sid] addon_zip = zipfile.ZipFile(default_storage.open(path)) addon_name = addon_zip.namelist()[0] addon_name = addon_name.strip('/') if not os.path.isdir(os.path.join(settings.SITE_ADDONS_PATH, addon_name)): subprocess.Popen([python_executable(), "manage.py", "upload_addon", '--zip_path=%s' % path]) return redirect('addon.upload.process', sid) if request.method == "POST": shutil.rmtree(os.path.join(settings.SITE_ADDONS_PATH, addon_name)) subprocess.Popen([python_executable(), "manage.py", "upload_addon", '--zip_path=%s' % path]) return redirect('addon.upload.process', sid) return render_to_response(template_name, {'addon_name': addon_name, 'sid':sid }, context_instance=RequestContext(request))
def update_tendenci(request, template_name="base/update.html"): from tendenci.apps.base.utils import get_latest_version if request.method == "POST": tos = request.POST.get('tos') if tos: SubProcessManager.set_process([python_executable(), "manage.py", "auto_update", "--user_id=%s" % request.user.id]) return redirect('update_tendenci.confirmation') return render_to_response(template_name, { 'latest_version': get_latest_version(), 'version': version, }, context_instance=RequestContext(request))
def import_process(request, import_id, template_name="user_groups/imports/user_groups_process.html"): """Import Step 3: Import into database""" if not request.user.profile.is_superuser: raise Http403 # admin only page import_i = get_object_or_404(Import, id=import_id) subprocess.Popen([python_executable(), 'manage.py', 'import_groups', str(import_id)]) return render_to_response(template_name, { 'total': import_i.total_created + import_i.total_invalid, "import_i": import_i, }, context_instance=RequestContext(request))
def update_tendenci(request, template_name="base/update.html"): from tendenci.apps.base.utils import get_latest_version if request.method == "POST": tos = request.POST.get('tos') if tos: subprocess.Popen([python_executable(), "manage.py", "auto_update", "--user_id=%s" % request.user.id]) return redirect('update_tendenci.confirmation') return render_to_resp(request=request, template_name=template_name, context={ 'latest_version': get_latest_version(), 'version': version, })
def export(request, template_name="invoices/export.html"): """Export Invoices""" if not request.user.profile.is_superuser: raise Http403 if request.method == 'POST': end_dt = request.POST.get('end_dt', None) start_dt = request.POST.get('start_dt', None) # First, convert our strings into datetime objects # in case we need to do a timedelta try: end_dt = datetime.strptime(end_dt, '%Y-%m-%d') except: end_dt = datetime.now() try: start_dt = datetime.strptime(start_dt, '%Y-%m-%d') except: start_dt = end_dt - timedelta(days=30) # convert our datetime objects back to strings # so we can pass them on to the task end_dt = end_dt.strftime("%Y-%m-%d") start_dt = start_dt.strftime("%Y-%m-%d") identifier = int(ttime.time()) temp_file_path = 'export/invoices/%s_temp.csv' % identifier default_storage.save(temp_file_path, ContentFile('')) # start the process subprocess.Popen([python_executable(), "manage.py", "invoice_export_process", '--start_dt=%s' % start_dt, '--end_dt=%s' % end_dt, '--identifier=%s' % identifier, '--user=%s' % request.user.id]) # log an event EventLog.objects.log() return redirect('invoice.export_status', identifier) else: end_dt = datetime.now() start_dt = end_dt - timedelta(days=30) context = {'start_dt': start_dt, 'end_dt': end_dt} return render_to_response(template_name, context, RequestContext(request))
def index(request, template_name="wp_importer/index.html"): if "tendenci.apps.articles" not in settings.INSTALLED_APPS: raise MissingApp( _('Oops, you must install Articles so that we can import your posts from WordPress!' )) if request.method == 'POST': form = BlogImportForm(request.POST, request.FILES) try: if form.is_valid() and request.FILES['blog'].name.endswith( 'xml') and request.FILES[ 'blog'].size < 20 * 1024 * 1024 and request.user: upload = form.save(commit=False) upload.author = request.user upload = form.save() file_name = os.path.join(settings.MEDIA_ROOT, 'blogimport', request.FILES['blog'].name) result = WPImportTask.delay(file_name, request.user) #uncomment the next line if there is no celery server yet. #result.wait() subprocess.Popen( [python_executable(), 'manage.py', 'celeryd_detach']) return redirect("detail", result.task_id) elif not request.FILES['blog'].name.endswith('xml'): messages.add_message(request, messages.INFO, _('Oops, only upload XML files!')) elif not request.FILES['blog'].size < 20 * 1024 * 1024: messages.add_message( request, messages.INFO, _('Oops, only upload files smaller than 20 MB!')) except ValueError: messages.add_message( request, messages.INFO, _('Oops, please login before uploading a blog!')) return redirect('auth_login') else: form = BlogImportForm() return render_to_response(template_name, {'form': form}, context_instance=RequestContext(request))
def update_tendenci(request, template_name="base/update.html"): from tendenci.apps.base.utils import get_latest_version if request.method == "POST": tos = request.POST.get('tos') if tos: SubProcessManager.set_process([ python_executable(), "manage.py", "auto_update", "--user_id=%s" % request.user.id ]) return redirect('update_tendenci.confirmation') return render_to_response(template_name, { 'latest_version': get_latest_version(), 'version': version, }, context_instance=RequestContext(request))
def index(request, template_name="wp_importer/index.html"): if "tendenci.apps.articles" not in settings.INSTALLED_APPS: raise MissingApp(_('Oops, you must install Articles so that we can import your posts from WordPress!')) if request.method == 'POST': form = BlogImportForm(request.POST, request.FILES) try: if form.is_valid() and request.FILES['blog'].name.endswith('xml') and request.FILES['blog'].size < 20*1024*1024 and request.user: upload = form.save(commit=False) upload.author = request.user upload = form.save() file_name = os.path.join(settings.MEDIA_ROOT, 'blogimport', request.FILES['blog'].name) result = WPImportTask.delay(file_name, request.user) #uncomment the next line if there is no celery server yet. #result.wait() subprocess.Popen([python_executable(), 'manage.py', 'celeryd_detach']) return redirect("detail", result.task_id) elif not request.FILES['blog'].name.endswith('xml'): messages.add_message( request, messages.INFO, _('Oops, only upload XML files!') ) elif not request.FILES['blog'].size < 20*1024*1024: messages.add_message( request, messages.INFO, _('Oops, only upload files smaller than 20 MB!') ) except ValueError: messages.add_message(request, messages.INFO, _('Oops, please login before uploading a blog!')) return redirect('auth_login') else: form = BlogImportForm() return render_to_response(template_name, {'form':form}, context_instance=RequestContext(request))
def export(request, template_name="articles/export.html"): """Export Profiles""" if not request.user.profile.is_staff: raise Http403 if request.method == "POST" and "download" in request.POST: identifier = int(time.time()) temp_file_path = 'export/articles/%s_temp.csv' % identifier default_storage.save(temp_file_path, ContentFile('')) # start the process subprocess.Popen([python_executable(), "manage.py", "articles_export_process", '--identifier=%s' % identifier, '--user=%s' % request.user.id]) # log an event EventLog.objects.log() return HttpResponseRedirect(reverse('article.export_status', args=[identifier])) return render_to_resp(request=request, template_name=template_name)
def export(request, template_name="articles/export.html"): """Export Profiles""" if not request.user.profile.is_staff: raise Http403 if request.method == "POST" and "download" in request.POST: identifier = int(time.time()) temp_file_path = 'export/articles/%s_temp.csv' % identifier default_storage.save(temp_file_path, ContentFile('')) # start the process subprocess.Popen([python_executable(), "manage.py", "articles_export_process", '--identifier=%s' % identifier, '--user=%s' % request.user.id]) # log an event EventLog.objects.log() return HttpResponseRedirect(reverse('article.export_status', args=[identifier])) return render_to_resp(request=request, template_name=template_name)
def run_export_task(app_label, model_name, fields, **kwargs): export = Export.objects.create(app_label=app_label, model_name=model_name) if settings.USE_SUBPROCESS: args = [ python_executable(), 'manage.py', 'run_export_task', str(export.pk) ] + fields start_dt = kwargs.get('start_dt', None) end_dt = kwargs.get('end_dt', None) include_files = kwargs.get('include_files', None) if start_dt and end_dt: args += ['--start_dt', start_dt, '--end_dt', end_dt] if include_files: args += ['--include_files', include_files] subprocess.Popen(args) else: from django.core.management import call_command args = [str(export.pk)] + fields call_command('run_export_task', *args, **kwargs) return export.pk
def sitemap(request, sitemaps, section=None, template_name='sitemap.xml', mimetype='application/xml'): #req_protocol = 'https' if request.is_secure() else 'http' req_protocol = get_setting('site', 'global', 'siteurl').split(':')[0] req_site = get_current_site(request) if section is not None: if section not in sitemaps: raise Http404(_("No sitemap available for section: %r" % section)) maps = [sitemaps[section]] else: maps = sitemaps.values() page = request.GET.get("p", 1) urls = [] cached = False for site in maps: try: if callable(site): site = site() site_key = site.__class__.__name__ else: site_key = site.__name__ # Cache the sitemap urls sitemap_cache_key = '.'.join([settings.SITE_CACHE_KEY, 'sitemap_cache', site_key, req_protocol]) site_urls = cache.get(sitemap_cache_key) if not isinstance(site_urls, list): if not cached: subprocess.Popen([python_executable(), 'manage.py', 'sitemap_cache']) cached = True site_urls = site.get_urls(page=page, site=req_site, protocol=req_protocol) cache.set(sitemap_cache_key, list(site_urls), 86400) urls.extend(site_urls) except EmptyPage: raise Http404("Page %s empty" % page) except PageNotAnInteger: raise Http404("No page '%s'" % page) return TemplateResponse(request, template_name, {'urlset': urls}, content_type=mimetype)
def index(request, form_class=ExportForm, template_name="wp_exporter/index.html"): if not request.user.profile.is_superuser: raise Http403 if request.method == "POST": form = form_class(request.POST) if form.is_valid(): result = WPExportTask.delay(form, request.user) #uncomment the next line if there is no celery server yet. #result.wait() subprocess.Popen( [python_executable(), 'manage.py', 'celeryd_detach']) return redirect("export_detail", result.task_id) else: form = form_class() return render_to_response(template_name, { 'form': form, }, context_instance=RequestContext(request))
def handle_uploaded_photo(request, photoset_id, file_path): import uuid from django.core.files import File from django.db.models import Max from tendenci.apps.perms.object_perms import ObjectPermission photo = Image() # use file name to create title; remove extension filename, extension = os.path.splitext(os.path.basename(file_path)) photo.title = filename # clean filename; alphanumeric with dashes filename = re.sub(r'[^a-zA-Z0-9._]+', '-', filename) # truncate; make unique; append extension filename = filename[:70] + '-' + unicode(uuid.uuid1())[:5] + extension photo.image.save(filename, File(open(file_path, 'rb'))) position_max = Image.objects.filter( photoset=photoset_id).aggregate(Max('position'))['position__max'] or 0 photo.position = position_max + 1 photo.status = True photo.status_detail = 'active' photo.member = request.user photo.safetylevel = 3 photo.is_public = True photo.allow_anonymous_view = True # Can't use update_perms_and_save() here since we don't have a form #photo = update_perms_and_save(request, photo_form, photo) photo.creator = request.user photo.creator_username = request.user.username photo.owner = request.user photo.owner_username = request.user.username photo.allow_user_view = False photo.allow_user_edit = False photo.allow_member_view = False photo.allow_member_edit = False photo.save() assign_files_perms(photo) EventLog.objects.log(**{ 'event_id': 990100, 'event_data': '%s (%d) added by %s' % (photo._meta.object_name, photo.pk, request.user), 'description': '%s added' % photo._meta.object_name, 'user': request.user, 'request': request, 'instance': photo, }) # add to photo set if photo set is specified if photoset_id: photo_set = get_object_or_404(PhotoSet, id=photoset_id) photo_set.image_set.add(photo) privacy = get_privacy_settings(photo_set) # photo privacy = album privacy for k, v in privacy.items(): setattr(photo, k, v) photo.save() # photo group perms = album group perms group_perms = photo_set.perms.filter(group__isnull=False).values_list('group', 'codename') group_perms = tuple([(unicode(g), c.split('_')[0]) for g, c in group_perms]) ObjectPermission.objects.assign_group(group_perms, photo) # serialize queryset data = serializers.serialize("json", Image.objects.filter(id=photo.id)) cache_image = Popen([python_executable(), "manage.py", "precache_photo", str(photo.pk)])
def send_to_recipients(self): subprocess.Popen([python_executable(), "manage.py", "send_newsletter", str(self.pk)])
def handle_uploaded_photo(request, photoset_id, file_path): import uuid from django.core.files import File from django.db.models import Max from tendenci.apps.perms.object_perms import ObjectPermission photo = Image() # use file name to create title; remove extension filename, extension = os.path.splitext(os.path.basename(file_path)) photo.title = filename # clean filename; alphanumeric with dashes filename = re.sub(r'[^a-zA-Z0-9._]+', '-', filename) # truncate; make unique; append extension filename = filename[:70] + '-' + str(uuid.uuid4())[:5] + extension photo.image.save(filename, File(open(file_path, 'rb'))) position_max = Image.objects.filter(photoset=photoset_id).aggregate( Max('position'))['position__max'] or 0 photo.position = position_max + 1 photo.status = True photo.status_detail = 'active' photo.member = request.user photo.safetylevel = 3 photo.is_public = True photo.allow_anonymous_view = True # Can't use update_perms_and_save() here since we don't have a form #photo = update_perms_and_save(request, photo_form, photo) photo.creator = request.user photo.creator_username = request.user.username photo.owner = request.user photo.owner_username = request.user.username photo.allow_user_view = False photo.allow_user_edit = False photo.allow_member_view = False photo.allow_member_edit = False photo.save() assign_files_perms(photo) EventLog.objects.log( **{ 'event_id': 990100, 'event_data': '%s (%d) added by %s' % (photo._meta.object_name, photo.pk, request.user), 'description': '%s added' % photo._meta.object_name, 'user': request.user, 'request': request, 'instance': photo, }) # add to photo set if photo set is specified if photoset_id: photo_set = get_object_or_404(PhotoSet, id=photoset_id) photo_set.image_set.add(photo) privacy = get_privacy_settings(photo_set) # photo privacy = album privacy for k, v in privacy.items(): setattr(photo, k, v) photo.save() # photo group perms = album group perms group_perms = photo_set.perms.filter(group__isnull=False).values_list( 'group', 'codename') group_perms = tuple([(str(g), c.split('_')[0]) for g, c in group_perms]) ObjectPermission.objects.assign_group(group_perms, photo) # serialize queryset #data = serializers.serialize("json", Image.objects.filter(id=photo.id)) Popen([python_executable(), "manage.py", "precache_photo", str(photo.pk)])
def handle(self, *args, **options): from tendenci.apps.site_settings.utils import get_setting from tendenci import __version__ as version from tendenci.apps.base.utils import get_latest_version verbosity = int(options['verbosity']) user_id = options['user_id'] if user_id: [request_user] = User.objects.filter(pk=user_id)[:1] or [None] else: request_user = None site_url = get_setting('site', 'global', 'siteurl') # check what tendenci version we're on major_bit = int(version.split('.')[0]) if major_bit < 7: if verbosity > 1: print("No update for this version {}.".format(version)) print( "Please consider to upgrade https://tendenci.readthedocs.org/en/latest/" ) return project_root = settings.PROJECT_ROOT err_list = [] # check the latest version latest_version = get_latest_version() if int(latest_version.split('.')[0]) < 7 or version == latest_version: # STOP - NO UPDATE return if verbosity > 1: print("Latest version: {}".format(latest_version)) print("Your version: {}".format(version)) print("Start updating...") # update some files - deploy.py, requirements/tendenci.txt files_to_update = { 'deploy.py': 'https://raw.githubusercontent.com/tendenci/tendenci-project-template/master/deploy.py', 'requirements/tendenci.txt': 'https://raw.githubusercontent.com/tendenci/tendenci-project-template/master/requirements/tendenci.txt' } for key, value in files_to_update.items(): try: subprocess.check_output('curl {0} > {1}/{2}'.format( value, project_root, key), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) # update tendenci if not err_list: try: if verbosity > 1: print("Updating tendenci...") update_cmd = '{0} -m pip install -r {1}/{2} --upgrade'.format( python_executable(), project_root, 'requirements/tendenci.txt') subprocess.check_output('cd {}; {}'.format( project_root, update_cmd), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run migrate, collectstatic, etc via deploy.py try: subprocess.check_output("cd {0}; {1} manage.py migrate".format( latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: known_error = "BadMigrationError: Migrated app 'djcelery' contains South migrations" known_error2 = 'relation "djcelery_crontabschedule" already exists' if known_error in e.output or known_error2 in e.output: try: subprocess.check_output( "cd {0}; {1} manage.py migrate djcelery 0001 --fake" .format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) subprocess.check_output( "cd {0}; {1} manage.py migrate".format( latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run deploy.py try: subprocess.check_output("cd {0}; {1} deploy.py".format( latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: if verbosity > 1: print('Reloading the site...') # reload the site. # it's a guessing game here - because we don't know what wsgi server the site is behind # and how exactly the site was set up try: subprocess.check_output( "sudo reload %s" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: try: subprocess.check_output( "sudo sv kill tendenci_site && sv start tendenci_site", stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if verbosity > 1: if err_list: print( 'Sorry, updating tendenci is not complete due to the following error(s):\n\n' ) print('\n\n'.join(err_list)) else: print("Update is done.") if request_user and request_user.email: # notify update is done if err_list: subject = 'Error on updating tendenci %s' % site_url body = 'Error(s) encountered on updating tendenci:\n\n' body += '\n\n'.join(err_list) else: subject = 'Update tendenci is done %s' % site_url body = 'Successfully updated tendenci for %s.\n\n' % site_url body += 'Tendenci version: %s\n\n' % latest_version body += "Thanks!\n%s\n\n" % get_setting('site', 'global', 'sitedisplayname') msg = EmailMessage(subject, body, settings.DEFAULT_FROM_EMAIL, [request_user.email]) msg.send()
def handle(self, *args, **options): from tendenci.apps.site_settings.utils import get_setting from tendenci import __version__ as version from tendenci.apps.base.utils import get_latest_version verbosity = int(options['verbosity']) user_id = options['user_id'] if user_id: [request_user] = User.objects.filter(pk=user_id)[:1] or [None] else: request_user = None site_url = get_setting('site', 'global', 'siteurl') # check what tendenci version we're on major_bit = int(version.split('.')[0]) if major_bit < 7: if verbosity >1: print("No update for this version {}.".format(version)) print("Please consider to upgrade https://tendenci.readthedocs.org/en/latest/") return project_root = settings.PROJECT_ROOT err_list = [] # check the latest version latest_version = get_latest_version() if int(latest_version.split('.')[0]) < 7 or version == latest_version: # STOP - NO UPDATE return if verbosity >1: print("Latest version: {}".format(latest_version)) print("Your version: {}".format(version)) print("Start updating...") # update requirements/tendenci.txt files_to_update = {'requirements/tendenci.txt': 'https://raw.githubusercontent.com/tendenci/tendenci-project-template/master/requirements/tendenci.txt'} for key, value in files_to_update.items(): try: subprocess.check_output('curl {0} > {1}/{2}'.format(value, project_root, key), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) # update tendenci if not err_list: try: if verbosity >1: print("Updating tendenci...") update_cmd = '{0} -m pip install -r {1}/{2} --upgrade'.format(python_executable(), project_root, 'requirements/tendenci.txt') subprocess.check_output('cd {}; {}'.format(project_root, update_cmd), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run migrate try: subprocess.check_output("cd {0}; {1} manage.py migrate".format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: known_error = "BadMigrationError: Migrated app 'djcelery' contains South migrations" known_error2 = 'relation "djcelery_crontabschedule" already exists' if known_error in e.output or known_error2 in e.output: try: subprocess.check_output("cd {0}; {1} manage.py migrate djcelery 0001 --fake".format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) subprocess.check_output("cd {0}; {1} manage.py migrate".format(latest_version, python_executable()), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if not err_list: # run collectstatic, etc via deploy try: call_command('deploy') except CommandError as e: err_list.append(e.output) if not err_list: if verbosity >1: print('Reloading the site...') # reload the site. # it's a guessing game here - because we don't know what wsgi server the site is behind # and how exactly the site was set up try: subprocess.check_output("sudo reload %s" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: try: subprocess.check_output("sudo sv kill tendenci_site && sv start tendenci_site", stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: err_list.append(e.output) if verbosity >1: if err_list: print('Sorry, updating tendenci is not complete due to the following error(s):\n\n') print('\n\n'.join(err_list)) else: print("Update is done.") if request_user and request_user.email: # notify update is done if err_list: subject = 'Error on updating tendenci %s' % site_url body = 'Error(s) encountered on updating tendenci:\n\n' body += '\n\n'.join(err_list) else: subject = 'Update tendenci is done %s' % site_url body = 'Successfully updated tendenci for %s.\n\n' % site_url body += 'Tendenci version: %s\n\n' % latest_version body += "Thanks!\n%s\n\n" % get_setting('site', 'global', 'sitedisplayname') msg = EmailMessage(subject, body, settings.DEFAULT_FROM_EMAIL, [request_user.email]) msg.send()
def handle(self, *args, **options): from tendenci.apps.site_settings.utils import get_setting pass_update_tendenci = False pass_update_tendenci_site = False is_uwsgi = False gunicorn_error_msg = None uwsgi_error_msg = None errors_list = [] pypi = xmlrpc_client.ServerProxy('http://pypi.python.org/pypi') latest_version = pypi.package_releases('tendenci')[0] error_message = "" email_context = {'site_url':get_setting('site', 'global', 'siteurl'), 'version':latest_version, 'error_message':error_message} email_sender = get_setting('site', 'global', 'siteemailnoreplyaddress') or settings.DEFAULT_FROM_EMAIL email_recipient = "" user_id = options['user'] if User.objects.filter(pk=user_id).exists(): user = User.objects.get(pk=user_id) if user.email: email_recipient = user.email try: print("Updating tendenci") subprocess.check_output("%s -m pip install tendenci --upgrade" % python_executable(), stderr=subprocess.STDOUT, shell=True) pass_update_tendenci = True except subprocess.CalledProcessError as e: errors_list.append(e.output) # run deploy iff update_tendenci is successful if pass_update_tendenci: try: print("Updating tendenci site") call_command('deploy') pass_update_tendenci_site = True except CommandError as e: errors_list.append(e.output) # run reload if update is done if pass_update_tendenci_site: try: print("Restarting Server") subprocess.check_output("sudo reload %s" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: gunicorn_error_msg = e.output if "reload: Unknown job:" in e.output: is_uwsgi = True # run usgi command iff it was proven that the site is using uwsgi instead if is_uwsgi: try: print("Restarting Server") subprocess.check_output("sudo touch /etc/uwsgi/vassals/%s.ini" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: uwsgi_error_msg = e.output if gunicorn_error_msg and uwsgi_error_msg: errors_list.append(uwsgi_error_msg) errors_list.append(gunicorn_error_msg) try: print("Clearing cache") call_command('clear_cache') except CommandError as e: errors_list.append(e.output) email_context['errors_list'] = errors_list if email_recipient: subject = render_to_string(template_name='notification/update_tendenci_notice/short.txt', context=email_context) subject = subject.strip('\n').strip('\r') body = render_to_string(template_name='notification/update_tendenci_notice/full.html', context=email_context) email = EmailMessage() email.subject = subject email.body = body email.from_email = email_sender email.to = [email_recipient] email.content_subtype = 'html' email.send()
def handle(self, *args, **options): from tendenci.apps.site_settings.utils import get_setting pass_update_tendenci = False pass_update_tendenci_site = False is_uwsgi = False gunicorn_error_msg = None uwsgi_error_msg = None errors_list = [] pypi = xmlrpc_client.ServerProxy('http://pypi.python.org/pypi') latest_version = pypi.package_releases('tendenci')[0] error_message = "" email_context = { 'site_url': get_setting('site', 'global', 'siteurl'), 'version': latest_version, 'error_message': error_message } email_sender = get_setting( 'site', 'global', 'siteemailnoreplyaddress') or settings.DEFAULT_FROM_EMAIL email_recipient = "" user_id = options['user'] if user_id and User.objects.filter(pk=user_id).exists(): user = User.objects.get(pk=user_id) if user.email: email_recipient = user.email try: print("Updating tendenci") output = subprocess.check_output( "%s -m pip install -r requirements/tendenci.txt --upgrade" % python_executable(), stderr=subprocess.STDOUT, shell=True) print(output.decode()) pass_update_tendenci = True except subprocess.CalledProcessError as e: errors_list.append(e.output.decode()) # run deploy iff update_tendenci is successful if pass_update_tendenci: try: print("Updating tendenci site") call_command('migrate') call_command('deploy') pass_update_tendenci_site = True except CommandError as e: errors_list.append(e.output) # run reload if update is done if pass_update_tendenci_site: try: print("Restarting Server") subprocess.check_output( "sudo systemctl restart %s" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: gunicorn_error_msg = e.output.decode() if "reload: Unknown job:" in e.output.decode(): is_uwsgi = True # run usgi command iff it was proven that the site is using uwsgi instead if is_uwsgi: try: print("Restarting Server") subprocess.check_output( "sudo touch /etc/uwsgi/vassals/%s.ini" % os.path.basename(settings.PROJECT_ROOT), stderr=subprocess.STDOUT, shell=True) except subprocess.CalledProcessError as e: uwsgi_error_msg = e.output.decode() if gunicorn_error_msg and uwsgi_error_msg: errors_list.append(uwsgi_error_msg) errors_list.append(gunicorn_error_msg) try: print("Clearing cache") call_command('clear_cache') except CommandError as e: errors_list.append(e.output) email_context['errors_list'] = errors_list if email_recipient: subject = render_to_string( template_name='notification/update_tendenci_notice/short.txt', context=email_context) subject = subject.strip('\n').strip('\r') body = render_to_string( template_name='notification/update_tendenci_notice/full.html', context=email_context) email = EmailMessage() email.subject = subject email.body = body email.from_email = email_sender email.to = [email_recipient] email.content_subtype = 'html' email.send() else: for err in errors_list: print(err)
def send_to_recipients(self): subprocess.Popen([python_executable(), "manage.py", "send_newsletter", str(self.pk)])
def get_object(self, **kwargs): #invalidate('reports_run') obj = get_object_or_404(Run, pk=self.kwargs['pk'], report_id=self.kwargs['report_id']) if obj.status == "unstarted": subprocess.Popen([python_executable(), "manage.py", "process_report_run", str(obj.pk)]) return obj