for obj in self.result_list: xf, attrs, value = lookup_field(self.x_field, obj, self) for i, yfname in enumerate(self.y_fields): yf, yattrs, yv = lookup_field(yfname, obj, self) datas[i]["data"].append((value, yv)) option = {'series': {'lines': {'show': True}, 'points': {'show': False}}, 'grid': {'hoverable': True, 'clickable': True}} try: xfield = self.opts.get_field(self.x_field) if type(xfield) in (models.DateTimeField, models.DateField, models.TimeField): option['xaxis'] = {'mode': "time", 'tickLength': 5} if type(xfield) is models.DateField: option['xaxis']['timeformat'] = "%y/%m/%d" elif type(xfield) is models.TimeField: option['xaxis']['timeformat'] = "%H:%M:%S" else: option['xaxis']['timeformat'] = "%y/%m/%d %H:%M:%S" except Exception: pass option.update(self.chart.get('option', {})) content = {'data': datas, 'option': option} result = json.dumps(content, cls=JSONEncoder, ensure_ascii=False) return HttpResponse(result) site.register_plugin(ChartsPlugin, ListAdminView) site.register_modelview(r'^chart/(.+)/$', ChartsView, name='%s_%s_chart')
# ft.seek(3) # ft.tell() # mycsv = PartyModel.import_data(ft) # print 'mycsv:',mycsv # datareader = csv.reader(ft) # print 'datareader',datareader # # line = f.readline() # # print line # for row in datareader: # print row if self.new_context['msg']: return self.get(request, *args, **kwargs) else: return HttpResponseRedirect('/xadmin/') site.register_modelview(r'^import/$', ImportAdminView, name='%s_%s_import') def process_import(request): print request.FILES if request.POST: f = request.FILES['file'] datareader = csv.reader(f) print datareader line = f.readline() print line for row in datareader: print row return HttpResponseRedirect('/xadmin/')
if not export_format: messages.warning(self.request, _('You must select an export format.')) else: formats = self.get_export_formats() file_format = formats[int(export_format)]() queryset = self.get_export_queryset(self.request, context) export_data = self.get_export_data(file_format, queryset, request=self.request) content_type = file_format.get_content_type() # Django 1.7 uses the content_type kwarg instead of mimetype try: response = HttpResponse(export_data, content_type=content_type) except TypeError: response = HttpResponse(export_data, mimetype=content_type) response['Content-Disposition'] = 'attachment; filename=%s' % ( self.get_export_filename(file_format), ) post_export.send(sender=None, model=self.model) return response site.register_modelview(r'^import/$', ImportView, name='%s_%s_import') site.register_modelview(r'^process_import/$', ImportProcessView, name='%s_%s_process_import') site.register_plugin(ImportMenuPlugin, ListAdminView) site.register_plugin(ExportMenuPlugin, ListAdminView) site.register_plugin(ExportPlugin, ListAdminView)
model, list_per_page=10, list_editable=[])(req) def has_perm(self): return True def context(self, context): list_view = self.list_view list_view.make_result_list() base_fields = list_view.base_list_display if len(base_fields) > 5: base_fields = base_fields[0:5] context['result_headers'] = [ c for c in list_view.result_headers().cells if c.field_name in base_fields ] context['results'] = [[ o for i, o in enumerate( filter(lambda c: c.field_name in base_fields, r.cells)) ] for r in list_view.results()] context['result_count'] = list_view.result_count context['page_url'] = self.bookmark.url site.register(Bookmark, BookmarkAdmin) site.register_plugin(BookmarkPlugin, ListAdminView) site.register_modelview(r'^bookmark/$', BookmarkView, name='%s_%s_bookmark')
return __() return _method def do_action(self, __, queryset): return self.revision_context_manager.create_revision(manage_manually=False)(self.do_action_func(__))() class ReversionAdmin(object): model_icon = "exchange" class VersionAdmin(object): model_icon = "file" site.register(Revision, ReversionAdmin) site.register(Version, VersionAdmin) site.register_modelview(r"^recover/$", RecoverListView, name="%s_%s_recoverlist") site.register_modelview(r"^recover/([^/]+)/$", RecoverView, name="%s_%s_recover") site.register_modelview(r"^([^/]+)/revision/$", RevisionListView, name="%s_%s_revisionlist") site.register_modelview(r"^([^/]+)/revision/([^/]+)/$", RevisionView, name="%s_%s_revision") site.register_plugin(ReversionPlugin, ListAdminView) site.register_plugin(ReversionPlugin, ModelFormAdminView) site.register_plugin(ReversionPlugin, DeleteAdminView) site.register_plugin(InlineRevisionPlugin, InlineModelAdmin) site.register_plugin(ActionRevisionPlugin, BaseActionView)
option['xaxis']['timeformat'] = "%y/%m/%d %H:%M:%S" except Exception: pass option.update(self.chart.get('option', {})) # print datas content = {'data': datas, 'option': option} result = json.dumps(content, cls=JSONEncoder, ensure_ascii=False) # print result return HttpResponse(result) site.register_plugin(ImportMenuPlugin, ListAdminView) site.register_plugin(ImportPlugin, ListAdminView) site.register_plugin(MyChartsPlugin, ListAdminView) site.register_modelview(r'^mychart/(.+)/$', MyChartsView, name='%s_%s_mychart') class InterfaceTestcaseAdmin(object): list_display = ('case_id', 'case_name', 'url', 'request_type', 'config', 'result', 'status_code', 'time', 'datetime') search_fields = ('case_id', 'case_name', 'url', 'request_type', 'result', 'state') list_editable = ['case_id', 'url', 'request_type', 'body'] show_detail_fields = ['case_name'] list_export = ['xls', 'json'] actions = [ RunAction, ]
if not has_view_perm: raise PermissionDenied export_format = self.request.GET.get('file_format') if not export_format: messages.warning(self.request, _('You must select an export format.')) else: formats = self.get_export_formats() file_format = formats[int(export_format)]() queryset = self.get_export_queryset(self.request, context) export_data = self.get_export_data(file_format, queryset, request=self.request) content_type = file_format.get_content_type() # Django 1.7 uses the content_type kwarg instead of mimetype try: response = HttpResponse(export_data, content_type=content_type) except TypeError: response = HttpResponse(export_data, mimetype=content_type) response['Content-Disposition'] = 'attachment; filename=%s' % ( self.get_export_filename(file_format), ) post_export.send(sender=None, model=self.model) return response site.register_modelview(r'^import/$', ImportView, name='%s_%s_import') site.register_modelview(r'^process_import/$', ImportProcessView, name='%s_%s_process_import') site.register_plugin(ImportMenuPlugin, ListAdminView) site.register_plugin(ExportMenuPlugin, ListAdminView) site.register_plugin(ExportPlugin, ListAdminView)
@filter_hook @csrf_protect_m @dutils.commit_on_success def post(self, request, object_id): model_fields = [f.name for f in self.opts.fields] fields = [f for f in request.POST.keys() if f in model_fields] defaults = { "form": forms.ModelForm, "fields": fields, "formfield_callback": self.formfield_for_dbfield, } form_class = modelform_factory(self.model, **defaults) form = form_class( instance=self.org_obj, data=request.POST, files=request.FILES) result = {} if form.is_valid(): form.save(commit=True) result['result'] = 'success' result['new_data'] = form.cleaned_data result['new_html'] = dict( [(f, self.get_new_field_html(f)) for f in fields]) else: result['result'] = 'error' result['errors'] = JsonErrorDict(form.errors, form).as_json() return self.render_response(result) site.register_plugin(EditablePlugin, ListAdminView) site.register_modelview(r'^(.+)/patch/$', EditPatchView, name='%s_%s_patch')
from website import IndexView, LoginView, LogoutView, UserSettingView __all__ = ('BaseAdminObject', 'BaseAdminPlugin', 'BaseAdminView', 'CommAdminView', 'ModelAdminView', 'ListAdminView', 'ModelFormAdminView', 'CreateAdminView', 'UpdateAdminView', 'DeleteAdminView', 'DetailAdminView', 'Dashboard', 'BaseWidget', 'IndexView', 'LoginView', 'LogoutView') # admin site-wide views site.register_view(r'^$', IndexView, name='index') site.register_view(r'^login/$', LoginView, name='login') site.register_view(r'^logout/$', LogoutView, name='logout') site.register_view(r'^settings/user$', UserSettingView, name='user_settings') site.register_modelview(r'^$', ListAdminView, name='%s_%s_changelist') site.register_modelview(r'^add/$', CreateAdminView, name='%s_%s_add') site.register_modelview(r'^(.+)/delete/$', DeleteAdminView, name='%s_%s_delete') site.register_modelview(r'^(.+)/update/$', UpdateAdminView, name='%s_%s_change') site.register_modelview(r'^(.+)/detail/$', DetailAdminView, name='%s_%s_detail') site.register_modelview(r'^(.+)/dashboard/$', ModelDashboard, name='%s_%s_dashboard') site.set_loginview(LoginView)
nodes.append(save_node) def get_media(self, media): if self.is_list_sortable: media = media + self.vendor('xadmin.plugin.sortablelist.js') return media class SaveOrderView(ModelAdminView): @csrf_protect_m @transaction.atomic def post(self, request): order_objs = request.POST.getlist("order[]") for order_value, pk in enumerate(order_objs, start=1): self.save_order(pk, order_value) return self.render_response({}) def save_order(self, pk, order_value): obj = self.model.objects.get(pk=pk) order_field = self.list_order_field is_order_changed = lambda x: getattr(x, order_field) != order_value if is_order_changed(obj): setattr(obj, order_field, order_value) obj.save() site.register_plugin(SortableListPlugin, ListAdminView) site.register_modelview(r'^save-order/$', SaveOrderView, name='%s_%s_save_order')
for field in self.batch_create_fields: data[field] = request.REQUEST.get(field).split('\n') max_len = max(len(data[field]), max_len) for i in range(max_len): item_data = {} try: for field in self.batch_create_fields: item_data[field] = data[field][i] except: logging.error('get form data fail', exc_info=True) break try: request.POST = item_data self.instance_forms() self.setup_forms() if self.form_obj.is_valid(): self.form_obj.save() self.new_create += 1 else: logging.error('invalid data %s error %s', item_data, self.form_obj.errors) self.create_error += 1 except Exception, e: logging.error('create error %s', e, exc_info=True) self.create_error += 1 self.message_user('new create %s, error %s' % (self.new_create, self.create_error)) return self.ajax_success() site.register_modelview(r'^bulkcreate/$', BulkCreateView, name='%s_%s_bulkcreate')
) nodes.append(save_node) def get_media(self, media): if self.is_list_sortable: media = media + self.vendor("xadmin.plugin.sortablelist.js") return media class SaveOrderView(ModelAdminView): @csrf_protect_m @transaction.atomic def post(self, request): order_objs = request.POST.getlist("order[]") for order_value, pk in enumerate(order_objs, start=1): self.save_order(pk, order_value) return self.render_response({}) def save_order(self, pk, order_value): obj = self.model.objects.get(pk=pk) order_field = self.list_order_field is_order_changed = lambda x: getattr(x, order_field) != order_value if is_order_changed(obj): setattr(obj, order_field, order_value) obj.save() site.register_plugin(SortableListPlugin, ListAdminView) site.register_modelview(r"^save-order/$", SaveOrderView, name="%s_%s_save_order")
"clickable": True }, } try: xfield = self.opts.get_field(self.x_field) if type(xfield) in ( models.DateTimeField, models.DateField, models.TimeField, ): option["xaxis"] = {"mode": "time", "tickLength": 5} if type(xfield) is models.DateField: option["xaxis"]["timeformat"] = "%y/%m/%d" elif type(xfield) is models.TimeField: option["xaxis"]["timeformat"] = "%H:%M:%S" else: option["xaxis"]["timeformat"] = "%y/%m/%d %H:%M:%S" except Exception: pass option.update(self.chart.get("option", {})) content = {"data": datas, "option": option} result = json.dumps(content, cls=JSONEncoder, ensure_ascii=False) return HttpResponse(result) site.register_plugin(ChartsPlugin, ListAdminView) site.register_modelview(r"^chart/(.+)/$", ChartsView, name="%s_%s_chart")
t = template.Template(s) c = template.Context({"form": form, "action_url": self.model_admin_url("patch", self.org_obj.pk)}) return HttpResponse(t.render(c)) @filter_hook @csrf_protect_m @transaction.atomic def post(self, request, object_id): model_fields = [f.name for f in self.opts.fields] fields = [f for f in request.POST.keys() if f in model_fields] defaults = {"form": self.form, "fields": fields, "formfield_callback": self.formfield_for_dbfield} form_class = modelform_factory(self.model, **defaults) form = form_class(instance=self.org_obj, data=request.POST, files=request.FILES) result = {} if form.is_valid(): form.save(commit=True) result["result"] = "success" result["new_data"] = form.cleaned_data result["new_html"] = dict([(f, self.get_new_field_html(f)) for f in fields]) else: result["result"] = "error" result["errors"] = JsonErrorDict(form.errors, form).as_json() return self.render_response(result) site.register_plugin(EditablePlugin, ListAdminView) site.register_modelview(r"^(.+)/patch/$", EditPatchView, name="%s_%s_patch")
class ReversionAdmin(object): model_icon = "fa fa-exchange" list_display = ("__str__", "date_created", "user", "comment") list_display_links = ("__str__", ) list_filter = ("date_created", "user") inlines = [VersionInline] site.register(Revision, ReversionAdmin) site.register_modelview(r"^recover/$", RecoverListView, name="%s_%s_recoverlist") site.register_modelview(r"^recover/([^/]+)/$", RecoverView, name="%s_%s_recover") site.register_modelview(r"^([^/]+)/revision/$", RevisionListView, name="%s_%s_revisionlist") site.register_modelview(r"^([^/]+)/revision/([^/]+)/$", RevisionView, name="%s_%s_revision") site.register_plugin(ReversionPlugin, ListAdminView) site.register_plugin(ReversionPlugin, ModelFormAdminView) site.register_plugin(ReversionPlugin, DeleteAdminView)
model = Version extra = 0 style = 'accordion' class ReversionAdmin(object): model_icon = 'fa fa-exchange' list_display = ('__str__', 'date_created', 'user', 'comment') list_display_links = ('__str__',) list_filter = ('date_created', 'user') inlines = [VersionInline] site.register(Revision, ReversionAdmin) site.register_modelview( r'^recover/$', RecoverListView, name='%s_%s_recoverlist') site.register_modelview( r'^recover/([^/]+)/$', RecoverView, name='%s_%s_recover') site.register_modelview( r'^([^/]+)/revision/$', RevisionListView, name='%s_%s_revisionlist') site.register_modelview( r'^([^/]+)/revision/([^/]+)/$', RevisionView, name='%s_%s_revision') site.register_plugin(ReversionPlugin, ListAdminView) site.register_plugin(ReversionPlugin, ModelFormAdminView) site.register_plugin(ReversionPlugin, DeleteAdminView) site.register_plugin(InlineRevisionPlugin, InlineModelAdmin) site.register_plugin(ActionRevisionPlugin, BaseActionView)
if not self.title: self.title = unicode(bookmark) req = self.make_get_request("", data.items()) self.list_view = self.get_view_class(ListAdminView, model, list_per_page=10, list_editable=[])(req) def has_perm(self): return True def context(self, context): list_view = self.list_view list_view.make_result_list() base_fields = list_view.base_list_display if len(base_fields) > 5: base_fields = base_fields[0:5] context["result_headers"] = [c for c in list_view.result_headers().cells if c.field_name in base_fields] context["results"] = [ [o for i, o in enumerate(filter(lambda c: c.field_name in base_fields, r.cells))] for r in list_view.results() ] context["result_count"] = list_view.result_count context["page_url"] = self.bookmark.url site.register(Bookmark, BookmarkAdmin) site.register_plugin(BookmarkPlugin, ListAdminView) site.register_modelview(r"^bookmark/$", BookmarkView, name="%s_%s_bookmark")
def get_media(self, media): if self.is_list_sortable: media = media + self.vendor('xadmin.plugin.sortablelist.js') return media class SaveOrderView(ModelAdminView): @csrf_protect_m @transaction.atomic def post(self, request): order_objs = request.POST.getlist("order[]") for order_value, pk in enumerate(order_objs, start=1): self.save_order(pk, order_value) return self.render_response({}) def save_order(self, pk, order_value): obj = self.model.objects.get(pk=pk) order_field = self.list_order_field is_order_changed = lambda x: getattr(x, order_field) != order_value if is_order_changed(obj): setattr(obj, order_field, order_value) obj.save() site.register_plugin(SortableListPlugin, ListAdminView) site.register_modelview(r'^save-order/$', SaveOrderView, name='%s_%s_save_order')
context = super(UnityAttentionsAdmin, self).get_context() context.update({'edit_url': '/service/article/%d/update' % index, 'delete_url': '/service/article/%d/delete' % index}) return context class ReleaseLogAdmin(BaseHelperAdmin): @filter_hook def get_context(self): index = 1 try: self.article_obj = Article.objects.get(id=index) except Exception as e: print(e) self.article_obj = None context = super(ReleaseLogAdmin, self).get_context() context.update({'edit_url': '/service/article/%d/update' % index, 'delete_url': '/service/article/%d/delete' % index}) return context xadmin.site.register(Article, ArticleAdmin) xadmin.site.register(UnityHelper, UnityHelperAdmin) xadmin.site.register(UnityAttentions, UnityAttentionsAdmin) xadmin.site.register(ReleaseLog, ReleaseLogAdmin) site.register_modelview(r'^(.+)/view/$', ViewArticleAdmin, name='%s_%s_view')
def register_builtin_views(site): from xadmin import views site.register_view(r'^$', views.IndexView, name='index') site.register_view(r'^login/$', views.LoginView, name='login') site.register_view(r'^logout/$', views.LogoutView, name='logout') site.register_view(r'^settings/user$', views.UserSettingView, name='user_settings') site.register_modelview(r'^$', views.ListAdminView, name='%s_%s_changelist') site.register_modelview(r'^add/$', views.CreateAdminView, name='%s_%s_add') site.register_modelview(r'^(.+)/delete/$', views.DeleteAdminView, name='%s_%s_delete') site.register_modelview(r'^(.+)/update/$', views.UpdateAdminView, name='%s_%s_change') site.register_modelview(r'^(.+)/detail/$', views.DetailAdminView, name='%s_%s_detail') site.register_modelview(r'^(.+)/dashboard/$', views.ModelDashboard, name='%s_%s_dashboard') site.set_loginview(views.LoginView)
if not self.title: self.title = unicode(bookmark) req = self.make_get_request("", data.items()) self.list_view = self.get_view_class( ListAdminView, model, list_per_page=10, list_editable=[])(req) def has_perm(self): return True def context(self, context): list_view = self.list_view list_view.make_result_list() base_fields = list_view.base_list_display if len(base_fields) > 5: base_fields = base_fields[0:5] context['result_headers'] = [c for c in list_view.result_headers( ).cells if c.field_name in base_fields] context['results'] = [[o for i, o in enumerate(filter(lambda c:c.field_name in base_fields, r.cells))] for r in list_view.results()] context['result_count'] = list_view.result_count context['page_url'] = self.bookmark.url site.register(Bookmark, BookmarkAdmin) site.register_plugin(BookmarkPlugin, ListAdminView) site.register_modelview(r'^bookmark/$', BookmarkView, name='%s_%s_bookmark')
@filter_hook @csrf_protect_m @transaction.atomic def post(self, request, object_id): model_fields = [f.name for f in self.opts.fields] fields = [f for f in request.POST.keys() if f in model_fields] defaults = { "form": self.form, "fields": fields, "formfield_callback": self.formfield_for_dbfield, } form_class = modelform_factory(self.model, **defaults) form = form_class(instance=self.org_obj, data=request.POST, files=request.FILES) result = {} if form.is_valid(): form.save(commit=True) result["result"] = "success" result["new_data"] = form.cleaned_data result["new_html"] = dict([(f, self.get_new_field_html(f)) for f in fields]) else: result["result"] = "error" result["errors"] = JsonErrorDict(form.errors, form).as_json() return self.render_response(result) site.register_plugin(EditablePlugin, ListAdminView) site.register_modelview(r"^(.+)/patch/$", EditPatchView, name="%s_%s_patch")
from delete import DeleteAdminView from detail import DetailAdminView from dashboard import Dashboard, BaseWidget, widget_manager, ModelDashboard from website import IndexView, LoginView, LogoutView, UserSettingView __all__ = ( 'BaseAdminObject', 'BaseAdminPlugin', 'BaseAdminView', 'CommAdminView', 'ModelAdminView', 'ListAdminView', 'ModelFormAdminView', 'CreateAdminView', 'UpdateAdminView', 'DeleteAdminView', 'DetailAdminView', 'Dashboard', 'BaseWidget', 'IndexView', 'LoginView', 'LogoutView' ) # admin site-wide views site.register_view(r'^$', IndexView, name='index') site.register_view(r'^login/$', LoginView, name='login') site.register_view(r'^logout/$', LogoutView, name='logout') site.register_view(r'^settings/user$', UserSettingView, name='user_settings') site.register_modelview(r'^$', ListAdminView, name='%s_%s_changelist') site.register_modelview(r'^add/$', CreateAdminView, name='%s_%s_add') site.register_modelview( r'^(.+)/delete/$', DeleteAdminView, name='%s_%s_delete') site.register_modelview( r'^(.+)/update/$', UpdateAdminView, name='%s_%s_change') site.register_modelview( r'^(.+)/detail/$', DetailAdminView, name='%s_%s_detail') site.register_modelview( r'^(.+)/dashboard/$', ModelDashboard, name='%s_%s_dashboard')
model, list_per_page=10, list_editable=[])(req) def has_perm(self): return True def context(self, context): list_view = self.list_view list_view.make_result_list() base_fields = list_view.base_list_display if len(base_fields) > 5: base_fields = base_fields[0:5] context["result_headers"] = [ c for c in list_view.result_headers().cells if c.field_name in base_fields ] context["results"] = [[ o for i, o in enumerate( filter(lambda c: c.field_name in base_fields, r.cells)) ] for r in list_view.results()] context["result_count"] = list_view.result_count context["page_url"] = self.bookmark.url site.register(Bookmark, BookmarkAdmin) site.register_plugin(BookmarkPlugin, ListAdminView) site.register_modelview(r"^bookmark/$", BookmarkView, name="%s_%s_bookmark")
@transaction.atomic def post(self, request, object_id): model_fields = [f.name for f in self.opts.fields] fields = [f for f in request.POST.keys() if f in model_fields] defaults = { "form": self.form, "fields": fields, "formfield_callback": self.formfield_for_dbfield, } form_class = modelform_factory(self.model, **defaults) form = form_class(instance=self.org_obj, data=request.POST, files=request.FILES) result = {} if form.is_valid(): form.save(commit=True) result['result'] = 'success' result['new_data'] = form.cleaned_data result['new_html'] = dict([(f, self.get_new_field_html(f)) for f in fields]) else: result['result'] = 'error' result['errors'] = JsonErrorDict(form.errors, form).as_json() return self.render_response(result) site.register_plugin(EditablePlugin, ListAdminView) site.register_modelview(r'^(.+)/patch/$', EditPatchView, name='%s_%s_patch')
return _method def do_action(self, __, queryset): return self.revision_context_manager.create_revision(manage_manually=False)(self.do_action_func(__))() class ReversionAdmin(object): model_icon = 'exchange' class VersionAdmin(object): model_icon = 'file' site.register(Revision, ReversionAdmin) site.register(Version, VersionAdmin) site.register_modelview( r'^recover/$', RecoverListView, name='%s_%s_recoverlist') site.register_modelview( r'^recover/([^/]+)/$', RecoverView, name='%s_%s_recover') site.register_modelview( r'^([^/]+)/revision/$', RevisionListView, name='%s_%s_revisionlist') site.register_modelview( r'^([^/]+)/revision/([^/]+)/$', RevisionView, name='%s_%s_revision') site.register_plugin(ReversionPlugin, ListAdminView) site.register_plugin(ReversionPlugin, ModelFormAdminView) site.register_plugin(ReversionPlugin, DeleteAdminView) site.register_plugin(InlineRevisionPlugin, InlineModelAdmin) site.register_plugin(ActionRevisionPlugin, BaseActionView)
# ft = open(tmp_file,'r') # ft.seek(3) # ft.tell() # mycsv = PartyModel.import_data(ft) # print 'mycsv:',mycsv # datareader = csv.reader(ft) # print 'datareader',datareader # # line = f.readline() # # print line # for row in datareader: # print row if self.new_context['msg']: return self.get(request,*args,**kwargs) else: return HttpResponseRedirect('/xadmin/') site.register_modelview(r'^import/$',ImportAdminView,name='%s_%s_import') def process_import(request): print request.FILES if request.POST: f = request.FILES['file'] datareader = csv.reader(f) print datareader line = f.readline() print line for row in datareader: print row return HttpResponseRedirect('/xadmin/')