示例#1
0
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
                          })
示例#2
0
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)
示例#3
0
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)
示例#4
0
文件: views.py 项目: goetzk/tendenci
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]))
示例#5
0
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)
示例#6
0
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]))
示例#7
0
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))
示例#8
0
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
示例#9
0
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
示例#10
0
    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)
示例#11
0
 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
示例#12
0
    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)
示例#13
0
文件: views.py 项目: goetzk/tendenci
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
示例#14
0
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
示例#15
0
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)
示例#16
0
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
示例#17
0
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)
示例#18
0
文件: views.py 项目: goetzk/tendenci
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))
示例#19
0
文件: views.py 项目: goetzk/tendenci
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))
示例#20
0
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))
示例#21
0
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,
    })
示例#22
0
文件: views.py 项目: goetzk/tendenci
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))
示例#23
0
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))
示例#24
0
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))
示例#25
0
文件: views.py 项目: goetzk/tendenci
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))
示例#26
0
文件: views.py 项目: zaid100/tendenci
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)
示例#27
0
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)
示例#28
0
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
示例#29
0
文件: views.py 项目: goetzk/tendenci
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)
示例#30
0
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))
示例#31
0
文件: views.py 项目: goetzk/tendenci
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)])
示例#32
0
 def send_to_recipients(self):
     subprocess.Popen([python_executable(), "manage.py",
                           "send_newsletter",
                           str(self.pk)])
示例#33
0
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)])
示例#34
0
    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()
示例#35
0
    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()
示例#36
0
    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()
示例#37
0
    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)
示例#38
0
文件: models.py 项目: goetzk/tendenci
 def send_to_recipients(self):
     subprocess.Popen([python_executable(), "manage.py",
                           "send_newsletter",
                           str(self.pk)])
示例#39
0
文件: views.py 项目: goetzk/tendenci
 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