示例#1
0
 def __init__(self, http_request):
     self.http_request = http_request
     if self.can_view():
         self.columns = self.get_columns()
         rows = http_request.GET.get('rows') or self.data_per_page
         self.filter_obj = Filter(self.http_request, self.filter_form,
                                  self.filter_handlers,
                                  self.other_filter_func, rows)
         all_data = self.get_all_data_cashed()
         self.filter_form, self.page_data = self.filter_obj.process_filter(
             all_data)
示例#2
0
class ObjectsManager(object):
    # private fields
    __metaclass__ = ManagerRegister
    __all_data_cashed = None

    manager_name = ""
    manager_verbose_name = ""
    filter_form = None
    filter_handlers = (
        ()
        # ('name_of_field', 'type_of_field', 'django_lookup')
        # type_of_field = str|bool|m2o|m2m|pdate
    )
    data_per_page = 10
    aggregation = False

    actions = []

    # view quality attributes
    height = 310
    auto_width = True

    def __init__(self, http_request):
        self.http_request = http_request
        if self.can_view():
            self.columns = self.get_columns()
            rows = http_request.GET.get('rows') or self.data_per_page
            self.filter_obj = Filter(self.http_request, self.filter_form,
                                     self.filter_handlers,
                                     self.other_filter_func, rows)
            all_data = self.get_all_data_cashed()
            self.filter_form, self.page_data = self.filter_obj.process_filter(
                all_data)

    def get_all_data(self):
        """
            این تابع باید داده ها را برای لیست کردن برگرداند
        """
        return []

    def get_all_data_cashed(self):
        if self.__all_data_cashed is None:
            self.__all_data_cashed = self.get_all_data()
        return self.__all_data_cashed

    def get_columns(self):
        columns = [
            # list of ManagerColumn
        ]
        return columns

    def can_view(self):
        """
            این تابع چک میکند که کاربر میتواند این صفحه را ببیند یا خیر
        """
        return True

    def render_main_list(self):
        if not self.can_view():
            raise Http404()
        c = {'manager': self}
        return render_to_response('manager/main.html',
                                  c,
                                  context_instance=RequestContext(
                                      self.http_request))

    def process_action_request(self):
        action_type = self.http_request.GET.get('t')
        if action_type == 'json':
            return self.process_json()
        elif action_type == 'action':
            return self.process_manages_actions()
        elif action_type == 'excel':
            return self.process_excel()
        raise Http404()

    def process_json(self):
        table = self._create_data_table(self.page_data)
        json = table.get_dgrid_json(self.filter_obj.total_pages,
                                    self.filter_obj.page_num,
                                    self.filter_obj.total_data,
                                    self.aggregation)
        return HttpResponse(json, mimetype='application/json')

    def process_manages_actions(self):
        action_name = self.http_request.GET.get('n')
        instances_id = self.http_request.GET.get('i')
        selected_instances = self._get_instances_by_ids(instances_id)
        for action in self.actions:
            if action.action_name == action_name:
                if action.is_view:
                    return action.action_view(self.http_request,
                                              selected_instances)
                else:
                    action.do(self.http_request, selected_instances)
                    return HttpResponse('OK')
        raise Http404()

    def _create_data_table(self, page_data, columns=None):
        id_columns = ManagerColumn('id', 'id', '0')
        if not columns:
            columns = [id_columns] + self.get_columns()
        table = Table()
        header = Header()
        for column in columns:
            header.create_cell(column.column_name, column.column_verbose_name,
                               column.column_width, column.aggregation)

        table.set_header(header)
        for data in page_data:
            row = Row()
            for column in columns:
                column_name = column.column_name
                if isinstance(data, models.Model) and isinstance(
                        data, Visitor) and column_name == 'id':
                    column_name = 'session_key'
                if column.is_variable:
                    function = getattr(self, 'get_' + column_name)
                    value = function(data)
                else:
                    value = getattr(data, column_name)
                if isinstance(value, bool):
                    if value is True:
                        value = u"بله"
                    else:
                        value = u"خیر"
                elif isinstance(value, date):
                    value = gregorian_to_jalali(value)
                elif isinstance(data, models.Model) and not column.is_variable:

                    if data.__class__._meta.get_field_by_name(
                            column_name)[0].choices:
                        value = getattr(data,
                                        'get_' + column_name + '_display')()
                if not isinstance(value, (SafeUnicode, SafeString)):
                    value = unicode(value)
                if value is None or value == 'None':
                    value = u"---"
                row.create_cell(column_name, value, column.column_width,
                                column.aggregation)
            table.add_row(row)
        return table

    def get_filter_form_content(self):
        return None

    def get_compiled_filter_form_content(self):
        content = self.get_filter_form_content()
        return Template(content).render(Context({'form': self.filter_form}))

    def _get_instances_by_ids(self, instances_id):
        if instances_id:
            try:
                instances_id = [int(x) for x in instances_id.split(',')]
            except ValueError:
                return []
            instances = []
            all_data = self.get_all_data_cashed()
            for data in all_data:
                if data.pk in instances_id:
                    instances.append(data)
            return instances
        return []

    def process_excel(self):
        import xlsxwriter
        import string

        try:
            import cStringIO as StringIO
        except ImportError:
            import StringIO

        columns = self.get_excel_columns()
        table = self._create_data_table(self.filter_obj.all_data, columns)

        output = StringIO.StringIO()
        workbook = xlsxwriter.Workbook(output)
        worksheet = workbook.add_worksheet()
        worksheet.right_to_left()

        bold = workbook.add_format({'bold': True})
        letters = list(string.uppercase)
        for case in string.uppercase:
            for case2 in string.uppercase:
                letters.append(case + case2)

        group_headers = self.get_group_headers()
        if group_headers:
            i = 2
            for group_header in group_headers:
                column_head_s = letters[i]
                column_head_f = letters[i - 1 + group_header.number_column]
                worksheet.merge_range(
                    column_head_s + '1:' + column_head_f + '1',
                    strip_tags(group_header.title), bold)
                i += group_header.number_column
            i = 1
            for cell in table.header:
                column_head = letters[i - 1]
                worksheet.set_column(column_head + ':' + column_head,
                                     int(cell.width) * 2)
                worksheet.write_string(1, i - 1, strip_tags(cell.value), bold)
                i += 1
        else:
            i = 1
            for cell in table.header:
                column_head = letters[i - 1]
                worksheet.set_column(column_head + ':' + column_head,
                                     int(cell.width) * 2)
                worksheet.write_string(0, i - 1, strip_tags(cell.value), bold)
                i += 1

        row_i = 1
        if group_headers:
            row_i = 2
        align_format = workbook.add_format({'align': 'right'})
        for row in table:
            cell_i = 0
            for cell in row:
                worksheet.write_string(row_i, cell_i, strip_tags(cell.value),
                                       align_format)
                cell_i += 1
            row_i += 1

        workbook.close()
        output.seek(0)
        response = HttpResponse(
            output.read(),
            mimetype=
            "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        )
        response[
            'Content-Disposition'] = "attachment; filename=%s.xlsx" % self.manager_name

        return response

    def other_filter_func(self, all_data, form):
        return all_data

    def get_excel_columns(self):
        return []

    def get_group_headers(self):
        return []