Exemplo n.º 1
0
def scheduletasks(request):
    if not request.is_ajax() or request.method not in ("POST", "DELETE"):
        return HttpResponseNotAllowed(
            "Only post and delete ajax requests are allowed")
    try:
        data = json.loads(request.body.decode(request.encoding))
        oldname = data.get("oldname", None)
        name = data.get("name", None)
        if not name and not oldname:
            return HttpResponse("Missing name attribute", status=400)
        elif request.method == "POST":
            if not request.user.has_perm("execute.add_scheduledtask"):
                return HttpResponse("Couldn't add or update scheduled task",
                                    status=401)
            obj, created = ScheduledTask.objects.using(
                request.database).get_or_create(
                    name=oldname if oldname else name)
            if created:
                obj.user = request.user
            elif (not request.user.is_superuser
                  and obj.user.username != request.user.username):
                return HttpResponse(
                    "This task can only be updated by superusers and %s" %
                    obj.user.username,
                    status=401,
                )
            fld = data.get("email_failure", None)
            if fld:
                obj.email_failure = fld
            fld = data.get("email_success", None)
            if fld:
                obj.email_success = fld
            fld = data.get("data", None)
            if isinstance(fld, dict):
                obj.data = fld
            if oldname and name and oldname != name:
                # Rename the task
                obj.name = name
                ScheduledTask.objects.using(
                    request.database).filter(name=oldname).delete()
            obj.adjustForTimezone(-GridReport.getTimezoneOffset(request))
            obj.save(using=request.database)
            call_command("scheduletasks", database=request.database)
            obj.adjustForTimezone(GridReport.getTimezoneOffset(request))
            return HttpResponse(content=obj.next_run.strftime(
                "%Y-%m-%d %H:%M:%S") if obj.next_run else "")
        elif request.method == "DELETE":
            if not request.user.has_perm("execute.delete_scheduledtask"):
                return HttpResponse("Couldn't delete scheduled task",
                                    status=401)
            elif (ScheduledTask.objects.using(
                    request.database).filter(name=name).delete()[0]):
                return HttpResponse(content="OK")
            else:
                return HttpResponse("Couldn't delete scheduled task",
                                    status=400)
    except Exception as e:
        logger.error("Error updating scheduled task: %s" % e)
        return HttpResponseServerError("Error updating scheduled task")
Exemplo n.º 2
0
 def getHTML(request):
     commands = []
     for commandname, appname in get_commands().items():
         if commandname != "scheduletasks":
             try:
                 cmd = getattr(
                     import_module("%s.management.commands.%s" %
                                   (appname, commandname)),
                     "Command",
                 )
                 if getattr(cmd, "index", -1) >= 0 and getattr(
                         cmd, "getHTML", None):
                     commands.append((cmd.index, commandname))
             except Exception:
                 pass
     commands = [i[1] for i in sorted(commands)]
     schedules = [
         s.adjustForTimezone(GridReport.getTimezoneOffset(request))
         for s in ScheduledTask.objects.all().using(
             request.database).order_by("name")
     ]
     schedules.append(ScheduledTask())  # Add an empty template
     return render_to_string(
         "commands/scheduletasks.html",
         {
             "schedules": schedules,
             "commands": commands
         },
         request=request,
     )
Exemplo n.º 3
0
    def getHTML(request):

        if (
            "FILEUPLOADFOLDER" not in settings.DATABASES[request.database]
            or not not settings.EMAIL_HOST
            or not request.user.is_superuser
        ):
            return None

        # Function to convert from bytes to human readabl format
        def sizeof_fmt(num):
            for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
                if abs(num) < 1024.0:
                    return "%3.1f%sB" % (num, unit)
                num /= 1024.0
            return "%.1f%sB" % (num, "Yi")

        # List available data files
        filesexported = []
        all_reports = []
        if "FILEUPLOADFOLDER" in settings.DATABASES[request.database]:
            exportfolder = os.path.join(
                settings.DATABASES[request.database]["FILEUPLOADFOLDER"], "export"
            )
            if os.path.isdir(exportfolder):
                tzoffset = GridReport.getTimezoneOffset(request)
                for file in os.listdir(exportfolder):
                    if file.endswith((".xlsx", ".xlsx.gz", ".csv", ".csv.gz", ".log")):
                        all_reports.append(file)
                        filesexported.append(
                            [
                                file,
                                strftime(
                                    "%Y-%m-%d %H:%M:%S",
                                    localtime(
                                        os.stat(
                                            os.path.join(exportfolder, file)
                                        ).st_mtime
                                        + tzoffset.total_seconds()
                                    ),
                                ),
                                sizeof_fmt(
                                    os.stat(os.path.join(exportfolder, file)).st_size
                                ),
                                file.replace(".", "\\\\."),
                            ]
                        )

        return render_to_string(
            "commands/emailreport.html",
            {
                "filesexported": filesexported,
                "user_email": request.user.email,
                "all_reports": ",".join(map(str, all_reports)),
                "initially_disabled": "" if len(all_reports) > 0 else "disabled",
            },
            request=request,
        )
Exemplo n.º 4
0
    def getHTML(request):

        if (
            "FILEUPLOADFOLDER" not in settings.DATABASES[request.database]
            or not request.user.is_superuser
        ):
            return None

        # Function to convert from bytes to human readable format
        def sizeof_fmt(num):
            for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
                if abs(num) < 1024.0:
                    return "%3.0f %sB" % (num, unit)
                num /= 1024.0
            return "%.0f %sB" % (num, "Yi")

        filestoupload = []
        if "FILEUPLOADFOLDER" in settings.DATABASES[request.database]:
            uploadfolder = settings.DATABASES[request.database]["FILEUPLOADFOLDER"]
            if os.path.isdir(uploadfolder):
                tzoffset = GridReport.getTimezoneOffset(request)
                for file in sorted(os.listdir(uploadfolder)):
                    if file.endswith(
                        (
                            ".csv",
                            ".csv.gz",
                            ".xlsx",
                            ".xlsm",
                            ".cpy",
                            ".sql",
                            ".cpy.gz",
                            ".sql.gz",
                        )
                    ):
                        filestoupload.append(
                            [
                                file,
                                strftime(
                                    "%Y-%m-%d %H:%M:%S",
                                    localtime(
                                        os.stat(
                                            os.path.join(uploadfolder, file)
                                        ).st_mtime
                                        + tzoffset.total_seconds()
                                    ),
                                ),
                                sizeof_fmt(
                                    os.stat(os.path.join(uploadfolder, file)).st_size
                                ),
                            ]
                        )

        return render_to_string(
            "commands/importfromfolder.html",
            {"filestoupload": filestoupload},
            request=request,
        )
Exemplo n.º 5
0
    def getHTML(request):

        if ("FILEUPLOADFOLDER" in settings.DATABASES[request.database]
                and request.user.is_superuser):
            # Function to convert from bytes to human readabl format
            def sizeof_fmt(num):
                for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
                    if abs(num) < 1024.0:
                        return "%3.1f%sB" % (num, unit)
                    num /= 1024.0
                return "%.1f%sB" % (num, "Yi")

            # List available data files
            filesexported = []
            all_reports = []
            if "FILEUPLOADFOLDER" in settings.DATABASES[request.database]:
                exportfolder = os.path.join(
                    settings.DATABASES[request.database]["FILEUPLOADFOLDER"],
                    "export")
                if os.path.isdir(exportfolder):
                    tzoffset = GridReport.getTimezoneOffset(request)
                    for file in os.listdir(exportfolder):
                        if file.endswith((".csv", ".csv.gz", ".log")):
                            all_reports.append(file)
                            filesexported.append([
                                file,
                                strftime(
                                    "%Y-%m-%d %H:%M:%S",
                                    localtime(
                                        os.stat(
                                            os.path.join(exportfolder,
                                                         file)).st_mtime +
                                        tzoffset.total_seconds()),
                                ),
                                sizeof_fmt(
                                    os.stat(os.path.join(exportfolder,
                                                         file)).st_size),
                                file.split(".")[0],
                            ])

            context = RequestContext(
                request,
                {
                    "filesexported":
                    filesexported,
                    "user_email":
                    request.user.email,
                    "all_reports":
                    ",".join(map(str, all_reports)),
                    "initially_disabled":
                    "" if len(all_reports) > 0 else "disabled",
                },
            )

            template = Template("""
        {% load i18n %}
        <form role="form" method="post" action="{{request.prefix}}/execute/launch/emailreport/">{% csrf_token %}
          <table>
            <tr>
              <td style="vertical-align:top; padding-left: 15px">
                <button type="submit" class="btn btn-primary" id="emailreport" value="email" {{initially_disabled}}>{% trans "email"|capfirst %}</button>
              </td>
              <td colspan='5' style="padding-left: 15px;">
                <p>{% trans "Emails the selected reports to a comma separated list of recipients. Files are zipped and attached to email." %}</p>
              </td>
            </tr>
            <tr>
              <td></td>
              <td><div>
                   <input type="checkbox" id="allcheckboxes" checked>
                   <strong>{% trans 'file name'|capfirst %}</strong></td>
                   </div>
              <td><strong>{% trans 'size'|capfirst %}</strong></td>
              <td><strong>{% trans 'last modified'|capfirst %}</strong></td>
              <td></td>
            </tr></form>
            {% for j in filesexported %}
            <tr data-file="{{j.0}}">
              <td></td>
              <td>
                  <input type="checkbox" id="{{j.3}}" checked>
                  {{j.0}}
              </td>
              <td>{{j.2}}</td>
              <td>{{j.1}}</td>
            </tr>
            {% endfor %}
            <tr>
                <td style="padding-left:15px; padding-top:10px"><strong>{% trans 'emails'|capfirst %}:</strong>
                </td>
                <td style="padding-top:10px" colspan="3">
                <input type="email" class="form-control" id="emails" name="recipient" multiple value="{{user_email}}">
                </td>
            </tr>
          </table>
          <input type="hidden" name="report" id="report" value="{{all_reports}}">
        </form>
        <script>
        function validateButton() {
            var reports = "";
            var first = true;
            {% for j in filesexported %}
              if ($('#{{j.3}}').is(':checked')) {
                  if (first) {
                    reports = reports + "{{j.0}}";
                    first = false
                  }
                  else {
                    reports = reports + ",{{j.0}}";
                  }
              }
            {% endfor %}
            $("#report").val(reports);
            var oneChecked = false;
            {% for j in filesexported %}
              oneChecked = oneChecked || $('#{{j.3}}').is(':checked');
            {% endfor %}
            var testEmail = /^([\w+-.%]+@[\w-.]+\.[A-Za-z]{2,},?)+$/;
            emails_ok = $("#emails").val() != '' && testEmail.test($("#emails").val());
            if (!emails_ok) {
               $("#emails").attr('data-original-title', '{% trans 'please correct invalid email addresses'|capfirst %}');
               $('#emails').tooltip('show');
            }
            else {
               $("#emails").tooltip('hide').attr('data-original-title', '{% trans 'please enter email addresses'|capfirst %}');
            }
            $('#emailreport').prop('disabled', !(oneChecked && emails_ok));

        }
        $("#emails").on('input', function () {
            validateButton();
        });
        $("#allcheckboxes").on("click", function(event) {
            var isChecked = $('#allcheckboxes').is(':checked');
            {% for j in filesexported %}
            $("#{{j.3}}").prop("checked", isChecked);
            {% endfor %}
            validateButton();
        });
        {% for j in filesexported %}
        $("#{{j.3}}").on("click", function(event) {
            var allChecked = true;
            {% for j in filesexported %}
              allChecked = allChecked && $('#{{j.3}}').is(':checked');
            {% endfor %}
            $("#allcheckboxes").prop("checked", allChecked);
            validateButton();
        });
        {% endfor %}
        </script>
        """)
            return template.render(context)
            # A list of translation strings from the above
            translated = (
                _("email"),
                _("Emails the selected reports to a comma separated list of recipients. Files are zipped and attached to email."
                  ),
                _("file name"),
                _("size"),
                _("please correct invalid email addresses"),
                _("please enter email addresses"),
            )
        else:
            return None
Exemplo n.º 6
0
    def getHTML(request):

        if ("FILEUPLOADFOLDER" in settings.DATABASES[request.database]
                and request.user.is_superuser):
            # Function to convert from bytes to human readabl format
            def sizeof_fmt(num):
                for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
                    if abs(num) < 1024.0:
                        return "%3.1f%sB" % (num, unit)
                    num /= 1024.0
                return "%.1f%sB" % (num, "Yi")

            filestoupload = []
            if "FILEUPLOADFOLDER" in settings.DATABASES[request.database]:
                uploadfolder = settings.DATABASES[
                    request.database]["FILEUPLOADFOLDER"]
                if os.path.isdir(uploadfolder):
                    tzoffset = GridReport.getTimezoneOffset(request)
                    for file in os.listdir(uploadfolder):
                        if file.endswith((
                                ".csv",
                                ".csv.gz",
                                ".xlsx",
                                ".cpy",
                                ".sql",
                                ".cpy.gz",
                                ".sql.gz",
                        )):
                            filestoupload.append([
                                file,
                                strftime(
                                    "%Y-%m-%d %H:%M:%S",
                                    localtime(
                                        os.stat(
                                            os.path.join(uploadfolder,
                                                         file)).st_mtime +
                                        tzoffset.total_seconds()),
                                ),
                                sizeof_fmt(
                                    os.stat(os.path.join(uploadfolder,
                                                         file)).st_size),
                            ])

            context = RequestContext(request, {"filestoupload": filestoupload})

            template = Template("""
        {% load i18n %}
        <form role="form" method="post" action="{{request.prefix}}/execute/launch/importfromfolder/">{% csrf_token %}
          <table>
            <tr>
              <td style="vertical-align:top; padding-left: 15px">
                <button type="submit" class="btn btn-primary" id="importfromfolder" value="{% trans "import"|capfirst %}">{% trans "import"|capfirst %}</button>
              </td>
              <td colspan='5' style="padding-left: 15px;">
                <p>{% trans "Import CSV or Excel files from the data folder. The file names must match the names of data objects and the first line in the file must contain the field names." %}</p>
              </td>
            </tr>
            <tr>
              <td></td>
              <td><strong>{% trans 'file name'|capfirst %}</strong></td>
              <td><strong>{% trans 'size'|capfirst %}</strong></td>
              <td><strong>{% trans 'changed'|capfirst %}</strong></td>
              <td>
                <span class="btn btn-xs btn-primary" id="filescopy" style="margin-bottom: 5px;" data-toggle="tooltip" data-placement="top" data-original-title="{% trans 'Upload data files' %}"
                  onclick="import_show('{% trans 'Copy files to folder' %}',null,true,uploadfilesajax)">
                  <span class="fa fa-arrow-up"></span>
                </span>
              </td>
              <td>
                <div class="btn btn-xs btn-danger deletefile" style="margin-bottom: 5px;" id="allimportfilesdelete" data-toggle="tooltip" data-placement="top" data-original-title="{% trans 'Delete all files' %}" onClick="deleteImportFile(0, {{filestoupload}})">
                  <span class="fa fa-close"></span>
                </div>
              </td>
            </tr></form>
            {% for j in filestoupload %}
            <tr data-file="{{j.0}}">
              <td></td>
              <td>{{j.0}}</td>
              <td>{{j.2}}</td>
              <td>{{j.1}}</td>
              <td>
                <div class="btn btn-xs btn-primary downloadfile" style="margin-bottom: 5px;" id="filedownload" data-toggle="tooltip" data-placement="top" data-original-title="{% trans "Download file" %}" onClick="downloadImportFile(0, '{{j.0}}')">
                  <span class="fa fa-arrow-down"></span>
                </div>
              </td>
              <td>
                <div class="btn btn-xs btn-danger deletefile" style="margin-bottom: 5px;" id="filedelete" data-toggle="tooltip" data-placement="top" data-original-title="{% trans "Delete file" %}" onClick="deleteImportFile(0, '{{j.0}}')">
                  <span class="fa fa-close"></span>
                </div>
              </td>
            </tr>
            {% endfor %}
          </table>
        </form>
        <script>
        var xhr = {abort: function () {}};
        var uploadfilesajax = {
          url: '{{request.prefix}}/execute/uploadtofolder/0/',
          success: function (data) {
            var el = $('#uploadResponse');
            el.empty();
            $("#animatedcog").css('visibility','hidden');
            var lines = data.split('\\n');
            for (var i = 0; i < lines.length; i++) {
              el.append(lines[i] + '<br>');
            }
            if (el.attr('data-scrolled')!== "true") {
              el.attr('data-scrolled', el[0].scrollHeight - el.height());
              el.scrollTop(el[0].scrollHeight - el.height());
            }
            if (document.queryCommandSupported('copy'))
              $('#copytoclipboard').show();
            $('#canceluploadbutton').hide();
            $('#cancelimportbutton').hide();
            $('#cancelbutton').one('click', function() {location.reload();});
          },
          error: function (result, stat, errorThrown) {
            var el = $('#uploadResponse');
            el.empty();
            $("#animatedcog").css('visibility','hidden');
            var lines = result.responseText.split('\\n');
            for (var i = 0; i < lines.length; i++) {
              el.append(lines[i] + '<br>');
            }
            if (el.attr('data-scrolled')!== "true") {
              el.attr('data-scrolled', el[0].scrollHeight - el.height());
              el.scrollTop(el[0].scrollHeight - el.height());
            }
            if (document.queryCommandSupported('copy'))
              $('#copytoclipboard').show();
            $('#canceluploadbutton').hide();
            $('#cancelimportbutton').hide();
            }
        };

        function deleteImportFile(folder, filename) {
          $.jgrid.hideModal("#searchmodfbox_grid");
          var dialogcontent;
          if (typeof filename === 'object') {
            dialogcontent = "{% trans 'You are about to delete all files' %}";
            var oldfilename = filename;
            filename = 'AllFiles';
          } else {
            dialogcontent = interpolate("{% trans 'You are about to delete file %s' %}", [filename]);
          }

          $("#popup").html('<div class="modal-dialog">'+
            '<div class="modal-content">'+
              '<div class="modal-header">'+
                '<h4 class="modal-title">{% trans 'Delete file' %}</h4>'+
              '</div>'+
              '<div class="modal-body"><p>'+
              dialogcontent +
              '</p></div>'+
              '<div class="modal-footer">'+
                '<input type="submit" id="confirmbutton" role="button" class="btn btn-danger pull-left" value="{% trans 'Confirm' %}">'+
                '<input type="submit" id="cancelbutton" role="button" class="btn btn-primary pull-right" data-dismiss="modal" value="{% trans 'Cancel' %}">'+
              '</div>'+
            '</div>'+
          '</div>' )
          .modal('show');

          $('#confirmbutton').on('click', function() {
            $.ajax({
              url: "{{request.prefix}}/execute/deletefromfolder/" + folder + "/" + filename + "/",
              type:  ("delete").toUpperCase(),
              success: function () {
                if (filename === 'AllFiles') {
                  $("#popup .modal-body>p").text("{% trans 'All data files were deleted' %}");
                } else {
                  $("#popup .modal-body>p").text(interpolate("{% trans 'File %s was deleted' %}", [filename]));
                }
                $('#confirmbutton').hide();
                $('#cancelbutton').attr('value', "{% trans 'Close' %}");
                $('#cancelbutton').one('click', function() {$("#popup").hide();});
                location.reload();
              },
              error: function (result, stat, errorThrown) {
                var filelist = result.responseText.split(' / ');
                var elem = $("#popup .modal-body>p");
                if (filelist.length === 1) {
                  elem.text(interpolate("{% trans 'File %s was not deleted' %}", [filename]));
                } else {
                  for (var i = 1; i < filelist.length; i++) {
                    if (i === 1) {
                      elem.text(interpolate("{% trans 'File %s was not deleted' %}", [filelist[i]]));
                    } else {
                      elem.parent().append('<p>'+interpolate("{% trans "File %s was not deleted" %}", [filelist[i]])+'</p>');
                    }
                  }
                }
                $("#popup .modal-body>p").addClass('alert alert-danger');
                $('#confirmbutton').hide();
                $('#cancelbutton').attr('value', "{% trans 'Close' %}");
                $('#cancelbutton').one('click', function() {$("#popup").hide();});
                }
            })
          })
        }
        function downloadImportFile(folder, filename) {
          $.jgrid.hideModal("#searchmodfbox_grid");
          window.open("{{request.prefix}}/execute/downloadfromfolder/" + folder + "/" + filename + '/', '_blank');
        }
        </script>
        """)
            return template.render(context)
            # A list of translation strings from the above
            translated = (
                _("export"),
                _("file name"),
                _("size"),
                _("changed"),
                _("Delete all files"),
                _("Delete file"),
                _("Upload data files"),
                _("Download file"),
                _("Import CSV or Excel files from the data folder. The file names must match the names of data objects and the first line in the file must contain the field names."
                  ),
                _("File %s was not deleted"),
                _("Close"),
                _("File %s was deleted"),
                _("All data files were deleted"),
                _("You are about to delete all files"),
                _("You are about to delete file %s"),
                _("Delete file"),
                _("Confirm"),
                _("Cancel"),
            )
        else:
            return None
Exemplo n.º 7
0
    def getHTML(request):

        database = request.database
        ftp_protocol = (settings.FTP_PROTOCOL[database]
                        if isinstance(settings.FTP_PROTOCOL, dict)
                        and database in settings.FTP_PROTOCOL else
                        (None if isinstance(settings.FTP_PROTOCOL, dict) else
                         settings.FTP_PROTOCOL))

        ftp_host = (settings.FTP_HOST[database]
                    if isinstance(settings.FTP_HOST, dict)
                    and database in settings.FTP_HOST else (None if isinstance(
                        settings.FTP_HOST, dict) else settings.FTP_HOST))

        ftp_port = (settings.FTP_PORT[database]
                    if isinstance(settings.FTP_PORT, dict)
                    and database in settings.FTP_PORT else (None if isinstance(
                        settings.FTP_PORT, dict) else settings.FTP_PORT))

        ftp_user = (settings.FTP_USER[database]
                    if isinstance(settings.FTP_USER, dict)
                    and database in settings.FTP_USER else (None if isinstance(
                        settings.FTP_USER, dict) else settings.FTP_USER))

        ftp_password = (settings.FTP_PASSWORD[database]
                        if isinstance(settings.FTP_PASSWORD, dict)
                        and database in settings.FTP_PASSWORD else
                        (None if isinstance(settings.FTP_PASSWORD, dict) else
                         settings.FTP_PASSWORD))

        ftp_folder = (settings.FTP_FOLDER[database]
                      if isinstance(settings.FTP_FOLDER, dict)
                      and database in settings.FTP_FOLDER else
                      (None if isinstance(settings.FTP_FOLDER, dict) else
                       settings.FTP_FOLDER))

        if ("FILEUPLOADFOLDER" not in settings.DATABASES[request.database]
                or not ftp_host or not ftp_user or not ftp_password
                or not ftp_port or not ftp_protocol or not ftp_folder
                or not request.user.is_superuser):
            return None

        # Function to convert from bytes to human readabl format
        def sizeof_fmt(num):
            for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
                if abs(num) < 1024.0:
                    return "%3.1f%sB" % (num, unit)
                num /= 1024.0
            return "%.1f%sB" % (num, "Yi")

        # List available data files
        filesexported = []
        all_reports = []
        if "FILEUPLOADFOLDER" in settings.DATABASES[request.database]:
            exportfolder = os.path.join(
                settings.DATABASES[request.database]["FILEUPLOADFOLDER"],
                "export")
            if os.path.isdir(exportfolder):
                tzoffset = GridReport.getTimezoneOffset(request)
                for file in os.listdir(exportfolder):
                    if file.endswith(
                        (".xlsx", ".xlsx.gz", ".csv", ".csv.gz", ".log")):
                        all_reports.append(file)
                        filesexported.append([
                            file,
                            strftime(
                                "%Y-%m-%d %H:%M:%S",
                                localtime(
                                    os.stat(os.path.join(exportfolder,
                                                         file)).st_mtime +
                                    tzoffset.total_seconds()),
                            ),
                            sizeof_fmt(
                                os.stat(os.path.join(exportfolder,
                                                     file)).st_size),
                            file.replace(".", "\\\\."),
                        ])

        return render_to_string(
            "commands/uploadreport.html",
            {
                "filesexported": filesexported,
                "all_reports": ",".join(map(str, all_reports)),
                "initially_disabled":
                "" if len(all_reports) > 0 else "disabled",
            },
            request=request,
        )
Exemplo n.º 8
0
    def getHTML(request):

        if ("FILEUPLOADFOLDER" in settings.DATABASES[request.database]
                and request.user.is_superuser):
            # Function to convert from bytes to human readabl format
            def sizeof_fmt(num):
                for unit in ["", "Ki", "Mi", "Gi", "Ti", "Pi", "Ei", "Zi"]:
                    if abs(num) < 1024.0:
                        return "%3.1f%sB" % (num, unit)
                    num /= 1024.0
                return "%.1f%sB" % (num, "Yi")

            # List available data files
            filesexported = []
            if "FILEUPLOADFOLDER" in settings.DATABASES[request.database]:
                exportfolder = os.path.join(
                    settings.DATABASES[request.database]["FILEUPLOADFOLDER"],
                    "export")
                if os.path.isdir(exportfolder):
                    tzoffset = GridReport.getTimezoneOffset(request)
                    for file in os.listdir(exportfolder):
                        if file.endswith((".csv", ".csv.gz", ".log")):
                            filesexported.append([
                                file,
                                strftime(
                                    "%Y-%m-%d %H:%M:%S",
                                    localtime(
                                        os.stat(
                                            os.path.join(exportfolder,
                                                         file)).st_mtime +
                                        tzoffset.total_seconds()),
                                ),
                                sizeof_fmt(
                                    os.stat(os.path.join(exportfolder,
                                                         file)).st_size),
                            ])

            context = RequestContext(request, {"filesexported": filesexported})

            template = Template("""
        {% load i18n %}
        <form role="form" method="post" action="{{request.prefix}}/execute/launch/exporttofolder/">{% csrf_token %}
          <table>
            <tr>
              <td style="vertical-align:top; padding-left: 15px">
                <button type="submit" class="btn btn-primary" id="exporttofolder" value="{% trans "export"|capfirst %}">{% trans "export"|capfirst %}</button>
              </td>
              <td colspan='5' style="padding-left: 15px;">
                <p>{% trans "Exports the plan (purchase orders, distribution orders and manufacturing orders) as a set of CSV files." %}</p>
              </td>
            </tr>
            <tr>
              <td></td>
              <td><strong>{% trans 'file name'|capfirst %}</strong></td>
              <td><strong>{% trans 'size'|capfirst %}</strong></td>
              <td><strong>{% trans 'changed'|capfirst %}</strong></td>
              <td></td>
              <td>
                <div class="btn btn-xs btn-danger deletefile" style="margin-bottom: 5px;" id="allexportfilesdelete" data-toggle="tooltip" data-placement="top" data-original-title="{% trans 'Delete all files' %}" onClick="deleteExportFile(1, {{filesexported}})">
                  <span class="fa fa-close"></span>
                </div>
              </td>
            </tr></form>
            {% for j in filesexported %}
            <tr data-file="{{j.0}}">
              <td></td>
              <td>{{j.0}}</td>
              <td>{{j.2}}</td>
              <td>{{j.1}}</td>
              <td>
                <div class="btn btn-xs btn-primary downloadfile" style="margin-bottom: 5px;" id="filedownload" data-toggle="tooltip" data-placement="top" data-original-title="Download file" onClick="downloadExportFile(1, '{{j.0}}')">
                  <span class="fa fa-arrow-down"></span>
                </div>
              </td>
              <td>
                <div class="btn btn-xs btn-danger deletefile" style="margin-bottom: 5px;" id="filedelete" data-toggle="tooltip" data-placement="top" data-original-title="Delete file from folder" onClick="deleteExportFile(1, '{{j.0}}')">
                  <span class="fa fa-close"></span>
                </div>
              </td>
            </tr>
            {% endfor %}
          </table>
        </form>
        <script>
        function deleteExportFile(folder, filename) {
          $.jgrid.hideModal("#searchmodfbox_grid");
          var dialogcontent;
          if (typeof filename === 'object') {
            dialogcontent = "{% trans 'You are about to delete all files' %}";
            var oldfilename = filename;
            filename = 'AllFiles';
          } else {
            dialogcontent = interpolate("{% trans 'You are about to delete file %s' %}", [filename]);
          }

          $("#popup").html('<div class="modal-dialog">'+
            '<div class="modal-content">'+
              '<div class="modal-header">'+
                '<h4 class="modal-title">{% trans 'Delete file' %}</h4>'+
              '</div>'+
              '<div class="modal-body"><p>'+
              dialogcontent +
              '</p></div>'+
              '<div class="modal-footer">'+
                '<input type="submit" id="confirmbutton" role="button" class="btn btn-danger pull-left" value="{% trans 'Confirm' %}">'+
                '<input type="submit" id="cancelbutton" role="button" class="btn btn-primary pull-right" data-dismiss="modal" value="{% trans 'Cancel' %}">'+
              '</div>'+
            '</div>'+
          '</div>' )
          .modal('show');

          $('#confirmbutton').on('click', function() {
            $.ajax({
              url: "{{request.prefix}}/execute/deletefromfolder/" + folder + "/" + filename + "/",
              type: ("delete").toUpperCase(),
              success: function () {
                if (filename === 'AllFiles') {
                  $("#popup .modal-body>p").text("{% trans 'All data files were deleted' %}");
                } else {
                  $("#popup .modal-body>p").text(interpolate("{% trans 'File %s was deleted' %}", [filename]));
                }
                $('#confirmbutton').hide();
                $('#cancelbutton').attr('value', "{% trans 'Close' %}");
                $('#cancelbutton').one('click', function() {location.reload();});
              },
              error: function (result, stat, errorThrown) {
                var filelist = result.responseText.split(' / ');
                var elem = $("#popup .modal-body>p");
                if (filelist.length === 1) {
                  elem.text(interpolate("{% trans 'File %s was not deleted' %}", [filename]));
                } else {
                  for (var i = 1; i < filelist.length; i++) {
                    if (i === 1) {
                      elem.text(interpolate("{% trans 'File %s was not deleted' }", [filelist[i]]));
                    } else {
                      elem.parent().append('<p>'+interpolate("{% trans "File %s was not deleted" %}", [filelist[i]])+'</p>');
                    }
                  }
                }
                $("#popup .modal-body>p").addClass('alert alert-danger');
                $('#confirmbutton').hide();
                $('#cancelbutton').attr('value', "{% trans 'Close' %}");
                $('#cancelbutton').one('click', function() {$("#popup").hide();});
                }
            })
          })
        }
        function downloadExportFile(folder, filename) {
          $.jgrid.hideModal("#searchmodfbox_grid");
          window.open("{{request.prefix}}/execute/downloadfromfolder/" + folder + "/" + filename + '/', '_blank');
        }
        </script>
        """)
            return template.render(context)
            # A list of translation strings from the above
            translated = (
                _("export"),
                _("file name"),
                _("size"),
                _("changed"),
                _("Delete all files"),
                _("Exports the plan (purchase orders, distribution orders and manufacturing orders) as a set of CSV files."
                  ),
                _("File %s was not deleted"),
                _("Close"),
                _("File %s was deleted"),
                _("All data files were deleted"),
                _("You are about to delete all files"),
                _("You are about to delete file %s"),
                _("Delete file"),
                _("Confirm"),
                _("Cancel"),
            )
        else:
            return None