class CourseRunGradeAuditAdmin(TimestampedModelAdmin): """Admin for CourseRunGradeAudit""" model = CourseRunGradeAudit include_created_on_in_list = True list_display = ( "id", "course_run_grade_id", "get_user_email", "get_run_courseware_id", ) readonly_fields = get_field_names(CourseRunGradeAudit) def get_user_email(self, obj): """Returns the related User email""" return obj.course_run_grade.user.email get_user_email.short_description = "User Email" get_user_email.admin_order_field = "course_run_grade__user__email" def get_run_courseware_id(self, obj): """Returns the related CourseRun courseware_id""" return obj.course_run_grade.course_run.courseware_id get_run_courseware_id.short_description = "Course Run" get_run_courseware_id.admin_order_field = ( "course_run_grade__course_run__courseware_id") def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False
class OrderAdmin(AuditableModelAdmin, TimestampedModelAdmin): """Admin for Order""" model = Order include_created_on_in_list = True list_filter = ("status", ) list_display = ("id", "purchaser", "status", "created_on") search_fields = ("purchaser__username", "purchaser__email") readonly_fields = [ name for name in get_field_names(Order) if name != "status" ] def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False def save_model(self, request, obj, form, change): """ Saves object and logs change to object """ super().save_model(request, obj, form, change) sync_hubspot_deal(obj)
class ProgramEnrollmentAuditAdmin(TimestampedModelAdmin): """Admin for ProgramEnrollmentAudit""" model = ProgramEnrollmentAudit include_created_on_in_list = True list_display = ("id", "enrollment_id", "get_program_readable_id", "get_user") readonly_fields = get_field_names(ProgramEnrollmentAudit) def get_program_readable_id(self, obj): """Returns the related Program readable_id""" return obj.enrollment.program.readable_id get_program_readable_id.short_description = "Program" get_program_readable_id.admin_order_field = "enrollment__program__readable_id" def get_user(self, obj): """Returns the related User's email""" return obj.enrollment.user.email get_user.short_description = "User" get_user.admin_order_field = "enrollment__user__email" def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False
class LineRunSelectionAdmin(admin.ModelAdmin): """Admin for LineRunSelection""" model = LineRunSelection list_display = ("id", "line", "get_order", "get_run_courseware_id") readonly_fields = get_field_names(LineRunSelection) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False def get_order(self, obj): """Returns the related Order""" return obj.line.order get_order.short_description = "Order" get_order.admin_order_field = "line__order" def get_run_courseware_id(self, obj): """Returns the courseware_id of the associated CourseRun""" return obj.run.courseware_id get_run_courseware_id.short_description = "Run Courseware Id" get_run_courseware_id.admin_order_field = "run__courseware_id"
class ProductVersionInline(admin.StackedInline): """Inline form for ProductVersion""" model = ProductVersion readonly_fields = get_field_names(ProductVersion) extra = 0 show_change_link = True can_delete = False ordering = ("-created_on", ) min_num = 0
class CouponPaymentVersionInline(admin.StackedInline): """Admin Inline for CouponPaymentVersion objects""" model = CouponPaymentVersion readonly_fields = get_field_names(CouponPaymentVersion) extra = 0 show_change_link = True can_delete = False ordering = ("-created_on", ) min_num = 0
def test_get_field_names(): """ Assert that get_field_names does not include related fields """ assert set(get_field_names(Order)) == { "purchaser", "status", "created_on", "updated_on", "total_price_paid", }
class ExportsInquiryLogAdmin(admin.ModelAdmin): """Admin for ExportsInquiryLog""" model = ExportsInquiryLog search_fields = [ "user__email", "computed_result", "info_code", "reason_code" ] list_filter = [ "computed_result", "info_code", "reason_code", "user__legal_address__country", ] list_display = [ "user", "computed_result", "info_code", "reason_code", "country" ] list_select_related = ["user__legal_address"] readonly_fields = [] if settings.DEBUG else get_field_names( ExportsInquiryLog) actions = ["manually_approve_inquiry"] def country(self, instance): """Get country name from ISO Alpha-2 country code""" country = pycountry.countries.get( alpha_2=instance.user.legal_address.country) return country.name if country else "N/A" def manually_approve_inquiry(self, request, queryset): """Admin action to manually approve export compliance inquiry records""" eligible_objects = queryset.exclude( computed_result__in=[RESULT_MANUALLY_APPROVED, RESULT_SUCCESS]) for obj in eligible_objects: ensure_active_user(obj.user) eligible_objects.update(computed_result=RESULT_MANUALLY_APPROVED) manually_approve_inquiry.short_description = "Manually approve selected records" def has_add_permission(self, request): # We want to allow this while debugging return settings.DEBUG def has_delete_permission(self, request, obj=None): # We want to allow this while debugging return settings.DEBUG
class OrderAuditAdmin(TimestampedModelAdmin): """Admin for OrderAudit""" model = OrderAudit include_created_on_in_list = True list_display = ("id", "order_id", "get_order_user") readonly_fields = get_field_names(OrderAudit) def get_order_user(self, obj): """Returns the related Order's user email""" return obj.order.purchaser.email get_order_user.short_description = "User" get_order_user.admin_order_field = "order__purchaser__email" def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False
class ProgramRunLineAdmin(admin.ModelAdmin): """Admin for ProgramRunLine""" model = ProgramRunLine list_display = ("id", "line", "get_order", "program_run") readonly_fields = get_field_names(ProgramRunLine) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False def get_order(self, obj): """Returns the related Order""" return obj.line.order get_order.short_description = "Order" get_order.admin_order_field = "line__order"
class LineAdmin(admin.ModelAdmin): """Admin for Line""" model = Line list_display = ("id", "order", "get_product_version_text_id", "quantity") search_fields = ("order__id", "product_version__text_id") readonly_fields = get_field_names(Line) def has_add_permission(self, request): return False def has_delete_permission(self, request, obj=None): return False def get_product_version_text_id(self, obj): """Returns the related ProductVersion text_id""" return obj.product_version.text_id get_product_version_text_id.short_description = "Product Object Text Id" get_product_version_text_id.admin_order_field = "product_version__text_id"
def filter_for_model_fields(model_cls, dict_to_filter): """Filters a dict to return only the keys that match fields in a model class""" model_field_names = get_field_names(model_cls) return filter_dict_by_key_set(dict_to_filter, model_field_names)